Frequência
 

Programação Orientada para Objectos

IGE e ETI

2002/06/26 - 2º semestre de 2001/2002
 

ISCTE


Antes de começar a prova, leia atentamente todo o enunciado, o que inclui  as seguintes 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 FQualquer 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.

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().

Considere as seguintes definições de classes:

class ContaBancária {
  public:
    ContaBancária(double const saldo_inicial);

     virtual ~ContaBancária();

    double saldo() const;

    void levanta(double const quantia);
    virtual void actualizaSaldo();

    void carregaDe(std::ifstream& entrada);

  private:
    double saldo_;
};

class ContaPoupança : public ContaBancária {
  public:
    ContaPoupança(double const saldo_inicial,
                  double const taxa_de_juro);

    double taxaDeJuro() const;

    void alteraTaxaDeJuroPara(double const taxa_de_juro);

    virtual void actualizaSaldo();

  private:
    double taxa_de_juro_;
};

class ErroAoCarregar {
};

1.1  Quais dos seguintes troços de código estão correctos?

__ ContaPoupança::ContaPoupança(double const saldo_inicial,
                                double taxa_de_juro)
  
{
        ContaBancária(saldo_inicial);
   }

__ ContaPoupança::ContaPoupança(double const saldo_inicial,
                                double const taxa_de_juro)
       : ContaBancária(saldo_inicial), taxa_de_juro_(taxa_de_juro)
   {
   }

__ ContaPoupança::ContaPoupança(double const saldo_inicial,
                                double const taxa_de_juro)
       : ContaBancária(saldo_inicial)
   {
       taxa_de_juro_ = taxa_de_juro;
   }

[cotação: 1,5 valores]

1.2 Quais das seguintes sequências de instruções estão correctas?

__ ContaPoupança conta;
   conta->alteraTaxaDeJuroPara(0.25);

__ ContaPoupança* conta = new ContaBancária(1000.0);
   cout << conta->saldo() << endl;

__ ContaBancária* conta = new ContaPoupança(1000.0, 0.25);
   conta->alteraTaxaDeJuroPara(0.3);

__ ContaBancária* conta = new ContaPoupança(1000.0, 0.25);
   conta->actualizaSaldo();

[cotação: 2 valores]

1.3  Seja a seguinte implementação da operação ContaBancária::carregaDe (ifstream& entrada):

void ContaBancária::carregaDe(ifstream& entrada) 
{
    entrada>>saldo_;

    if(not entrada.good())
        throw ErroAoCarregar();
}

Indique quais dos seguintes troços de código capturam as excepções lançadas por esta implementação (considere que todas as variáveis referidas se encontram correctamente inicializadas).

__ try {
       conta.carregaDe(entrada);
   }
catch(...) {
       cout << "Apanhei uma excepção!" <<endl;
   }

__ try {
       conta.carregaDe(entrada);
   } catch(ErroAoCarregar& erro) {
       cout << "Apanhei uma excepção!" << endl;
   }

__ try {
       conta.carregaDe(entrada);
   } catch(bad_alloc& erro) {
       cout<<"Apanhei uma excepção!"<<endl;
   }

[cotação: 1,5 valores]


Questão 2

Leia atentamente todo o texto da Questão 2  antes de a começar a resolver!

Um sistema PBX (Private Branch Exchange) é um sistema que permite o encaminhamento de chamadas telefónicas provenientes de linhas exteriores para utilizadores registados no sistema.  O sistema PBX é, ainda, capaz de gerir chamadas entre dois utilizadores registados no sistema e chamadas efectuadas por utilizadores do sistema e destinadas a um qualquer utilizador da linha externa.

A gestão do sistema PBX é realizada através de uma aplicação informática.  Esta aplicação, que está em contínua execução, permite o controlo e monitorização das chamadas em espera, em curso e terminadas.

2.1  Defina uma classe GestorDePBX que permita a gestão do sistema de PBX, fornecendo uma interface de utilização a um operador humano.  A função main() de um programa usando esta  classe deverá ser semelhante a:

int main()
{

    GestorDePBX gestor;

    gestor.gere();
}

Através desta aplicação é possível:

Chamadas em curso:
Tipo    Origem        Destino       Início              Duração  País     Cidade
Interna +351217881144 12001         2002.06.24 03:37:12 00:00:47
Interna 12006         12008         2002.06.24 03:37:21 00:00:38
Externa 12007         +351217884411 2002.06.24 03:37:23 00:00:36 Portugal LISBOA

Chamadas terminadas registadas a 2002/06/24 03:37:59:
Tipo    Origem        Destino       Início              Duração  País     Cidade
Interna +351217881144 12001         20 02.06.24 03:37:12 00:00:47
Interna 12006         12008         20 02.06.24 03:37:21 00:00:38
Externa 12007         +351217884411 2002.06.24 03:37:23 00:00:36 Portugal  LISBOA

Elabore uma definição que:

Não implemente nenhum método!

[cotação: 3 valores]

2.2  Defina a condição invariante da classe GestorDePBX.

[cotação: 1 valor]

2.3   Há necessidade de fornecer explicitamente um destrutor para a classe GestorDePBX.  Diga porquê.

[cotação: 1 valor]

2.4  Defina o destrutor da classe GestorDePBX.

[cotação: 1 valor]

2.5 No âmbito da gestão do sistema de PBX, qualquer chamada possui as seguintes propriedades:

Para a gestão deste sistema de PBX importa diferenciar as chamadas consoante se destinam a utilizadores internos ao sistema (chamadas internas) ou externos (chamadas externas).

As chamadas externas, para além dos dados comuns a todas as chamadas, registam a cidade e o país do destinatário através de duas cadeias de caracteres.  Estas classes devem disponibilizar uma interface que se adeque às necessidades da classe GestorDePBX.

Defina as classes que, na perspectiva da programação orientada para objectos, melhor representam as chamadas. Considere a existência de uma classe abstracta, Chamada, que está na base da representação.

Não implemente nenhum método!

[cotação: 2 valores]

2.6  Implemente o método da classe GestorDePBX que permite o registo em ficheiro das chamadas já realizadas  e os correspondentes métodos das classes que representam os vários tipos de chamadas (void ...::guardaEm(...) const) .

[cotação: 2 valores]

Questão 3

3.1  Defina completamente o TAD genérico ParDe.  Este TAD deve ser capaz de representar um par ordenado de valores.  Os valores representados são de igual tipo e podem  representar uma qualquer classe definida pelo utilizador.

A classe C++ genérica que concretiza o TAD referido deve possuir permitir:

[cotação: 2 valores]

3.2  Indique que requisitos deve verificar a classe dos valores guardados no par ordenado.

[cotação: 1 valor]


Questão 4

Diga o que é um espaço nominativo e quais as suas principais utilizações.  Os espaços nominativos podem ser usados para modularização?  Justifique.

[cotação: 2 valores]