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


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 (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);

 [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?

__  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;

 [cotação: 1]

1.4  Suponha o seguinte código adicional:

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;
}

Assumindo que os restantes métodos da classe estão definidos, qual é o resultado da invocação do programa?
Apenas uma das opções está correcta.

__  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.
    string morada() const;                       //
Devolve a morada do cliente.
    string endereçoDeCorreioElectrónico() const; //
Devolve o endereço de correio
                                                 //
electrónico do cliente.
    void adiciona(Encomenda const& encomenda);   //
Adiciona a encomenda
                                                 // encomenda
à conta do cliente.
    void mostraEncomendas() const;               //
Mostra no ecrã todas as
                                                 //
encomendas que estão na
                                                 //
na conta do cliente.
    double valorEmDívida() const;                //
Devolve o valor total das
                                                 //
encomendas do cliente.
  private:
    string nome;
    string morada;
    string endereço_de_correio_electrónico;
    vector<Encomenda> encomendas;
};

Defina os métodos:

 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:

int produto(int const m[], int const n)
{
    int produto = 1;

    int i = 0;
    while(i != n) {
        produto *= m[i];
        ++i;
    }

    return produto;
}

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.

[cotação: 1,5]

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 


 

 

 


 
 
 

4.2  Prove que o ciclo está correcto verificando que:

[cotação: 1,5]
 
 
 
 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 

 


 
 
 
 
 
 
 

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]