Recibo da Frequência de Programação Orientada para Objectos (IGE e ETI), 2º semestre de 1999/2000, ISCTE:
Nome do aluno: _______________________________________________
Número do aluno:  ______________________
Assinatura do docente: ________________________________________

Identificação

Nome do aluno: _______________________________________________

Número do aluno:  ______________________

Turma: ____________

Frequência

Programação Orientada para Objectos

IGE e ETI

2º semestre de 1999/2000

ISCTE


Notas:

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.

As alíneas podem ter zero ou mais respostas correctas.  Cada resposta correctamente assinalada vale 0,5 valores.

Em todos os casos em que não é explicitamente referida a localização de uma instrução, considere que esta é dada na função main() do programa seguinte:

#include <iostream>

using namespace std;

class A {
  public:
    A(int a) : a(a) {}
    virtual void g() const = 0;

  private:
    int a;
};

class B : public A {
  public:
    int bx;
    B(int, int);  // Não há construtor por omissão!
    void g() const {
        std::cout << "Execução de B::g(). ";
    }

  private:
    void f() const {
        std::cout << "Execução de B::f(). ";
    }
};

class C : public B {
  public:
    C(int);
    void h();

  private:
    int c;
};
...
int main()
{
    ...
}

Questão 1.1
Quais das seguintes instruções estão correctas?

__ A a(2);
__ B b(2);
__ B* b = new B(2, 3);

[1,5 valores]

Questão 1.2
Quais das seguintes definições de métodos da classe C estão correctas?

__ C::C(int aa) { B(1, 2); }
__ void C::h() {g(); std::cout<< "Executei g()";}
__ void C::h() {f(); std::cout<< "Executei B::f()";}

[1,5 valores]

Questão 1.3
 Dado o seguinte código:
int i = 1;
double d = 2.0;
quais das seguintes instruções estão correctas?

__ int** pi = &i;
__ int& ri = &i;
__ int* pi = &d;
__ int* pi = 2;

[2 valores] 

Questão 2
Considere a seguinte classe :
class GestorDeAlojamentos {
  public:
    GestorDeAlojamento();
    bool ocupa(int código, int número_de_dias, int número_de_pessoas);
    void liberta(int código);
    void mostraLivres() const;
    void mostra(int código) const;
    int conta(int código) const; // em $.

  private:
    list<Alojamento*> alojamentos;
    // ou ListaPonteiroAlojamento alojamentos;, se estiver mais à vontade com estas listas,
    // ou mesmo Lista<Alojamento*> alojamentos;.
};

Pretende-se implementar em C++ uma aplicação para apoio ao serviço de gestão de alojamentos num empreendimento turístico.  Entre outras características este sistema deve disponibilizar informação precisa sobre cada alojamento.  Essa informação deve conter: código do alojamento, categoria (primeira, segunda e terceira), indicação acerca do estado do alojamento (ocupado ou não) e, caso esteja ocupado, por quantos dias no total.

Existem dois tipos concretos de alojamento, o quarto e o apartamento:

Qualquer alojamento possui a operação bool podeOcupar(int número_de_pessoas) que  verifica se o alojamento se encontra livre e se o alojamento é adequado para o número de pessoas que o pretende ocupar.  Possui também uma operação ocupa(int número_de_dias) para fazer a ocupação do alojamento (esta operação aborta o programa se o alojamento já estiver ocupado).  Esta operação, de ocupação, encarrega-se de pedir ao utilizador aquilo que é específico de cada tipo concreto de alojamento (e.g., se se pretende serviço de bar, no caso de um quarto ou seviço de cozinha no caso de um apartamento).  Se um alojamento estiver ocupado também deve ser possível saber a sua conta através de uma operação int conta().

Devem-se poder invocar métodos que permitam libertar um alojamento, calcular a conta e mostrar no ecrã a informação sobre o alojamento.

Questão 2.1
Defina as classes Alojamento (abstracta) e Apartamento.

Não é necessário nesta alínea implementar qualquer um dos métodos das classes definidas.

[5 valores]

Questão 2.2
Assuma que a invocação do método void Alojamento::mostra() const faz aparecer no ecrã informação com o seguinte aspecto:
Código do alojamento: 4
1ª categoria
Ocupado
Implemente o método void Apartamento::mostra() const, que mostre no ecrã toda a informação relativa a este apartamento no seguinte formato:
Tipo de alojamento: Apartamento
Código do alojamento: 4
1ª categoria
Ocupado
Utiliza cozinha: Não
[2 valores]
Questão 2.3
Implemente o método  bool GestorDeAlojamentos::ocupa(int código, int número_de_dias, int número_de_pessoas).  Este método deve devolver false caso o código não exista, alojamento com o código indicado esteja ocupado ou o número de pessoas exceda a capacidade do alojamento indicado.  Este método deve devolver true caso seja possível ocupar o alojamento.  Nesse caso deve também proceder à sua ocupação.  Não deve abortar o programa em nenhuma circunstância.

Assuma que os restantes métodos das classes Alojamento , Quarto e Apartamento já estão definidos.

[3 valores]

Questão 3
As matrizes clássicas do C++ têm algumas características antipáticas.  Seria desejável verificar a validade dos índices usados no acesso aos seus elementos.  Pretende-se que a classe abaixo (Matriz) substitua com vantagem as matrizes clássicas do C++.  Ao contrário do que se passa com estas, a nova classe deve lançar uma excepção sempre que for tentada uma indexação inválida.  Defina uma classe para representar este tipo de excepção e complete o operador [] da classe:
class Matriz {
  public:
    typedef Elemento double;
    typedef int;

    Matriz(int tamanho);
    ...
    int tamanho();
    ...
    Elemento const& operator [] (int i) const;
    ...

    // Defina aqui a classe para representar excepções de indexação inválida:

  private:
    Elemento* elementos; // matriz dinâmica...
    int número_de_elementos;
};

// Os índices válidos da matriz situam-se entre 0 e tamanho() - 1.
inline Matriz::Elemento const& Matriz::operator [] (int i) const {
    // Coloque aqui o seu código: 

    return elementos[i];
}

[3 valores]
Questão 4
Dada a classe
class A {
  public:
    A(int x, int y)
        : a(new int(x)), b(y) {
    }
    ~A() {
        delete a;
    }
    ...
  private:
    int* a;
    int b;
};
indique qual a sequência de acontecimentos quando são executadas as seguintes instruções:
A* aa = new A(4, 5); // linha 1
...                  // linha 2
delete aa;           // linha 3
Indique claramente a ordem dos acontecimentos.  Distinga entre reserva de memória e construção (inicialização) das variáveis.

[2 valores]