prob4

Propaganda
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?
Download