U
NIVERSIDADE
L
USÓFONA DE
H
UMANIDADES E
T
ECNOLOGIAS
C
URSO DE
E
NGENHARIA
E
LECTROTÉCNICA
1º Semestre 2003/2004
Introdução à Programação
21/2/2004
Correcção
1. Qual o objectivo dos comentários em C++ e o que é que o compilador faz com eles?
R: Os comentários têm como destinatários leitores humanos e destinam-se a
facilitar as tarefas de manutenção dos programas. Os comentários são
ignorados pelo compilador.
2. Dadas as seguintes declarações:
int i = 1, j = 2, k = 3;
double x = 3.5, y = 8.25;
Diga qual o valor de cada uma das expressões que se seguem:
2.1.
i + 4 * j - 2
2.2.
x + y / j
2.3.
k / 2 * j
2.4.
k / j + i
R: 7
7.675
2
2
Multiplicações e divisões realizadas primeiro. Operações com operandos
inteiros têm resultado inteiro. Operações com pelo menos um operando em
virgula flutuante têm resultado em virgula flutuante.
3. Identifique e corrija os erros nos seguintes fragmentos de programa. Assuma que
todas as variáveis foram previamente declaradas.
3.1.
if (10 < valor < 20) cout << “OK”; elsecout << “ERRADO”;
R:
if (10 < valor && valor < 20)
cout << “OK”; else
cout << “ERRADO”;
3.2.
if (valor >= 0);cout << “Positivo ou Nulo”; else
cout << “Negativo”;
R:
if (valor >= 0)
cout << “Positivo ou Nulo”;
else
cout << “Negativo”;
3.3.
void func(int m, int n) { return (3.0 * n + m); }R:
double func(int m, int n) {
return (3.0 * n + m); }
3.4.
sum = 0; i = 1; while (i < n) sum = sum + i; i++;cout << “A soma e’ ” << sum << endl;
R:
sum = 0; i = 1; while (i < n) { sum = sum + i; i++; }cout << “A soma e’ ” << sum << endl;
4. Escreva um conjunto de instruções if-else que seja equivalente a:
switch (letra) { case 'p':
cout << "Escolheu papel" << endl; break;
case 't': case ‘T’:
cout << "Escolheu tesoura" << endl; break;
default:
cout << "Não conheço essa" << endl; break;
}
R:
if (letra == ‘p’) {
cout << "Escolheu papel" << endl; }
else if (letra == ‘t’ || letra == ‘T’) { cout << "Escolheu tesoura" << endl; }
else {
cout << "Não conheço essa" << endl; }
5. Considere os dois fragmentos de programa que de seguida se ilustram. Assuma que x
y
e z são variáveis inteiras:
// fragmento 1 | // fragmento 2
if (x > 0) | if (x > 0) z = z + 1; | z = z + 1; else if (y > 0) | if (y > 0) z = 8; | z = 8;
5.1. Desenhe um diagrama de fluxo para cada um dos fragmentos.
R:
// fragmento 1 | // fragmento 2
5.2. Escolha valores de x e y de modo que os fragmentos sejam equivalentes?
R: Por exemplo x = 0, y = 1
5.3. Escolha valores de x e y de modo que os fragmentos não sejam equivalentes?
R: Por exemplo x = 1, y = 1
X > 0 N S S X > 0 N z = z + 1 z = 8 z = z + 1 N S y > 0 z = 86. Considere os o seguinte ciclo de repetição:
for (i = 0; i < 10; i++) {
if ((i % 2) == 0) {
cout << i << endl;
}
}
6.1. Identifique neste ciclo for as seguintes secções:
Inicialização, Teste, Incremento, Corpo do ciclo.
R:
Inicialização:
i = 0;
Teste:
i < 10
Incremento:
i++;
Corpo:
if ((i % 2) == 0) {
cout << i << endl;
}
6.2. Qual o resultado no ecrã da execução deste ciclo?
R:
0
2
4
6
8
6.3. Rescreva o ciclo utilizando um while.
R:
i = 0;
while (i < 10) {
if ((i % 2) == 0) {
cout << i << endl;
}
i++
}
7. Diga qual o resultado produzido no ecrã pelos seguintes programas. Represente
espaços com ∪ e mudanças de linha com ↵.
7.1.
#include <iostream> using namespace std; void main() { int items = 6; int caixasCheias = 0; int j;while (items > 0 && caixasCheias <= 3) { for (j = 0; j < 2; j++) {
items --; }
caixasCheias++;
cout << caixasCheias << " caixa"; if (caixasCheias > 1) { cout << "s"; } cout << " cheia"; if (caixasCheias > 1) { cout << "s, "; } else { cout << ", "; }
cout << items << " items restantes" << endl;
} }
R:
1 caixa cheia, 4 items restantes
2 caixas cheias, 2 items restantes
3 caixas cheias, 0 items restantes
7.2.
#include <iostream> using namespace std;
void misterio(int m, int n) { int i, j; for (i = 1; i <= m; i++) { for (j = 1; j <= n; j++) { if (i == 1 || i == m || j == 1 || j == n) { cout << "*"; } else { cout << " "; } } cout << endl; } } int main(void) { misterio(6, 4); }
R:
**** * * * * * * * * ****7.3.
#include <iostream> using namespace std; void main() { int i, j; for (i = 1; i <= 3; i++) { for (j = 1; j <= 5 - i; j++) { cout << "O"; } cout << endl; } }R:
**** *** **
7.4.
#include <iostream> using namespace std; void main() { int num = 3; while (num > 1) { cout << num << endl; if (num % 2 == 0) { num = num / 2; } else { num = 3 * num + 1; } } }R:
3
10
5
16
8
4
2
8. Escreva um fragmento de código em C++ que declare, inicialize e preencha um
array de inteiros. Depois de o seu código executar, o array deverá ter o seguinte
aspecto:
0 2 4 6 8 10
12
14
16
18
R:
int ArrayInt[] = {0, 2, 4, 6, 8, 10, 12, 14, 16, 18};
9. Escreva uma função chamada
Inverte()
que aceita dois parâmetros – um array
de caracteres e o número de caracteres existente nesse array – e inverte os
caracteres existentes no array (o primeiro passa a último, o segundo a penúltimo,
etc.).
R:
void Inverte(int a[], int n)
{
int tmp;
for (int i = 0; i < n/2; i++) {
tmp = a[i];
a[i] = a[n-1-i];
a[n-1-i] = tmp;
}
}
10. O sen x pode ser calculado utilizando a expansão da série de Taylor:
⋅⋅
⋅
+
−
+
−
=
!
7
!
5
!
3
7 5 3x
x
x
x
x
sen
Escreva a função double MeuSeno(double x) que calcula o sen x, utilizando um
ciclo de repetição for. A sua função apenas deverá calcular os primeiros 10 termos,
isto é, até ao termo x
19/19!.
R:
double MeuSeno(double x) {
int i;
double term, sinx; sinx = term = x; for (i = 1; i < 10; i++) { term *= -1*x*x / ((2*i)*(2*i+1)); sinx += term; } return sinx; }