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


Notas:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


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:

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 GaragemNã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]