Programação I/Introdução à Programação
Frequência tipo
1998/1999, 1º semestre
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)
{
...
}
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:V i = 5/6;c = 'A';
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);
F int x = f2(i1, i2, m1);A variável i não é uma matriz.
Idem. E m1 não é um int.[cotação: 1.5]
d) Dado o seguinte código
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)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.
{
for(int i = 0; i != n; ++i)
cin >> m[i];
}
[cotação: 2]
CO (da função): norma = (S j : 0 <= j < n : m[j]2)½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.
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
[cotação: 3]
double norma(const double m[], const int n)2.d) Crie um pequeno programa para testar os procedimentos e funções acima (viz. lêMatriz() e norma()).
{
double norma = 0.0;for(int i = 0; i != n; ++i)
norma += sqr(m[i]);return sqrt(norma);
}
[cotação: 2]
#include <iostream>Questão 3
#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;
}
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.