ISCTE - IGE/ETI

Programação I/Introdução à Programação

Frequência tipo

1998/1999,  1º semestre



A azul e indentadas uma vez as resoluções dos exercícios.


Questão 1
  1. Assinale com V (Verdadeiro) as expressões que estão correctas e com F (Falso) as que estão incorrectas.
  2. 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.
  3. Qualquer alínea pode ter zero ou mais respostas correctas.  Cada resposta correctamente assinalada vale 0,5 valores.
  4. 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;

bool f1(const int a, const int b)
{
    if(a > 0)
        return false;
    return true;
}

int f2(int m[], int n, int& a)
{
    ...
}

int main()
{
    const int ci = 10;
    int i, i1, i2;
    float f;
    char c;
    bool b;
    int m1[10];

    ...
}

int f3(const int n, int& a)
{
    ...
}

a)  Quais das seguintes atribuições são válidas?

 F   c = A;

Não existe nenhuma variável A.  Para guardar o caractere 'A' (ou melhor, o código do caractere 'A') em c, dever-se-ia ter escrito:
c = 'A';
 V   i = 5/6;
A divisão de dois inteiros é a divisão inteira.  O resultado neste caso é o inteiro 0.
 F   ci = 10;
Não se podem fazer atribuições a uma constante.
 V   m1[9] = 10;
O último índice válido da matriz m1 é exactamente 9.  É uma matriz de inteiros não constantes.
 [cotação: 2]

b)  De que tipo é o resultado da expressão i / 2 == 0?

 F   int
 V   bool

Dadas as precedências dos operadores, a expressão é interpretada como (i / 2) == 0, logo o resultado é o bool (false ou true) correspondente à veracidade da igualdade.
 F   float

 [cotação: 1.5]

c)  Quais das seguintes invocações da função f2() são válidas?

 F   m1 = f2(m1, i1, i2);

A variável m1 à esquerda da atribuição não é um inteiro.

 F   int x = f2(i, i1, i2);

A variável i não é uma matriz.

 F   int x = f2(i1, i2, m1);
Idem.  E m1 não é um int.
 [cotação: 1.5]

d)  Dado o seguinte código

void f4(int a, int& b)
{
    a = 1;
    b = 0;
}
int main()
{
    int x = 2, y = 3;
    f4(x, y);
    cout << x << " " << y << endl;
}
quais os valores que são escritos no ecrã?

 F   2 3
 F   1 0
 V   2 0

A variável x é passada por valor, mantendo assim o valor original de 2.  A variável y é passada por referência, ficando assim com o valor 0 colocado pelo procedimento f4().
 F   1 3

[cotação: 2]

Questão 2

2.a)  Crie um pequeno procedimento void lêMatriz(double m[], const int n) que leia do teclado uma sequência de n valores dada pelo utilizador e os guarde na matriz m.  Assuma que n >= 0.

[cotação: 3]

void lêMatriz(double m[], const int n)
{
    for(int i = 0; i != n; ++i)
        cin >> m[i];
}
2.b)  Considere uma função double norma(const double m[], const int n) que calcula a norma do vector m.  Recorda-se que a norma é a raiz quadrada da soma dos quadrados dos componentes dum vector.  Dada a PC (pré-condição) n >= 0, desenvolva a CO (condição objectivo), a CI (condição invariante) e a G (guarda) para o ciclo necessário na função.  Indique também a inicialização, o progresso e a acção deste ciclo.

[cotação: 2]

CO (da função): norma =  (S j : 0 <= j < n : m[j]2)½
CO (do ciclo): norma =  (S j : 0 <= j < n : m[j]2)
CI: norma =  (Sj : 0 <= j < i : m[j]2) e 0 <= i <= n
G: i <> n
2.c)  Crie o código C++ para a função acima baseado no desenvolvimento efectuado na alínea anterior.  Assuma que pode usar a função double sqr(double) para calcular o quadrado de um número e a função double sqrt(double) para calcular a raiz quadrada de um número.

[cotação: 3]

double norma(const double m[], const int n)
{
    double norma = 0.0;

    for(int i = 0; i != n; ++i)
        norma += sqr(m[i]);

    return sqrt(norma);
}

2.d)  Crie um pequeno programa para testar os procedimentos e funções acima (viz. lêMatriz() e norma()).

[cotação: 2]

#include <iostream>
#include <cmath> // para sqrt().

inline double sqr(double x) {
    return x * x;
}

// Definição de lêMatriz() e norma()...

int main()
{
    double m[5];
    lêMatriz(m, 5);
    cout << norma(m, 5) << endl;
}

Questão 3

Elabore um pequeno texto (sucinto) sobre as diferenças entre a passagem de argumentos por valor e por referência.

[cotação: 3]

Ver resumo teórico, Capítulo 3, Secção 3.2.7.