ISCTE - ETI

Introdução à Programação

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   f = 3456;

É 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   ci = 4;
Não se pode alterar o valor de uma constante.
 F   m1 = 0;
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)  O que aparece no ecrã depois de executar o código que se segue?

i = 3;
if(i > 0)
    if(i > 10)
        cout << "A";
    else
        cout << "B";
else
    cout << "C";
 F   A
 V   B
 F   B C

 [cotação: 1,5]

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

 V  bool x = f1(4, 10);

Como f1() tem dois parâmetros do tipo int, é possível passar-lhe dois argumentos com valor do tipo int.
 V  bool x = f1(m1[0], 10);
O mesmo.  Sendo m1 uma matriz de int, m1[0] é um int (o valor do primeiro elemento da matriz).
 F  bool x = f1(m1, i2);
?Não se pode passar uma matriz como argumento no lugar de um parâmetro do tipo int.
 [cotação: 1,5]

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 x = 10, y = 20;
    f4(x, y);
    cout << x << " " << y << endl;
}
 V   10 0
 F   1 20
?As variáveis x e y são passadas a f4() por valor e referência, respectivamente.  Assim, só y é alterada.
[cotação: 1]

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

 V   n = a;

A variável n é um parâmetro não constante de f2() do tipo int.  A variável a é uma referência para um int não constante.
 F   i1 = i2;
?As variáveis i1 e i2 são invisíveis dentro da função f2().
[cotação: 1]

Questão 2

2.a)  Considere uma função float média(const float m[], const int n) que devolve a média dos valores 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 (float média = ??;) e termina devolvendo o seu valor (return média;).  Note que a CO do ciclo pode ser diferente da CO da função.

 [cotação: 3]

CO (da função): média =  (S j : 0 <= j < n : m[j]) / n
CO (do ciclo): média =  (S j : 0 <= j < n : m[j])
CI: média =  (S j : 0 <= j < i : m[j]) e 0 <= i <= n
G: i <> n
inic: int i = 0; float média = 0.0f;
prog: ++i
acção: média += 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]

float média(const float m[], const int n)
{
    float média = 0.0f;

    for(int i = 0; i != n; ++i)
        média += m[i];

    média /= n;

    return média;
}

2.c)  Crie um pequeno programa para testar a função média().

[cotação: 3]

int main()
{
    int m[5] = {1, 3, 4, 2, 1};
    cout << média(m, 5) << endl;
}
Questão 3

Diga quais as vantagens e as desvantagens da utilização de variáveis globais.

[cotação: 3]

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