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; }