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:

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]