4 – Classes AED, 2001/02 Pág. 1 de 3 A - Exercícios a resolver na aula prática 4.1. Escreva uma classe Racional em C++ para representar e operar com números racionais (fracções com numerador e denominador inteiros). A classe deve ter dois membros-dado privados inteiros, correspondentes ao numerador e ao denominador, e deve ter os seguintes membros-função: - Uma função privada para normalizar um número racional (objecto da função), isto é, reduzir a fracção. Exemplos de normalização: 4/8 passa a 1/2; 1/(-2) passa a (-1)/2; 0/(-8) passa a 0/1. Utilize a seguinte rotina para achar o maior divisor comum de dois números positivos (no caso, o numerador e o denominador): int mdc(int x, int y) { while(y != 0) { int aux = y; y = x % y; x = aux; } return x; } - Um construtor que cria um número racional normalizado, tendo como argumentos o numerador e o denominador (este com valor por omissão 1). - Funções públicas que devolvem o numerador e o denominador do número racional. - Uma função pública para ler do standard input um número racional na forma "numerador/denominador", guardando-o em memória na forma normalizada. - Uma função pública para escrever no standard output um número racional (objecto da função) na forma "numerador/denominador". - Uma função pública para devolver o valor do número racional em vírgula flutuante. - Funções públicas para adicionar e subtrair a um número racional (objecto da função) um segundo número racional (argumento da função), modificando o primeiro, e devolvendo uma referência para o objecto modificado. - Funções públicas para multiplicar e dividir um número racional (objecto da função) por um segundo racional (argumento da função), modificando o primeiro, e devolvendo uma referência para o objecto modificado. Utilize o qualificador const sempre que aplicável. Escrever um pequeno programa de teste. 4.2. (Mini-teste 1999/2000) Indique os erros existentes em cada uma dos seguintes pedaços de código em C++ (as linhas estão numeradas para mais fácil referência): 1: class Ponto { 2: private: 3: int x; 4: const int y; 5: public: 6: void Ponto(int x, int y = 0) 8: int getX() 9: int getY() 10: void setX(int new_x) const 11: }; 12: { { { { x = x; y = y; } return x; } return y; } x = new_x; } 4 – Classes AED, 2001/02 13: void 14: { 15: 16: 16: 17: 18: } Pág. 2 de 3 teste() Ponto p; Ponto q (10); p.x = 1; p.y = 1; setX(10); 4.3. (Exame 18/DEZ/2000) Considere o seguinte programa em C++ (os números das linhas não fazem parte do programa): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 class Triangulo { Ponto v[3]; // coordenadas dos 3 vértices public: constructor Triangulo(Ponto v1, Ponto v2, Ponto v3) { Ponto[1] = v1; Ponto[2] = v2; Ponto[3] = v3; } perimetro() const { return dist(v[1],v[2]) + dist(v[2],v[3]) + dist(v[3],v[1]); } }; class Ponto { double x, y; public: constructor Ponto(double x_ini = 0.0, double y_ini = 0.0) {x = x_ini; y = y_ini; } double dist(Ponto p) const // distancia a outro ponto "p" { return sqrt((p.x-x)*(p.x-x) + (p.y-y)*(p.y-y)); } }; main() { Triangulo t(Ponto(), Ponto(1), Ponto(1,1)), t2; cout << "Perimetro =" << perimetro(t) << "\n"; return 0; } Identifique claramente e corrija os erros contidos neste programa (não é necessário rescrever o programa inteiro, basta indicar as correcções a efectuar). Apresente ainda os resultados da execução do programa corrigido. B - Exercícios adicionais 4.4. Escreva uma classe Deposito em C++ para guardar depósitos bancários a prazo e escreva um programa para a testar. Esta classe tem como membros-dado privados: um float para guardar a taxa de juro (taxa), constante para cada depósito, e um double para guardar o montante depositado (montante). A classe tem um membro-dado estático (static) do tipo double com o total dos depósitos efectuados (total). Escreva as seguintes funções: - Um construtor Deposito que tem como valores por omissão 0.035 para taxa de juro e 0.0 para o montante depositado. Este construtor trata também da actualização do total. - Um destrutor ~Deposito que trata da actualização do total quando um objecto é destruído. - Um membro-função acumulaJuro para actualizar o montante através da aplicação da fórmula: montante = (1+taxa)* montante. - Um membro-função print para mostrar o montante de um depósito. AED, 2001/02 4 – Classes Pág. 3 de 3 Um membro-função estático getTotal que devolve o valor do total dos depósitos. 4.5. Escreva uma classe Polinomio em C++ para trabalhar com polinómios. Um polinómio é representado por um vector alocado dinamicamente (de acordo com o grau do polinómio), contendo os valores dos coeficientes em vírgula flutuante de precisão dupla, e por um inteiro sem sinal contendo o grau do polinómio. O grau de um polinómio é constante (const). O vector de coeficientes e o grau são membros privados da classe. Escrever funções para ler um polinómio do standard input, escrever um polinómio no standard output, alterar o valor de um coeficiente (setCoef), obter o valor de um coeficiente (getCoef), obter o grau do polinómio (getGrau) e calcular o valor do polinómio num ponto x (valor em vírgula flutuante de precisão dupla). Escrever um construtor que recebe como argumento o grau do polinómio e inicializa todos os coeficientes com 0. Não se esqueça de escrever o destrutor apropriado (para libertar a memória alocada dinamicamente). Sugestão: Para calcular o valor de um polinómio a0+a1x+a2x2+...+anxn num ponto x usar o seguinte algoritmo: valor := an para i = n-1, n-2, ..., 0 fazer valor := valor * x + ai Escreva um pequeno programa de teste. O programa de teste, a definição da classe e a implementação de funções da classe devem estar em ficheiros separados. 4.6. Responda com brevidade às seguintes perguntas: a) Em C++, que funções podem aceder aos dados privados de uma classe? b) Como pode dentro de uma classe declarar uma função que não pode alterar os membro-dado do objecto para que é chamada? c) Como pode impedir um objecto de ser alterado pelos programas?