ATENTAMENTE O SEGUINTE: NORMAS: 1) O exame tem a duração de 150 minutos. 2) O exame é feito SEM CONSULTA. 3) Deve assinalar todas as opções tomadas: no código dos seus programas, todas as constantes, variáveis, procedimentos ou funções devem ser devidamente explicadas através de comentário. 4) As respostas, que embora, sintáctica e semanticamente correctas, se apresentem pouco estruturadas serão severamente penalizadas, ou não consideradas. 5) As respostas de conteúdo inadequado não serão consideradas. 6) As respostas sem justificação serão fortemente penalizadas. INFORMAÇÕES: 1) Antes de começar a responder, leia todo o enunciado. Verifique se o exemplar está completo, isto é, se tem 7 páginas numeradas e termina com a palavra FIM . 2) No caso de o exemplar que lhe foi distribuído estar incompleto, ou tiver qualquer falha, dirijase ao professor vigilante, a fim de resolver o problema. 3) Qualquer aspecto que considere menos claro deverá ser explicado em comentário no código. A clareza da sua solução, o seu rigor científico e legibilidade constituem critérios de avaliação de máxima importância.
4) O exame é constituído por quatro questões a primeira com quatro alíneas, a segunda com três alíneas, a terceira questão com três alíneas e a quarta questão com uma alínea. 5) Em caso de dúvida ou omissão resultante do enunciado de exame, a sua interpretação, quando devidamente explicada e enquadrada nos objectivos de avaliação da questão em causa, será considerada na avaliação da sua resposta. Bom Trabalho!
1º Problema (5 Valores)
Considere a classe Pessoa a seguir definida: class Pessoa
{
private:
enum proficiencia {Excelente=4, Bom=3, Razoavel=2, Fraco=1}; std::string nome; // Nome da Pessoa
int sexo; // Sexo da pessoa: 0 corresponde a mulher, 1 a homem std::string* linguas; // Línguas que a pessoa fala
proficiencia *nivel; // Nivel de proficiência em cada uma das línguas int numero; // Numero de línguas que a pessoa fala
public: Pessoa();
Pessoa(std::string onome, int osexo); virtual ~Pessoa();
virtual std::string Nome() const; // Para obter o nome da Pessoa
virtual std::string Lingua(int n) const; /*Para obter a n-ésima língua que a pessoa fala */
virtual int Nivel(int n) const; /* Para obter o nível de proficiência da pessoa com a sua n-ésima língua */
virtual void NovaLingua(std::string x, proficiencia n); /* Registar ou actualiza que a pessoa fala a língua x, com nível n */
virtual int NumLinguas() const;
virtual int Fala(std::string x); /* Devolve o nível com que a pessoa fala a língua x, ou zero, se não falar */
};
a) Implemente os construtores e o destrutor da classe. Espaço de resposta à questão 1a)
Pessoa: :Pessoa() {}
Pessoa: :Pessoa(std : : s t r i ng onome, int osexo): nome(onome),
sexo(osexo) , numero(0) ,
l inguas(new std: : s t r i ng [10] ) , nivel (new prof i c i enc ia [10] ) {}
Pessoa: :~Pessoa() {
delete [] l inguas; delete [] nivel ; }
virtual std::string Lingua(int n) const; virtual int Nivel(int n) const;
virtual int NumLinguas() const; Espaço de resposta à questão 1b)
std: : s t r i ng Pessoa: :L ingua( in t n) const {
return l inguas[n] ; }
int Pessoa: :N ive l ( i n t n) const {
return nivel [n ] ; }
int Pessoa: :NumLinguas() const {
return numero; }
c) Defina o modificador
virtual void NovaLingua(std::string x, proficiencia n); Espaço de resposta à questão 1c)
void Pessoa: :NovaLingua(std: : s t r i ng x, prof i c i enc ia n) { l inguas[numero]=x; nivel [numero]=n; numero++; } d) Defina o método:
virtual int Fala(std::string x); Espaço de resposta à questão 1d)
int Pessoa: :Fa la (s td : : s t r i ng x) {
for( in t i=0; i<numero; i++) i f ( l i nguas[ i ]==x)
return nivel [ i ] ; return 0; }
2º Problema (6 Valores)
Implemente em C++ uma classe Atleta, derivada de Pessoa, para representar Atletas Olímpicos. O construtor especifica o objecto da classe de base, a altura em centímetros, e o peso em kilos. Pretendese guardar os anos das olimpíadas em que o atleta participou (um elemento do tipo std::vector<int>). A classe oferece selectores Altura (),
Peso () eNumOlimpiadas () para a altura, peso e para indicar o número de olimpíadas em
que o atleta participou. Inclua o modificador Olimpíada (int ano) para indicar que o atleta participou numa olimpíada naquele ano. Implemente também um método booleano ParticipouOlimpiada (int ano), que indica se o atleta participou numa olimpíada naquele ano.
a) Implemente a declaração da classe: Espaço de resposta à questão 2a) class Atleta : publ ic Pessoa { private : f loat peso; int altura ; std: :vector<int> ol impiadas; publ ic : Atleta( ) ;
Atleta(s td : : s t r i ng onome, f loat osexo, in t opeso, f loat aaltura) ;
vir tua l ~Atleta( ) ;
vir tua l f loat Peso() const; vir tua l int Altura( ) const;
vir tua l void Olimpiada( in t ano);
vir tua l bool Part ic ipouOl impiada( in t ano); vir tua l int NumOlimpiadas() const;
};
b) Implemente o construtor, destrutor e selectores da classe. Espaço de resposta à questão 2b)
Atleta : :A t l e ta ( ) {}
Atleta : :A t l e ta ( s td : : s t r i ng onome, int osexo,f l oa t opeso, in t aaltura) : Pessoa(onome,osexo) , peso(opeso) , altura(aa l tu ra ) {} Atleta : :~At le ta ( ) {}
return peso; }
int Atleta : :A l tu ra ( ) const {
return altura ; }
int Atleta : :NumOlimpiadas() const {
return ol impiadas.s i ze ( ) ; }
c) Implemente o modificador e o método ParticipouOlimpiada(int ano) Espaço de resposta à questão 2c)
bool Atleta : :Pa r t i c i pouOl impiada( in t ano) {
for( in t i=0; i<ol impiadas.s i ze ( ) ; i++) i f ( o l impiadas[ i ]==ano) return true; return fa lse ;
}
void Atleta : :O l impiada( in t ano) {
ol impiadas.push_back(ano) ; }
3º Problema (5 Valores) Considere a classe Pais para representar Países participantes nos jogos Olímpicos, cuja definição é a seguinte: class Pais { private:
std::string nome; // Nome do Pais Atleta* atletas; // Atletas desse Pais
int** medalhas; /* Número de medalhas ganhas pelo atleta (ouro, prata e bronze) */
int count; // Número de atletas actual public:
Pais();
Pais(std::string onome); virtual ~Pais();
virtual std::string Nome() const; virtual int NumAtletas() const;
virtual void AdicionaAtleta(const Atleta& atl, int ouro, int prata, int bronze); virtual int NumMedalhas(std::string nomeAtleta);
virtual std::string MaisMedalhado(); }; a) Implemente o construtor e o destrutor da classe sabendo que não existe mais de 1000 atletas por Pais, e que o vector de vectores medalhas acompanha o vector atletas. Sendo assim o atleta na posição i do vector atletas terá as suas medalhas de ouro em medalhas[i][0], as de prata em medalhas[i][1] e as de bronze em medalhas de [i][2]. Espaço de resposta à questão 3a) Pais : : Pa i s ( ) {} Pais : : Pa i s ( s td : : s t r i ng onome): nome(onome), count(0) ,
atle tas (new Atleta[100]) {
medalhas= new int* [100] ; for( in t i=0; i<100; i++) medalhas[ i ]=new int [3] ; }
delete [] atle tas ;
for ( in t i=0; i<100; i++) delete [] medalhas; }
b) Implemente o método seguinte, para adicionar um novo atleta, e respectivas medalhas já conquistadas.
virtual void AdicionaAtleta(const Atleta& atl, int ouro, int prata, int bronze); Espaço de resposta à questão 3b)
void Pais : :Ad ic ionaAt le ta (const Atleta& atl , int ouro, int prata,
int bronze) {
atle tas [count]= atl ; medalhas[count] [0]=ouro; medalhas[count] [1]=prata; medalhas[count] [2]=bronze; count++; } c) Implemente o método seguinte, para devolver o nome do atleta com maior número de medalhas conquistadas.
virtual std::string MaisMedalhado(); Espaço de resposta à questão 3c)
std: : s t r i ng Pais : :MaisMedalhado() {
int index=0; int max=0;
for( in t i=0; i<count; i++) {
int soma=medalhas[ i ] [ 0 ]+medalhas[ i ] [ 1 ]+medalhas[ i ] [ 2 ] ; i f (soma>max) { max=soma; index=i;}
}
return atle tas [ index] .Nome() ; }
4º Problema (4 Valores)
Considere a classe IntList, estudada no livro da cadeira, para a manipulação de uma Lista de inteiros ordenados e sem repetições.
class IntList {
struct IntNode {// Classe interna para os nós da lista. int data;
IntNode* ptNext;
IntNode(int n) { data = n; }// Construtor com int n. };
IntNode* ptList; // Apontador para o primeiro nodo. bool find(int v, IntNode *&prev, IntNode *&curr) const; // Inviabilizar a construção por cópia e a afectação. IntList (const IntList&) {} // Construtor por cópia. void operator=(const IntList &) {} // Afectação. public:
IntList();// Iniciar a lista.
~IntList() { removeAll(); } // Destruir todos os nós. bool insert(int val); // Inserir ordenado.
bool remove(int val); // Remover se existir. int removeHead(); // Remover o 1º nodo da lista. bool contain(int val) const; // Testar se existe val. void display() const; // Apresenta os elementos. bool isEmpty() const; // Testar se lista está vazia. void removeAll(); // Remover todos os elementos. }; a) Implemente um método inverter a ordem dos elementos da lista void Invert(); Espaço de resposta à questão 4a) void IntL i s t : : i n ve r t ( ) {
IntL i s t * l1 = new IntL i s t ( ) ; l1- >ptLis t=NULL;
while(ptL i s t != NULL) {
int valor=removeHead() ;
IntNode* n = new IntNode(valor ) ; n- >ptNext= l1- >ptLis t ; l1- >ptLis t=n; } ptLis t=l1- >ptLis t ; } FIM