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 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.
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.log
usado
para registar as chamadas realizadas:
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:
list
da biblioteca
padrão do C++; e
Chamada
.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:
void mostra() const
na classe a que pertence
o valor, responsável pela visualização do conteúdo
da classe.[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]