Exercícios Orientação a Objetos
1ª Questão
(a) Escreva uma classe em C++ chamada de Imovel com 4 atributos: uma string
contendo o nome do proprietário, uma string contendo o endereço do imóvel, um número
real representando o valor da compra e um inteiro não negativo representando o ano de
construção do imóvel. Declare e implemente um construtor que receba como parâmetros:
o nome do proprietário, o endereço, o valor da compra e o ano de construção, e inicialize os
respectivos atributos. Declare também um método chamado calcularValorVenda
que recebe como parâmetros um inteiro não negativo que representa o ano de venda, e um
número real que representa a taxa de correção monetária, e retorna um valor real.
(b) Implemente o método calcularValorVenda. O cálculo depende do ano de
construção e o valor de compra original. Para calcular o valor de venda do imóvel, o
método deve inicialmente aplicar a taxa de correção monetária sobre o valor de compra
para cada ano de existência do imóvel (juros compostos); e posteriormente multiplicar este
valor pelo fator de depreciação. O fator de depreciação é obtido subtraindo o tempo de
construção do imóvel do número 30 e posteriormente dividindo este valor por 30
(Exemplo: ano de construção = 2000, ano de venda = 2010  fator de depreciação = 20⁄30)
Obs : Não pode utilizar a função pow da biblioteca math.h
2ª Questão
Considere que exista uma classe em C++ denominada Chamada que representa chamadas
telefônicas. Esta classe possui um método implementado: int getDuracao() que
retorna o número de minutos de uma chamada. Além disto, o construtor é dado por:
Chamada(int duracao);
(a) Escreva uma classe chamada de PlanoPrePago com 5 atributos: uma string contendo
o nome do cliente, um inteiro que representa a quantidade de minutos máxima que o plano
dá direito, um real que representa a franquia (o valor pré-pago), um inteiro que representa a
quantidade de chamadas (este atributo deve ser protected), e um vetor de tamanho 30
de ponteiros para chamadas (o vetor deve ser protected). Declare um construtor que
receba como parâmetros, o nome do cliente, quantidade máxima de minutos e o valor da
franquia. Declare também um método chamado adicionarChamada que recebe um
ponteiro para uma chamada e o tipo de retorno é void. Este método deve ser declarado
como virtual. Declare e implemente um método chamado calcularFatura que
retorna
o
valor
da
franquia.
Declare
e
implemente
um
método
getQuantidadeMinutos que não tem parâmetros e que retorna a quantidade máxima
de minutos. Finalmente implemente o construtor que deve inicializar os atributos com os
parâmetros passados, além de inicializar a quantidade de chamadas com 0.
(b) Implemente o método adicionarChamada que adiciona um ponteiro para uma
chamada ao vetor de ponteiros declarado na classe. Este método só pode adicionar uma
chamada se já não existir 30 chamadas no vetor e se a duração das chamadas existentes
mais a que vai ser adicionada, não ultrapassar o total de minutos que o plano dá direito.
Caso não seja possível adicionar a chamada, o método deve imprimir uma mensagem de
erro.
3ª Questão
(a) Escreva uma classe chamada de PlanoPosPago que herde da classe
PlanoPrePago e que tenha 1 atributo além dos herdados: um real que representa a tarifa
cobrada por minuto adicional de chamada (ou seja fora da quantidade máxima garantida
pelo plano). Declare e implemente um construtor que receba os mesmos parâmetros de
PlanoPrePago, acrescido do parâmetro tarifa por minuto. Declare também os métodos
adicionarChamada e calcularFatura que são redefinições dos métodos
homônimos de PlanoPrePago.
(b)Implemente o método adicionarChamada. Este método deve adicionar um
ponteiro para uma chamada ao vetor de ponteiros apenas verificando se o total de chamadas
não ultrapassa 30. Caso não seja possível adicionar a chamada, o método deve imprimir
uma mensagem de erro.
(c) Implemente o método calcularFatura. A fatura é calculada multiplicando os
minutos adicionais (fora da quantidade garantida pelo plano) pela tarifa cobrada por cada
minuto adicional e depois somando com a franquia.
Soluções
1ª Questão
#include <string>
using namespace std;
class Imovel
{
private:
string proprietario;
string endereco;
double valorCompra;
unsigned ano;
public:
Imovel(string nome, string endereco, double valor, unsigned ano);
double calcularVenda(unsigned anoVenda, double correcao);
};
#include "Imovel.h"
Imovel::Imovel(string nome, string endereco, double valor, unsigned ano)
{
this->proprietario = nome;
this->endereco = endereco;
this->valorCompra = valor;
this->ano = ano;
}
double Imovel::calcularVenda(unsigned anoVenda, double correcao) {
int i,tempoConstrucao = anoVenda – this->ano;
double valorFinal;
double jurosCompostos = 1;
for (i = 0; i < tempoConstrucao; i++) {
jurosCompostos = jurosCompostos * (1+correcao);
}
valorFinal = this->valorCompra * jurosCompostos *
(30-tempoConstrucao)/30;
return valorFinal;
}
2ª Questão
#include "Chamada.h"
#include <string>
using namespace std;
class PlanoPrePago
{
private:
string nomeCliente;
int quantidadeMinutos;
double franquia;
protected:
Chamada* chamadas[30];
int quantidadeChamadas;
public:
PlanoPrePago(string nome,int minutos, double valor);
int getQuantidadeMinutos();
double calcularFatura();
virtual void adicionarChamada(Chamada* chamada);
};
PlanoPrePago::PlanoPrePago(string nome,int minutos, double valor)
{
nomeCliente = nome;
quantidadeMinutos = minutos;
franquia = valor;
quantidadeChamadas = 0;
}
int PlanoPrePago::getQuantidadeMinutos() {
return quantidadeMinutos;
}
int PlanoPrePago::getQuantidadeChamadas() {
return quantidadeChamadas;
}
double PlanoPrePago::calcularFatura() {
return franquia;
}
void PlanoPrePago::adicionarChamada(Chamada* chamada){
if (quantidadeChamadas < 30) {
int i,duracaoChamadas = 0;
for (i = 0; i < quantidadeChamadas; i++){
duracaoChamadas += chamadas[i]->getDuracao();
}
if (duracaoChamadas + chamada->getDuracao() <=
quantidadeMinutos){
chamadas[quantidadeChamadas] = chamada;
quantidadeChamadas++;
} else {
cout << "Nao eh possivel fazer a chamada"<<endl;
}
} else {
cout << "Nao eh possivel fazer a chamada"<<endl;
}
}
3ª Questão
#include "PlanoPrePago.h"
class PlanoPosPago: public PlanoPrePago {
private:
double tarifaMinuto;
public:
void adicionarChamada(Chamada* chamada);
double calcularFatura();
PlanoPosPago(string nome,int maximo,double franquia, double
adicional):
PlanoPrePago(nome,maximo,franquia) {tarifaMinuto = adicional;}
};
#include "PlanoPosPago.h"
#include <iostream>
void PlanoPosPago::adicionarChamada(Chamada* chamada){
if (quantidadeChamadas < 30) {
chamadas[quantidadeChamadas] = chamada;
quantidadeChamadas++;
} else {
cout << "Nao eh possivel fazer a chamada"<<endl;
}
}
double PlanoPosPago::calcularFatura() {
int duracao = getQuantidadeMinutos();
int i,minutosAdicionais,duracaoChamadas = 0;
double tarifa = PlanoPrePago::calcularFatura();
for (i = 0; i < quantidadeChamadas; i++){
duracaoChamadas += chamadas[i]->getDuracao();
}
if (duracao < duracaoChamadas){
minutosAdicionais = duracaoChamadas - duracao;
tarifa += minutosAdicionais * tarifaMinuto;
}
return tarifa;
}
Download

1° Exercício de Métodos Computacionais (2007/2)