Programao Orientada a Objetos 1 Semestre de 2014 Prof. Raquel Mini
2 TRABALHO PRTICO VALOR: 20 PONTOS
Observaes:
O trabalho pode ser executado em grupo de no mximo 2 alunos. Tambm pode ser executado individualmente.
permitido discutir os problemas e estratgias de soluo com seus colegas.
Quando se tratar de escrever ou implementar as solues, isto deve ser feito apenas com o componente do seu grupo.
Se utilizar qualquer fonte externa para implementar suas respostas, voc deve citar estas fontes: artigos ou livros, amigos ou colegas, informao que voc encontrou na Internet qualquer coisa em qualquer lugar!
melhor tentar solucionar os problemas voc mesmo, pois solucionar problemas um componente fundamental neste curso. No vamos penaliza-lo se voc utilizar uma ajuda externa, desde que devidamente citada, e desde que esta ajuda no seja a cpia do trabalho de um colega.
Utilizar o trabalho dos outros, como se fosse seu, plgio desonestidade acadmica ser punida com severidade.
A entrega dos trabalhos ser feita no Moodle.
A data limite de entrega o dia 20/05/2014.
Todas as questes devem ser muito bem documentadas. Ao criar uma classe, crie a documentao correspondente, o mesmo valendo para atributos, mtodos, casos de uso, etc...
Organize corretamente seu trabalho: crie os arquivos de interface (.h) e de implementao (.cpp) para cada classe e um arquivo separado para o programa principal (main.cpp).
2
Questes:
1- (10 pontos) Desenvolver uma hierarquia de classes com comportamento polimrfico. Nesta hierarquia, haver uma classe base abstrata de nome Forma, para encapsular formas geomtricas (ou entidades geomtricas). A partir desta classe, sero derivadas classes, ainda abstratas, que incluiro classificaes para a Forma, como Forma1D, Forma2D e Forma3D . Delas, sero derivadas classes concretas que representaro formas geomtricas reais: (1D) linhas(segmentos de reta), crculos (somente a linha externa do crculo), (2D) retngulos, tringulos, discos (toda a rea de um crculo), (3D) esferas e cubos. Todas essas formas esto embutidas em um espao tridimensional. Por exemplo, os pontos extremos de uma linha tm coordenadas x, y e z.
Definir a classe Forma. A hierarquia criada a partir de Forma dever possuir as seguintes funes: (OBS: a especificao do prottipo destas funes faz parte do exerccio). o Destrutor virtual; o move. Funo puramente virtual, que ser usada para mover formas; o desenha. Funo puramente virtual para desenhar as entidades na tela; o area. Funo puramente virtual que calcula a rea da entidade; o volume Funo puramente virtual que calcula o volume da entidade; o pontoNaForma. Funo puramente virtual que recebe as coordenadas de um ponto e verifica se este ponto se localiza na forma. o tipo. Funo virtual que retorna uma string com o nome da classe da forma. o le e escreve. Funo puramente virtual que l e escreve os dados da forma em um istream e um ostream passados por referncia. o operator>> e operator<<, sobrecarregados como funo no membro somente para a classe base Forma e que chama as funes virtuais le e escreve criadas acima.
Definir as classes derivadas, criando os atributos necessrios, construtores para elas (projete estes construtores da melhor forma possvel), seus destrutores e implementando os mtodos especificados como puramente virtuais na classe Forma. Para formas 1D, as funes area e volume retornam zero; para formas 2D, a funo volume retorna zero; para formas 3D a funo area retorna a rea da superfcie do objeto. pontoNaForma deve retornar verdadeiro caso o ponto esteja no interior ou sobre a forma. No necessrio implementar de verdade a funo desenha. Por exemplo, para a classe Linha, voc pode simplesmente escrever na tela, algo como Desenhando uma Linha com pontos extremos p1 = (x1, y1, z1) e p2 = (x2, y2, z2). Criar uma classe para armazenar todas as Formas criadas (voc pode usar um vector<Forma* > como atributo desta classe). Nesta classe, crie a possibilidade de desenhar todas as formas armazenadas, mover uma determinada forma (o usurio fornecer as coordenadas de um ponto e o sistema dever verificar qual das Formas contm aquele ponto), mover todas as formas criadas, calcular a rea e o volume de todas ou de uma nica forma (novamente, especificada atravs das coordenadas de
3
um ponto). No se esquea de criar um destrutor para esta classe que desaloque as formas que esto sendo apontadas pelos Forma* . Crie um programa principal com um menu (no grfico) para o usurio de modo que este possa escolher novas formas para serem criadas em tempo de execuo, escolhendo tambm seus parmetros. Possibilite, tambm, a manipulao destas Formas (mover, calcular a rea, etc...) e a gravao e leitura de todas elas em arquivo.
Dicas: (a) Voc deve implementar os mtodos para manipulao do conjunto de formas como mtodos da classe que armazena todas as Formas, fazendo chamada aos mtodos correspondentes de Forma; (b) Para que a gravao e a leitura em arquivo funcionem corretamente necessrio que seja armazenado em disco, alm dos atributos da forma, o seu tipo (por exemplo, uma string com o nome da classe). Se isso no for feito, no momento da leitura voc no saber qual tipo de Forma dever instanciar. Uma maneira bacana de instanciar as Formas que esto sendo lidas criar uma funo que funcione como uma Fbrica de Formas, recebendo como parmetro a string com o nome da classe a que pertence a forma a ser criada e retornando um ponteiro para a forma instanciada.
2- (10 pontos) A seguir so apresentados os oito primeiros elementos de seis sequncias numricas:
Crie uma hierarquia de classes, com comportamento polimrfico, para sequncias numricas. A classe base, abstrata (Seq), declararia, no mnimo, as seguintes funes:
unsigned long int elem(int i) // Retorna o isimo elemento da seqncia (public) void gen_elems(int i) // Gera os elementos da srie at o isimo elemento (protected) print(ostream& os) // Escreve todos os elementos gerados em os (public) int length() // Retorna o tamanho atual da srie
Esta interface a mnima. Voc pode adicionar os mtodos que julgar necessrios. Cada classe da hierarquia possui um vector<unsigned long int>. A sequncia deve ser gerada sob demanda, isto , se chamarmos elem(10) em um objeto da sequncia de Fibonnaci e o ltimo elemento gerado for o 15, simplesmente buscamos no vector o elemento armazenado. Porm, ao chamarmos elem(17) teremos que gerar os elementos no presentes at ento na sequncia (16 e 17). Como a sequncia a mesma para cada objeto de determinado tipo, o vector pode ser compartilhado por todos os objetos, isto , pode ser um atributo de classe (static).
4
(a) No Objecteering, projete a hierarquia, adicionando todos os mtodos que forem necessrios, alm dos mnimos; (b) Crie construtores que possam criar sequncias vazias ou inicializadas com um certo nmero de elementos, passado como parmetros. (c) Crie um nico operator<< que faa uso do mtodo print e que possa ser utilizado para imprimir quaisquer das sequncias da hierarquia, at o ponto em que elas esto criadas; (d) Crie uma nica funo que imprima quaisquer das sequncias da hierarquia, de um elemento i at um elemento j, recebidos como parmetros; (e) Crie uma classe container que possua como atributo um vector<Seq*>. Ela servir para armazenar e manipular o conjunto de sequncias. (f) Crie um programa com um menu (no grfico) para o usurio de modo que este possa escolher sequncias para serem criadas em tempo de execuo, escolhendo tambm seus parmetros. Estas sequncias sero adicionadas dinamicamente ao vector <Seq* > da classe da letra (e). (g) Crie a possibilidade de imprimir todas as sequncias armazenadas, de forma completa ou de um determinado elemento i at o elemento j, e de imprimir um isimo elemento de todas as sequncias.
Dica: voc deve implementar todos estes mtodos como mtodos da classe "container" de Seq*, fazendo chamada aos mtodos correspondentes de Seq.