ISCTE - IGE

Programação I

1ª Frequência

1998/1999,  1º semestre



A azul e indentadas uma vez as resoluções dos exercícios.
Questão 1
a)  Quais das seguintes atribuições são válidas?

 V   i = 3456;
 V   f = 4;

É possível atribuir um valor aritmético inteiro a uma variável de vírgula flutuante.  Neste caso o valor int é convertido num float antes da atribuição.
 F   m1 = 2;
Não se pode atribuir um inteiro a uma matriz de inteiros.  Teria de se especificar um posição determinada (indexando a matriz).
 V   i = i1;

 [cotação: 2]

b)  Quais das seguintes instruções são válidas?

 F   m1 = m2;

Infelizmente atribuições entre matrizes são inválidas.
 V   m1[0] = 0;
 F   m2[10] = m1[1];
A matriz m2 tem 10 elementos, pelo que os índices válidos variam entre 0 e 9.
 [cotação: 1,5]

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

 F   int x = f2(m1, 10, 4);

Não se pode passar um valor literal (neste caso 4) por referência, a não ser que seja por referência constante!  O que aconteceria se a função f2() alterasse o parâmetro correspondente?
 V   int x = f2(m1, 10, i1);
Ver resposta anterior.
 [cotação: 1]

d) O que aparece no ecrã depois de executar o código que se segue?

void f4(int& a, int& b)
{
    a = 1;
    b = 0;
}
int main()
{
    int a = 10, b = 20;
    f4(b, a);
    cout << a << " " << b << endl;
}
 F  10 20
 V  0 1
 F  1 0
A variável b da função main() é passada como argumento no lugar do parâmetro a da função f4().  A variável a de main() é passada como argumento no lugar do parâmetro b.  Ambas as passagens fazem-se por referência.  Logo, alterar a dentro de f4() altera b em main(), e alterar b dentro de f4() altera a em main().
[cotação: 1,5]

e)  Se a função f2() for chamada na função main() do seguinte modo: int x = f2(m1, i1, i2);,  quais das seguintes instruções podem constar no corpo da função f2()?

 F   a = i1;

Na função f2() a variável i1 não está visível.
 F   i1 = 2;
Na função f2() a variável i2 não está visível.
[cotação: 1]

Questão 2

2.a)  Considere uma função int máximo(const int m[], const int n) que devolve o maior dos valores inteiros guardados na matriz m de dimensão n.  Dada a  pré-condição PC: n > 0, desenvolva a CO (condição objectivo), a CI (condição invariante), a G (guarda), a inicialização, o progresso e a acção do ciclo necessário na função, admitindo que esta começa com a definição duma variável local (int máximo = ??;) e termina devolvendo o seu valor (return máximo;).

[cotação: 3]

CO: (E j : 0 <= j < n : m[j] = máximo) e (Q j : 0 <= j < nm[j] <= máximo)
CI:  (E j : 0 <= j < i : m[j] = máximo) e (Q j : 0 <= j < im[j] <= máximo) e 0 <= i <= n
G: i <> n
inic: int i = 1; int máximo = m[0];
prog: ++i;
acção: if(m[i] > máximo) máximo = m[i];
2.b)  Crie o código C++ para a função acima baseado no desenvolvimento efectuado na alínea anterior.

[cotação: 4]

int máximo(const int m[], const int n)
{
    int máximo = m[0];
    for(int i = 1; i != n; ++i)
        if(m[i] > máximo)
            máximo = m[i];
    return máximo;
}
2.c)  Crie um pequeno programa para testar a função máximo().

[cotação: 3]

#include <iostream>

using namespace std;

int main()
{
    int m[5] = {1, 3, 4, 2, 1};

    cout << máximo(m, 5) << endl;
}

Questão 3

Diga quais as vantagens e as desvantagens da modularização do código em funções e procedimentos.

[cotação: 3]

Ver folhas teóricas, Capítulo 3, Secção 3.1.