Recibo da Frequência de Introdução à Programação (IGE e ETI), 1º semestre de 2000/2001, ISCTE:
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 2000/2001
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:
#include <iostream>
#include <vector>
using namespace std;
class A {
public:
int const m;
A();
A(int const a, int const b = 0);
int p() const;
vector<int>::size_type t() const;
void a(int const n);
void r(int const i);
private:
vector<int> v;
};
A::A(int const a, int const b) : m(30), v(a, b) {
}
vector<int>::size_type A::t() const {
return v.size();
}
void A::a(int const n) {
v.push_back(n);
}
...
int main()
{
int i = 11, j = 12;
A um_a(23, i);
A const outro_a(18, j);
...
}
1.1 Admita que qualquer uma destas instruções
é dada na função main()
imediatamente após
a definição da constante outro_a
. Quais das seguintes
instruções estão correctas?
__ A a(um_a);
__ A a;
__ A a(outro_a.m);
1.2 Admita que qualquer uma destas instruções
é dada na função main()
do programa acima.
Quais das seguintes instruções estão correctas?
__ um_a.m = 1;
__ um_a.r(1);
__ outro_a.m = 1;
__ int m = outro_a.p();
[cotação: 2]
1.3 Assuma que as seguintes instruções
são dadas dentro de uma função ou procedimento membro
da classe A
e que não são declaradas quaisquer variáveis
ou constantes dentro dessa função ou procedimento (que não
tem quaisquer parâmetros). Quais das seguintes instruções
estão correctas?
__ A.m = 1;
__ v = 1;
1.4 Suponha o seguinte código adicional:
Assumindo que os restantes métodos da classe estão definidos, qual é o resultado da invocação do programa?
void fazQualquerCoisa(A a, int& x)
{
x += a.m;
a.a(x);
}
int main() {
A a(19);
int x = 7;
fazQualquerCoisa(a, x);
cout << a.t() << " " << x << endl;
}
__ 20 7
__ 20 37
__ 19 7
__ 19 37
[cotação: 0,5]
Questão 2
Actualmente, existem em Portugal várias lojas especializadas na importação de banda desenhada. Estas lojas, usualmente, têm uma carteira de clientes que realiza uma série de encomendas. Estas encomendas (que podem ser realizadas pela Internet) são constituídas pela data (cadeia de caracteres), o título (cadeia de caracteres), a editora (cadeia de caracteres), quantidade de exemplares (inteiro) e o preço por unidade (vírgula flutuante).
Uma destas lojas pensou que usando um sistema informático seria mais fácil satisfazer as necessidades dos clientes.
2.1 Defina apenas a interface de uma classe
Encomenda
que representa uma encomenda realizada por um cliente da loja. A classe Encomenda
deve dispor de um construtor que recebe os dados necessários à construção de
uma encomenda e funções membro que permitam inspeccionar:
Indique claramente quais dos métodos da classe não alteram a instância implícita durante a sua invocação.
Não é necessário nesta alínea definir quaisquer funções ou procedimentos membro da classe.
[cotação: 3]
2.2 A classe ContaDeCliente
representa a conta de um cliente na loja e é definida do seguinte modo:
class ContaDeCliente {
public:
ContaDeCliente(string const& nome,
string const& morada,
string const& endereço_de_correio_electrónico);
string nome() const; //
Devolve o nome do cliente.Devolve a morada do cliente.
string morada() const; //Devolve o endereço de correio
string endereçoDeCorreioElectrónico() const; //electrónico do cliente.
//Adiciona a encomenda
void adiciona(Encomenda const& encomenda); //à conta do cliente.
// encomendaMostra no ecrã todas as
void mostraEncomendas() const; //encomendas que estão na
//na conta do cliente.
//Devolve o valor total das
double valorEmDívida() const; //encomendas do cliente.
//
private:
string nome;
string morada;
string endereço_de_correio_electrónico;
vector<Encomenda> encomendas;
};
Defina os métodos:
void adiciona(Encomenda const& encomenda)
e double valorEmDívida() const
. da classe ContaDeCliente
.
[cotação: 3.5]
Questão 3
Quando se
edita um programa usando o Emacs
, pode-se utilizar o comando C-k
(por exemplo) para cortar texto e o comando C-y
para voltar a colá-lo onde for mais conveniente. É possível também
colar cortes anteriores ao último usando o comando M-y
.
Após uma colagem com o comando C-y
, dar o comando
M-y
substitui o
corte que acabou de ser colado pelo corte anterior na sequência de cortes
realizados desde o início da sessão. Quando este comando é repetido
sobre a colagem do primeiro dos cortes realizados na sessão, essa colagem é
substituída pelo último corte realizado. Por isso no Emacs
não se fala
em sequências de corte, mas sim em anéis de corte.
Construa a classe AnelDeCortes que representa o conceito de anel de cortes atrás descrito, permitindo deste modo:
A classe AnelDeCortes
pode-se usar como se segue:
AnelDeCortes anel;
anel.guarda("Primeiro corte");
anel.guarda("Segundo corte");
cout << anel.corteActual() << endl; // Aparece no monitor 'Segundo corte'.
anel.anterior();
cout << anel.corteActual() << endl; // Aparece no monitor 'Primeiro corte'.
anel.guarda("Terceiro corte");
cout << anel.corteActual() << endl; // Aparece no monitor 'Terceiro corte'.
anel.anterior();
cout << anel.corteActual() << endl; // Aparece no monitor 'Segundo corte'.
anel.anterior();
cout << anel.corteActual() << endl; // Aparece no monitor 'Primeiro corte'.
anel.anterior();
cout << anel.corteActual() << endl; // Aparece no monitor 'Terceiro corte'.
Indique claramente quais dos métodos da classe não alteram a instância implícita.
Defina completamente a classe, incluindo a definição de todos os seus métodos.
[cotação: 3,5]
Questão 4
Suponha a função
int produto(int
const m[], int const n)
que devolve o produto dos n
elementos de uma matriz
m
de int
:
4.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 produto(int const m[], int const n)
{
int produto = 1;
int i = 0;
while(i != n) {
produto *= m[i];
++i;
}
return produto;
}
[cotação: 1,5]
4.2 Prove que o ciclo está correcto verificando que:
//
PC
//
implica CI.//
G e CI
//
implica CI
Questão 5
Explique claramente as vantagens de conhecer e usar regularmente um programa depurador de erros durante o desenvolvimento de um programa.
[cotação: 2]