Recibo, Exame, 2ª época,
1º semestre, 1998/1999, Programação I/Introdução
à Programação, ISCTE:
Nome: _______________________________________________
Nº ______________________
Ass. Docente: ________________________________________
Identificação
Nome: _______________________________________________
Nº ________________
Turma: ____________
ISCTE - IGE/ETI
Programação I/Introdução
à Programação
Exame de 2ª época
1998/1999, 1º semestre
Notas:
-
Leia atentamente todo o enunciado (incluindo estas notas)
antes de começar a prova.
-
Este exame tem 5 questões.
-
Duração: 3:30h (três horas e trinta minutos).
-
A prova deve ser efectuada sem consulta.
-
Sobre a sua secretária só pode estar o enunciado
e uma caneta (coloque pastas, roupa, etc. sobre a cadeira ao seu lado).
-
Deve responder a todas as questões no próprio
enunciado, nos espaços reservados.
-
Use as páginas em branco no final do enunciado para
rascunho.
-
Não destaque as folhas do enunciado (nem mesmo as
de rascunho).
-
Preencha o seu nome e número no recibo (não
o destaque). Este ser-lhe-á entregue, assinado por um docente,
depois da prova.
-
Só um recibo assinado servirá de prova de que
entregou a sua resolução.
-
As cotações encontram-se abaixo de cada alínea
(total de 20 valores).
-
As notas serão afixadas até 29 de Julho de
1999.
-
A revisão de provas terá lugar no dia 31 de
Julho de 1999, das 8 às 9h.
-
As orais realizar-se-ão no dia 31 de Julho de 1999,
devendo os interessados pré-inscrever-se junto dos docentes até
dia 30 de Julho de 1999.
-
Boa sorte.
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 (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>
using namespace std;
class A {
private:
int x[100];
int y;
int f1();
public:
int z;
A(int a = 1, int b = 2, int c
= 3) {
y = b;
...
}
int f2(int);
bool f3(int);
};
int main() {
...
}
Questão 1.1
Após a seguinte definição:
A b(1);
que valor tem a variável y (variável
membro da instância b da classe A) [apenas uma
resposta correcta]?
__ 1;
__ 2;
[cotação: 1,0]
Questão 1.2
Assuma que está correctamente declarada uma matriz
a
de 10 elementos da classe A e nada mais:
A a[10];
Quais das seguintes instruções estão
correctas?
__ int b = a.z[3];
__ int b = a[4].f2(2);
__ int b = a[3].x[2];
__ int b = a.y;
[cotação: 2]
Questão 1.3
Assuma que as seguintes instruções são
dadas dentro de uma função membro da classe A, que
não tem quaisquer argumentos, e que não são declaradas
quaisquer variáveis dentro dessa função. Quais
das seguintes instruções estão correctas quer do ponto
de vista sintáctico quer do ponto de vista lógico?
__ int b = x;
__ int b = f2();
__ int b = x[100];
__ int b = a.f1() + a.y;
[cotação: 2]
Questão 2.1
Considere uma função int produtoInterno(int
m1[], int m2[], int n) que devolve o produto interno de dois vectores
dados pelas matrizes m1 e m2, ambas com n elementos.
Dada a pré-condição n > 0, e assumindo que
as matrizes m1 e m2 têm ambas n elementos,
indique a condição objectivo, condição invariante
e guarda do ciclo necessário à construção desta
função. Relembra-se que o produto interno de dois vectores
(m1 e m2) é dado por m1[0] m2[0]
+ m1[1] m2[1] + ... + m1[n-1] m2[n-1].
[cotação: 1]
Questão 2.2
Defina completamente a função indicada na alínea
anterior.
[cotação: 1]
Questão 3
Considere o problema da criação de um pequeno
programa para gerir a sua agenda pessoal de contactos. Assuma que
não vai necessitar de ter nessa agenda mais do que 100 contactos
de cada vez. Para cada contacto é necessário guardar
o nome da pessoa em questão (uma sequência de caracteres)
e o seu telefone (também uma sequência de caracteres).
Durante o funcionamento do programa irá necessitar de inserir novos
contactos na lista, retirar contactos de pessoas e alterar o número
de telefone de uma determinada pessoa que se encontra na lista.
Questão 3.1
Defina uma classe Contacto que possa guardar a informação
sobre o nome de uma pessoa e o seu telefone. Deverá ser possível
criar variáveis da classe Contacto com dois argumentos
(nome e número de telefone), apenas com o nome ou sem qualquer argumento.
Deve declarar também a sobrecarga do operador de igualdade (==)
que compara dois contactos e devolve
true caso os seus nomes sejam
iguais e false no caso contrário. Deve também
declarar a sobrecarga do operador
<< que permite visualizar
no ecrã os dados de um contacto. Não é necessário
nesta questão definir qualquer um dos métodos (funções
ou procedimentos membro).
[cotação: 2]
Questão 3.2
Defina uma classe Contactos que deve guardar a informação
sobre um conjunto de contactos (pode assumir que nunca necessitará
de guardar mais do que 100 contactos). Deve declarar os métodos
necessários para inserir e retirar um contacto (dado o respectivo
nome). Deve também declarar uma função que,
dada o nome de uma pessoa existente, devolva o seu número de telefone.
Não é necessário nesta questão definir qualquer
um dos métodos. Não pode utilizar a classe que implementa
o conceito de lista pertencente à biblioteca padrão do C++
nem qualquer outra classe que implemente o mesmo conceito (a não
ser que a defina completamente no exame). Pode e deve usar
a class string da biblioteca padrão do C++.
[cotação: 2]
Questão 3.3
Defina o(s) construtor(es) da classe Contacto.
[cotação: 1]
Questão 3.4
Defina o operador de igualdade (==) entre dois contactos
sabendo que dois contactos são iguais se e só se o seu nome
for igual (independentemente do seu telefone).
[cotação: 1]
Questão 3.5
Defina o operador << para a classe
Contacto
que permite que as seguintes instruções:
Contacto c("Manuel Maria", "1234567");
cout << c;
resultem em aparecer no ecrã o seguinte texto:
O telefone do Manuel Maria é 1234567.
[cotação: 1]
Questão 3.6
Defina o método da classe Contactos que devolve
o número de telefone de uma pessoa dado como argumento o seu nome.
Caso o nome não exista deverá devolver uma sequência
de caracteres (cadeia) vazia.
[cotação: 2]
Questão 3.7
Faça um pequeno programa que use uma variável
da classe Contactos e peça para inserir nesta lista três
contactos cujos dados devem ser introduzidos pelo utilizador. Não
é necessário repetir a declaração ou definição
da classe Contactos. Admita que os nomes e telefones a inserir
não contêm nenhum espaço (' ').
[cotação: 1]
Questão 4
Defina completamente uma classe Polígono
que contenha uma sequência de n vértices (cada vértice
é um par ordenado de valores decimais, i.e., uma coordenada no plano).
Assuma que qualquer polígono tem no máximo 20 vértices.
A classe Polígono deve suportar as seguintes operações:
Construtores:
Deve existir um construtor por omissão (que cria um
polígono degenerado com zero vértices) e um construtor que
receba a sequência de vértices (na forma de uma matriz bidimensional
com n × 2 elementos, sendo n dado por um segundo parâmetro).
Operador de igualdade (==):
Dois polígonos são iguais se são constituídos
pelos mesmos vértices pela mesma ordem. Tenha em atenção
que a ordem dos vértices é importante mas que o primeiro
vértice considerado na sequência é irrelevante (e.g.,
os triângulos ((1,1), (2,2), (3,3)) e ((1,1), (3,3), (2,2)) devem
ser considerados diferentes e os triângulos ((1,1), (2,2), (3,3))
e ((2,2), (3,3), (1,1)) devem ser considerados iguais). Admita que
os polígonos não contêm vértices repetidos.
void adicionaVértice(double x, double y):
Adiciona o vértice (x, y) ao polígono.
void retiraVértice (double x, double y):
Retira o primeiro vértice de coordenadas (x,
y),
caso exista. Se não existir não faz nada.
[cotação: 2]
Questão 5
Explique (sucintamente) o quais as diferenças entre
membros públicos e privados de uma classe e quais as vantagens da
utilização de membros privados.
[cotação: 1]