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 1999/2000
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 z;
A(const int a = 0, const int b = 1);
int f();private:
int x;
};...
int main()
{
int i = 1, j = 2;
A meu_a(10);
const A teu_a(10);
vector<int> v(2);
v[0] = v[1] = 10;
...
}
1.1 Admita que qualquer uma destas instruções é dada na função main() imediatamente após a definição do vector v. Quais das seguintes instruções estão correctas?
__ A a(v[0], v[1]); __ A a; __ A a(v[2]);[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 correctas?
__ meu_a.z = 1;
__ meu_a.x = 1;
__ teu_a.z = 1;
__ int z = teu_a.f();
[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.x = 1; __ x = 1;[cotação: 1]
1.4 Suponha a seguinte função:
int umaFuncao(int x)Assumindo que não existem quaisquer variáveis globais no programa em que a função está inserida
{
if(x < 0)
return 0;
for(int i = 0; i != x; ++i) {
int z;
z += x;
}
return z;
}
__ o código da função está correcto?
[cotação: 0,5]
Questão 2
2.1 Dada a declaração da estrutura Aluno:
struct Aluno {Defina uma classe Pauta de modo a que possa conter informação sobre 100 alunos. A classe Pauta deve conter funções e procedimentos para:
Aluno(const string& nome, int nota)
: nome(nome), nota(nota) {
}
string nome;
int nota;
};
2.2 Escreva um programa que utilize a classe Pauta (descrita e definida na alínea anterior). Este programa deve pedir ao utilizador (e ler do teclado) informação sobre 10 alunos. Deve guardar essa informação e, no final, mostrar a pauta completa. Deve impedir a inserção de nomes repetidos: em caso de repetição deve avisar o utilizador e manter a pauta tal como estava (ou seja, se os 10 nomes introduzidos pelo utilizador forem todos iguais, a pauta conterá apenas aluno com a primeira das notas introduzidas).
Notas:
Questão 3
Suponha uma classe ConjuntoInt para representar conjuntos de inteiros
class ConjuntoInt {A classe pode-se usar como se segue:
public:
void insere(const int n); // insere o inteiro n no conjunto (se já pertencer ao
// conjunto não faz nada).
void remove(const int n); // remove o inteiro n do conjunto (se não pertencer
// ao conjunto não faz nada).
bool existe(const int n) const; // devolve true se o inteiro n pertencer ao conjunto.private:
vector<int> elementos; // guarda os elementos do conjunto, sendo o seu
// tamanho (elementos.size()) o número de
// elementos no conjunto, ou seja, o seu cardinal.
};inline void ConjuntoInt::insere(const int n) {
if(!existe(n))
elementos.push_back(n);
}bool ConjuntoInt::existe(const int n) const
{
// vector<int>::size_type é um tipo inteiro (provavelmente unsigned int).
for(vector<int>::size_type i = 0; i != elementos.size(); ++i)
if(elementos[i] == n)
return true;
return false;
}inline void ConjuntoInt::remove(const int n) {
...
}
ConjuntoInt c; // c = {}que escreve no ecrã:c.insere(2); // c = {2}
c.insere(3); // c = {2, 3}
c.insere(2); // c = {2, 3}
c.remove(2); // c = {3}
if(!c.existe(2))
cout << "O 2 não está no conjunto!" << endl;
O 2 não está no conjunto!
Defina o método void ConjuntoInt::remove(const int) da classe. Lembre-se que, se a remoção tiver sucesso, o cardinal do conjunto diminui de 1!
[cotação: 3,5]
Questão 4
Suponha a função double soma(const double m[], const int n) que devolve a soma dos valores existentes numa matriz m de double com n elementos:
double soma(const double m[], const int n)4.1 Indique a pré-condição (PC), a condição objectivo (CO) e a condição invariante (CI) do ciclo interno da função.
{
double soma = 0.0;
int i = 0;
while(i != n) {
soma += m[i];
++i;
}
return soma;
}
[cotação: 1,5]
4.2 Prove que o ciclo está correcto verificando que:
Questão 5
Explique brevemente o que é a abordagem descendente à resolução de problemas e quais as suas vantagens.
[cotação: 2]