Departamento de Ciência de Computadores
Introdução à Programação CC111
FCUP
2010/11
Folha 3
Em todos os problemas desta folha, todos os dados são lidos do standard input.
1. Sem usar o computador, siga o funcionamento de cada um dos programas seguintes anotando
a variação dos valores das variáveis, e indique qual o valor que escreve para o standard output (por
defeito, o ecrã). Diga ainda qual é o objectivo do programa. Descreva o que guarda cada variável.
a) Considere que os valores dados no input são 26 4.
// Surpresa 3.1
#include <stdio.h>
int main() {
int n, k, i, r;
printf("Indique dois inteiros positivos\n");
scanf("%d %d",&n,&k);
r = 0;
for (i = n; i > 0; i--)
if (i%k == 0)
r += i;
printf("resultado = %d\n",r);
return 0;
}
b) Considere que os valores dados no input são 1032 8 (e, noutro caso, 1032 2)
// Surpresa 3.2
#include <stdio.h>
int main() {
int n, b, aux, p;
scanf("%d %d",&n,&b);
if (n > 0 && b >= 2 && b <= 10){
p = 1;
for (aux = n; aux >= b; aux = aux/b)
p *= b;
while (p != 1) {
printf("%d ",n/p);
n %= p;
p /= b;
}
printf("%d\n",n);
}
return 0;
}
1
c) Considere que os valores dados no input são 12 10 9 15 16 8 13 10 14 5 8 19 20
// Surpresa 3.3
#include <stdio.h>
int main() {
int n, k, v, c=0;
scanf("%d",&n);
for (k=0; k<n; k++) {
scanf("%d",&v);
if (v >= 10)
c++;
}
printf("%d/%d\n",c,n);
return 0;
}
2. Siga o programa seguinte para a sequência de valores 10 5 0 4 16 -8 1 3 -1 -10 7 8 3 e
justifique que escreveria no standard output o que está na coluna da direita.
>>>>
9
-16
>>>>
4
-6
>>>>
0
>>>>
3
-4
>>>>
15
-28
>>>>
-8
>>>>
>>>>
2
-2
>>>>
-1
#include <stdio.h>
int main() {
int n;
scanf("%d",&n);
while (n != -10) {
printf(">>>> Para %d\n",n);
if (--n > 0) {
printf("%d\n",n++);
n = -2*n+3;
}
if (n++ < 0)
printf("%d\n",n);
scanf("%d",&n);
}
return 0;
}
Para 10
Para 5
Para 0
Para 4
Para 16
Para -8
Para 1
Para 3
Para -1
Para uma outra sequência à sua escolha, siga o programa e escreva o resultado. Depois, execute o
programa no computador, com redireccionamento do standard output para um ficheiro (não existente
no directório corrente), e verifique se a sua resposta está correcta.
3. Escreva um algoritmo para analisar uma sequência de n inteiros, com n ≥ 2, sendo n dado
antes, e indicar a menor diferença em valor absoluto entre elementos consecutivos. Por exemplo,
para 5 4 7 9 1 -8 o resultado seria 2. Indique a interpretação dada a cada variável e codifique o
algoritmo em linguagem C.
4. Escreva um programa para calcular o factorial de um inteiro n não negativo dado. Recorde que:
n! = n × (n − 1) × · · · × 2 × 1, se n ≥ 1, e 0! = 1. A partir de que valor de n o resultado produzido
pelo programa pode não estar correcto? Explique.
2
5.
Escreva um algoritmo para analisar uma sequência de n inteiros, com n ≥ 1, e verificar se
existe alguma subsequência não decrescente que tenha pelo menos k elementos, sendo k e n dados
antes. Deve obter como resultado Sim ou Nao. Por exemplo, para 3 10 9 7 14 7 9 1 -8 -15 -5 8
escreveria Sim e para 4 10 9 7 4 7 9 1 -8 15 5 8 escreveria Nao.
Indique a interpretação dada a cada variável e codifique o algoritmo em linguagem C.
6. Escreva um programa para determinar, por qualquer ordem, os divisores positivos de um dado
inteiro positivo n, que
a) considere apenas todos os inteiros d de 1 até n
b) considere apenas todos os inteiros d de 1 até n/2, e ainda n.
√
c) considere apenas inteiros d de 1 até d, ou seja, tais que d × d ≤ n, e ainda n.
Justifique a correcção do algoritmo em cada caso.
7. Adapte o programa que escreveu em 6c) para determinar apenas mdc(a, b) e mmc(a, b), sendo
a e b inteiros positivos. Para 45 e 126, o programa deve escrever no standard output apenas as duas
linhas seguintes (execute o programa com redireccionamento de output e verifique que o faz):
mdc(45,126) = 9
mmc(45,126) = 630
Para recordar (e saber):
Um número inteiro a é divisı́vel por um inteiro d 6= 0 sse existir um inteiro q tal que a = q × d,
dizendo-se que d é divisor de a e a é múltiplo de d.
Qualquer que seja o inteiro positivo a:
• os divisores de a pertencem a [−a, −1] ∪ [1, a]; os divisores positivos de a pertencem a [1, a].
• se d é divisor positivo de a então a/d também é (assim, por exemplo, os divisores positivos de
100 são 1, 100, 2, 50, 4, 25, 5, 20, e 10)
• os múltiplos de a são os inteiros da forma k × a, com k inteiro (negativo, positivo, ou zero); os
múltiplos positivos de a são os inteiros da forma k × a, com k ≥ 1.
Quaisquer que sejam os inteiros positivos a e b:
• mmc(a, b) designa o mı́nimo multiplo comum (positivo) de a e b, ou seja, o menor múltiplo
positivo de a que também é múltiplo de b, sendo mmc(a, b) = mmc(b, a).
• mdc(a, b) designa o máximo divisor comum de a e b, ou seja, o maior divisor de a que é divisor
de b, sendo mdc(a, b) = mdc(b, a).
• Pode-se mostrar que: max(a, b) ≤ mmc(a, b) ≤ a × b, 1 ≤ mdc(a, b) ≤ min(a, b) e
mmc(a, b) =
a×b
mdc(a, b)
sendo max(a, b) e min(a, b) o máximo e o mı́nimo entre a e b.
• Um inteiro positivo a é primo se tem exactamente dois divisores positivos 1 e a e é composto
se tem outros divisores positivos além de 1 e a. Qualquer inteiro positivo diferente de 1, ou é
primo ou é composto.
3
Download

Folha de exercícios 3 - Departamento de Ciência de Computadores