Nome do aluno: _______________________________________________
Número do aluno: ______________________
Assinatura do docente: ________________________________________
Identificação
Nome do aluno: _______________________________________________Número do aluno: ______________________
Turma: ____________
Frequência
Introdução à Programação
IGE e ETI
1º semestre de 2002/2003
ISCTE
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()
do programa seguinte (que pode ter erros lógicos, mas não tem erros
sintácticos):
#include <iostream>
#include <string>
#include <cassert>
using namespace std;
enum Sexo {masculino, feminino};
class Pessoa {
public:
Pessoa(string const& nome, int const idade = 18,
bool const é_homem = false);
string const& nome() const;
int idade() const;
Sexo sexo() const;
bool éMaisNovoQue(Pessoa const& outra_pessoa);
void alteraIdadePara(int const nova_ idade);
void incrementaIdade();
//
...
private:
string nome_;
int idade_;
Sexo sexo_;
bool cumpreInvariante() const;
};
Pessoa::Pessoa(string const& nome, int const idade, bool const é_homem)
: nome_(nome), idade_(idade), sexo_(é_homem ? masculino : feminino)
{
assert(0 <= idade);
assert(cumpreInvariante());
}
string const& Pessoa::nome() const
{
assert(cumpreInvariante());
return nome_;
}
int Pessoa::idade() const
{
assert(cumpreInvariante());
return idade_;
}
Sexo Pessoa::sexo() const
{
assert(cumpreInvariante());
return sexo_;
}
bool Pessoa::éMaisNovoQue(Pessoa const& outra_pessoa)
{
assert(cumpreInvariante());
return idade() < outra_pessoa.idade();
}
void Pessoa::alteraIdadePara(int const nova_idade)
{
assert(cumpreInvariante());
assert(0 <= nova_idade);
idade_ = nova_idade;
assert(cumpreInvariante());
}
void Pessoa::incrementaIdade()
...
{
//
}
//
...
int main()
{
Pessoa césar("César", 29, true);
Pessoa const rosa("Rosa", 35);
//
...
}
1.1 Admita que qualquer uma destas instruções
é dada na função
main()
no lugar onde estão as reticências. Quais das
seguintes instruções estão lógica e sintacticamente
correctas?
__ Pessoa ana;
__ Pessoa ana("Ana");
__ Pessoa ana("Ana", false);
[cotação: 1,5]
1.2 Admita que qualquer uma destas instruções
é dada na função
main()
do programa acima.
Quais das seguintes instruções estão lógica e
sintacticamente correctas?
__ Pessoa const clone_do_césar = césar;
__ bool césar_é_homem = césar.sexo();
__ bool
rosa_é_mais_nova_que_césar = rosa.éMaisNovoQue(césar);
__ cout << césar.sexo_;
[cotação: 2]
1.3 Assuma que as seguintes instruções
são dadas dentro de um método da classe Pessoa
e que não são declaradas quaisquer variáveis
ou constantes locais a esse método (que, por isso, também não
tem quaisquer parâmetros). Quais das seguintes instruções
estão correctas?
__ idade = 7;
__ sexo_ = 2;
[cotação: 1]
1.4 Admita que o método Pessoa::
incrementaIdade()
é definido como se segue:
void Pessoa::incrementaIdade()
{
assert(cumpreInvariante());
int idade_actual = idade();
alteraIdadePara(idade_actual++);
assert(cumpreInvariante());
}
A invocação deste método incrementa efectivamente a idade da Pessoa
?
Só uma resposta é correcta.
__
Sim.
__
Não.
[cotação: 0,5]
Identificação
Nome do aluno: _______________________________________________Número do aluno: ______________________
Questão 2
Uma instituição bancária quer desenvolver um sistema para gerir as suas contas à ordem em Euro. Estas contas são caracterizadas por um número inteiro positivo e pelo nome do titular. Sendo um produto acessível a todos os tipos de clientes, pretende-se que o saldo nunca seja negativo.
Aquando da abertura de uma conta, deve-se fornecer o seu número e o nome do titular. No caso de ser feita uma entrega de valores (opcional) no acto de abertura, o valor da entrega é lançado na conta como um movimento de depósito (ver parágrafos seguintes).
A manipulação da conta é exclusivamente feita por movimentos de três tipos: depósito, levantamento no MB e pagamento de combustíveis. Cada movimento possui informação sobre o seu montante, que é sempre positivo e cuja unidade é implicitamente o Euro. Não existe limite para o número de movimentos possíveis de realizar numa conta.
O depósito é um movimento de crédito na conta e o banco não cobra qualquer comissão ou taxa por este serviço.
O levantamento no MB é um movimento de débito na conta e o banco não cobra qualquer comissão ou taxa por este serviço. Apenas pode ser efectuado se a conta tiver um saldo igual ou superior ao levantamento.
O pagamento de combustível é um movimento de débito na conta e o banco cobra uma comissão fixa de 0,5 € por este serviço. Apenas pode ser efectuado se a conta tiver um saldo igual ou superior ao levantamento acrescido da comissão de 0,5 € aplicável. Num exemplo concreto, se for feito um pagamento de combustível no montante de 5 €, a respectiva conta será debitada em 5,50 €.
Neste sistema bancário deve existir a classe ContaÀOrdem
bem como
a classe Movimento
.
A classe ContaÀOrdem
deve ter um construtor que
lide com a abertura de conta e inspectores para o seu número, o nome do titular
e o saldo, em cujo cálculo devem ser tomados em conta o montante de todos os
movimentos e as respectivas comissões. Deve existir uma operação para
efectuar um movimento, que é recebido como argumento, bem como uma operação para
exibir no ecrã os movimentos de conta. Para uma conta hipotética, teríamos
como possível resultado desta operação o seguinte:
Tipo Montante Comissão
D 100 0
D 200 0
L 100 0
C 100 0.5
Saldo: 99.5
Nesta saída para o ecrã, a coluna "Tipo" contém uma abreviatura dos tipos de movimento (D - depósito, L - levantamento MB, C - pagamento combustível). No final encontra-se o saldo da conta.
A classe Movimento
deve ter, pelo menos, inspectores para o seu tipo,
montante e comissão, além de um construtor adequado. Outras operações que se considerem
adequadas podem ser acrescentadas.
2.1 Defina as classes envolvidas neste sistema de gestão bancária. Não é necessário definir nenhum método.
Não se esqueça de, para todas as operações, indicar as pré-condições e condição objectivo num comentário de documentação. Para cada classe deve-se também definir a sua condição invariante.
[cotação: 4]
2.2 Defina todos os métodos das classes definidas na alínea anterior. Todas as condições (pré-condições, condições objectivo e condições invariantes de classe) devem ser verificadas através de instruções de asserção. Na operação que exibe os movimentos não é necessário prestar atenção à formatação da saída: deve simplesmente colocar no ecrã a informação pretendida.
[cotação: 4]
Identificação
Nome do aluno: _______________________________________________Número do aluno: ______________________
Questão 3
Suponha a função double somaDosQuadrados(double const
m[tamanho], int const n)
que devolve a soma dos quadrados dos n
primeiros
elementos da matriz m
de double
:
3.1 Indique a pré-condição (PC) e a condição objectivo (CO) da função e ainda a condição invariante (CI) do seu ciclo interno.
int const tamanho = 10;
double somaDosQuadrados(double const m[tamanho], int const n)
{
assert(0 <= n and n <= tamanho);
double soma_dos_quadrados = 0.0;
for(int i = 0; i != n; ++i)
soma_dos_quadrados += m[i] * m[i];
return soma_dos_quadrados;
}
[cotação: 1]
3.2 Prove que o ciclo está parcialmente correcto verificando que:
//
PC
//
implica CI.//
CI e G
//
implica CI[cotação: 3]
Identificação
Nome do aluno: _______________________________________________Número do aluno: ______________________
Questão 4
Em C++, tal como é possível definir constantes em vez de variáveis,
também é possível usar a palavra-chave const
em parâmetros,
tipos de devolução de rotinas, ou mesmo após o cabeçalho de operações de
instância das classes. Diga qual a maior vantagem da utilização
sistemática e criteriosa desta palavra-chave no código.
[cotação: 3]