Recibo do Exame de 1ª Época de Programação
Orientada para Objectos (IGE e ETI),
2002/07/12,
2º semestre de 2001/2002, ISCTE:
Nome do aluno: _____________________________________________ Número do aluno: __________
Assinatura do docente: ________________________________________
Exame de 1ª Época
Programação Orientada para Objectos
IGE e ETI
2002/07/12 - 2º semestre de 2001/2002
ISCTE
Identificação
Nome do aluno: _____________________________________________ Número do aluno: __________
Questão 1
Assinale com V (Verdadeiro) as expressões que estão correctas e com F (Falso) as que estão incorrectas.
Deve preencher todos os espaços indicados por um sublinhado (___) com V ou F. Qualquer espaço não preenchido será considerado como uma resposta errada.
Em geral as alíneas podem ter zero ou mais respostas correctas. Cada resposta correctamente assinalada vale 0,5 valores.
Nas alíneas em que apenas uma resposta está correcta (se existirem estão assinaladas no texto), responder com mais ou menos do que um V anula a cotação. A resposta correcta corresponde à cotação completa. Qualquer outra resposta corresponde a zero valores.
1.1 Considere as seguintes classes:
class C {
public:
C();
};
class A {
public:
A(int const x, int const y);
virtual ~A() = 0;
int y() const { return y_ ; }
virtual void m1() = 0;
private:
C* x_;
int y_;
};
class B : public A {
public:
B();
virtual void m1();
private:
int z_;
};
Quais
das seguintes definições estão correctas?
__ B::m1() { z_ = y_ * 2; }
__ A::A(int const x, int const y) : y_(y), x_(new
C()) { }
__ int main() { B b; A* pa = &b; B* pb = pa;
}
[cotação: 1,5]
1.2 Quais dos seguintes conjuntos de instruções estão correctos?
__ int a = 1; int& b = a; int c = 2; &b
= c;
__ int const c = 2; int* d = &c;
__ int e = 3; int const* const f = &e;
[cotação: 1,5]
1.3 Quais das seguintes afirmações são verdadeiras e quais são falsas?
__
Um diagrama de
classes serve para representar o comportamento dos objectos existentes no
modelo.
__
A relação de
generalização em UML corresponde, em C++, à derivação privada de classes.
__
A associação de
agregação corresponde à relação é composto por e é a mais forte de todas
as associações entre classes.
__
A cada operação
declarada numa classe em C++ corresponde forçosamente um método dessa mesma classe,
excepto se a operação for abstracta.
[cotação: 2]
Identificação
Nome do aluno: _____________________________________________ Número do aluno: __________
Questão 2
Recorde-se que deve ler atentamente todo o enunciado antes de resolver as questões!
Pretende-se implementar, em C++, uma aplicação para apoio à gestão e consulta de imóveis em comercialização numa empresa imobiliária. Esta aplicação permite aos seus utilizadores consultar um catálogo de imóveis e registar os imóveis em venda e vendidos.
A imobiliária comercializa dois
tipos de imóveis: prédios e fracções. As fracções podem ser apartamentos,
escritórios ou garagens. Os prédios são constituídos por zero ou mais fracções.
Para todos os imóveis deve ser possível saber a identificação (numérica), a
morada, o concelho onde se localiza e o preço total de venda. Deve ser também
possível mostrar no ecrã, para qualquer imóvel, todos os seus dados, através de
uma operação mostra()
. No caso dos prédios esta operação deve mostrar a informação de todas as
suas fracções.
Os apartamentos e os escritórios devem ter disponível, além da informação referida, a área e o preço por metro quadrado. Para estes dois tipos de fracções, o preço é calculado a partir da área e do preço por metro quadrado. No caso dos apartamentos é preciso registar ainda se estão ou não equipados com electrodomésticos. Caso possuam electrodomésticos o preço dos apartamentos é agravado de um valor constante de 5000 €. Sobre as garagens sabe-se o número de lugares que possuem e o preço por lugar.
A aplicação de gestão de imóveis
baseia-se na classe Catalogo
. Esta classe possui uma lista dos imóveis
em venda e uma outra dos imóveis já vendidos. Estão disponíveis as seguintes
funcionalidades:
Catalogo
.Considere a existência da classe list
disponível
na biblioteca padrão do C++ e utilize
variáveis dinâmicas quando entender adequado.
2.1 Desenhe um diagrama de classes, utilizando
a notação UML, que corresponda a parte do modelo da aplicação descrita.
Este
diagrama deve incluir as classes Imóvel
, Prédio
, Fracção
, Apartamento
,
Escritório
e Garagem
.
É necessário incluir no diagrama a
representação das classes, das relações entre as classes e das
multiplicidades das associações. Não é
necessário nesta alínea inscrever nas classe os respectivos atributos e
operações.
[cotação: 2]
2.2 Defina as classes Catálogo
, Imóvel
,
Prédio
, Fracção
e Garagem
. Não é necessário nesta alínea
definir quaisquer métodos das classes.
[cotação: 2]
2.3 Implemente o destrutor da classe Catálogo
.
[cotação: 1]
2.4 Implemente os métodos das classes Prédio
e Apartamento
responsáveis pelo cálculo dos
respectivos preços.
[cotação: 2]
2.5 Implemente o método da classe Catálogo
que
permite mostrar a informação sobre um imóvel, dada a sua identificação.
Este método
deve assumir que existe no catálogo o imóvel com a identificação dada.
[cotação: 1]
2.6 Implemente o método da classe Catálogo
responsável
pelo registo da venda de um imóvel, dada a sua identificação. Este método deve
assumir que existe no catálogo o imóvel com a identificação dada.
[cotação: 1]
2.7 Implemente o método da classe Prédio
que
permite registar uma fracção dada num prédio.
[cotação: 1]
Identificação
Nome do aluno: _____________________________________________ Número do aluno: __________
Questão 3
Considere a definição da classe ListaDeDouble
fornecida em anexo. Considere ainda que a sua implementação se baseia no conceito
de cadeia duplamente ligada (não-circular) com guardas.
3.1 Implemente o procedimento ListaDeDouble::poe(Elo* const elo_anterior, Elo* const elo_seguinte, Item
const& novo_item)
que
insere um novo item na cadeia duplamente ligada (não-circular) com guardas dos
elos correspondentes aos itens na lista. O elo do novo item é inserido entre os dois elos apontados por elo_anterior
e elo_seguinte
, que se
supõem sucessivos. Estes ponteiros não podem nunca ser nulos.
[cotação: 1]
3.2 Implemente o método void ListaDeDouble::inverte()
que
inverte a ordem dos itens na lista. Para o fazer deve inverter a ordem dos
elos da cadeia duplamente ligada (não-circular) com guardas dos elos
correspondentes aos itens na lista. Utilize o procedimento std::swap()
da biblioteca padrão do C++ que troca o
valor de duas variáveis do mesmo tipo recebidas como argumentos.
[cotação: 1]
3.3 Implemente o construtor por cópia da classe ListaDeDouble
, i.e., a operação
ListaDeDouble
::ListaDeDouble(ListaDeDouble const&
original)
, de modo a fornecer a garantia forte de
segurança face a excepções.
[cotação: 1]
Anexo 1
Definição da classe ListaDeDouble
:
class ListaDeDouble {
public:
typedef double Item;
ListaDeDouble();
ListaDeDouble(ListaDeDouble const& original);
~ListaDeDouble();
ListaDeDouble& operator=(ListaDeDouble modelo);
Item const& frente() const;
Item const& tras() const;
int comprimento() const;
bool estaVazia() const;
Item& frente();
Item& tras();
void poeNaFrente(Item const& novo_item);
void poeAtras(Item const& novo_item);
void tiraDaFrente();
void tiraDeTras();
void esvazia();
void transfereDe(ListaDeDouble& lista_fonte);
void inverte();
void trocaCom(ListaDeDouble& outra_lista);
ListaDeDouble& operator += (ListaDeDouble lista_fonte);
...
private:
struct Elo {
Elo(Elo* const anterior = 0, Elo* const seguinte = 0,
Item const& item = Item());
Item item;
Elo* anterior;
Elo* seguinte;
};
int numero_de_itens;
Elo* elo_inicial;
Elo* elo_final;
void poe(Elo* const elo_anterior, Elo* const elo_seguinte,
Item const& novo_item);
void tira(Elo* const elo_a_tirar);
bool cumpreInvariante() const;
};
Identificação
Nome do aluno: _____________________________________________ Número do aluno: __________
Questão 4
4.1 É comum fazer-se a analogia entre o processo de desenvolvimento de software e o processo de arquitectura e construção de edifícios. Identifique as três fases de desenvolvimento de software e descreva sumariamente pelo menos uma delas.
[cotação: 1]
4.2 Explique o que são as classes genéricas em C++ e quais as suas vantagens. Dê um exemplo.
[cotação: 1]