Programação I
1ª Frequência
1998/1999, 1º semestre
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;
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)F 10 20
{
a = 1;
b = 0;
}
int main()
{
int a = 10, b = 20;
f4(b, a);
cout << a << " " << b << endl;
}
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 < n : m[j] <= máximo)2.b) Crie o código C++ para a função acima baseado no desenvolvimento efectuado na alínea anterior.
CI: (E j : 0 <= j < i : m[j] = máximo) e (Q j : 0 <= j < i : m[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];
[cotação: 4]
int máximo(const int m[], const int n)2.c) Crie um pequeno programa para testar a função máximo().
{
int máximo = m[0];
for(int i = 1; i != n; ++i)
if(m[i] > máximo)
máximo = m[i];
return máximo;
}
[cotação: 3]
#include <iostream>Questão 3using namespace std;
int main()
{
int m[5] = {1, 3, 4, 2, 1};cout << máximo(m, 5) << endl;
}
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.