4.1
Linguagem C
25.ª Edição Atualizada e Aumentada
FCA Editora (c) 2025
4.2
4.1
FCA Editora (c) 2025
4.2
a) Verdade.
b) Falso. Só executam o corpo do ciclo se a condição for verdadeira.
c) Verdade.
d) Falso. Todas as componentes são de preenchimento opcional, embora tenha de se colocar sempre os dois separadores das componentes ( ; ).
e) Verdade.
f) Verdade. Se não fosse assim, o compilador deixaria de saber que componentes pertenciam a cada parte do ciclo for
g) Falso. Se a condição do ciclo for ou while for falsa à partida, a instrução do ciclo nunca é executada. Esta afirmação só é verdadeira para o ciclo do … while, pois o teste da condição é feito depois de a instrução ter sido executada.
h) Falso. As inicializações são sempre executadas uma única vez.
i) Falso. A condição de teste no ciclo é sempre testada mais uma vez do que o número de vezes que a instrução é executada. Este teste extra é realizado quando a condição é falsa, não sendo, por isso, executada a instrução.
j) Verdade.
k) Falso. Um ciclo é uma única instrução.
l) Verdade.
m) Verdade.
n) Verdade.
o) Falso. Nenhum ciclo o faz. Essa tarefa compete ao programador.
p) Falso. O ciclo é executado enquanto a condição se verificar. Compete ao programador atualizar a variável de controlo do ciclo após cada iteração.
q) Verdade.
r) Falso. Termina o ciclo. O programa continua na instrução a seguir ao ciclo.
s) Verdade. Caso não o faça, poderá entrar numa situação de ciclo infinito.
t) Verdade.
do instrução; while (condição);
condição = Verdade; /* Obrigar a */ while (condição) /* entrar no ciclo */ instrução;
4.3 for (inic; condição ; pos-inst) instrução; inic; while (condição) { instrução; pos-inst; }
4.4 while (condição) instrução; for (; condição ;) instrução;
4.5 Nenhuma: o ciclo termina e o programa continua na instrução seguinte.
4.6 A instrução continue, quando presente num ciclo while, termina a instrução do ciclo, passando a execução para a avaliação da condição. Quando presente no ciclo for, a instrução continue termina a execução da instrução, sendo, em seguida, executada a componente pós-instrução do ciclo for. Desta forma, no ciclo while, o programador terá de ter o cuidado de atualizar as variáveis de controlo do ciclo antes de utilizar a instrução continue, de modo a evitar ciclos infinitos.
4.7 O seguinte extrato de programa
i=1;
while (i<=20)
{ if (i==10) continue;
else
printf("%d\n", i); i++; }
não é equivalente ao extrato solicitado, pois, quando a variável toma o valor 10 , a instrução termina passando ao teste da condição sem que o valor da variável de controlo tenha sido alterado. É gerado um ciclo infinito, pois a variável i nunca deixa de ter o valor 10 . A resolução correta poderia ser implementada, por exemplo, da seguinte forma:
i=1; while (i<=20)
{ if (i==10)
{ i++; /* atualizar a var. antes de voltar a testar a cond.*/ continue;
} else
printf("%d\n", i);
i++;
}
4.8 De notar que o ciclo exterior indica o número de linhas que serão apresentadas (n linhas). No entanto, cada uma das linhas tem de apresentar apenas o número de asteriscos igual ao número da linha em questão, de modo a mostrar um triângulo. Desta forma, o ciclo interior terá de iterar apenas um número de vezes igual ao número da linha que está, nesse momento, a ser processada. Depois de escritos todos os asteriscos de uma linha, é necessário mudar de linha, escrevendo um ' \n'. Este é um exemplo típico de um ciclo interior cujo número de iterações depende do valor da variável de controlo do ciclo exterior.
1: #include <stdio.h> 2:
3: int main(void)
4: { 5: int n;
6:
7: printf("Qual o nº de ramos: "); scanf("%d", &n); 8: for (int i=1 ; i<=n ; i++)
9: { 10: for (int j=1 ; j<=i ; j++)
11: putchar('*'); 12: putchar('\n'); 13: }
14: return 0; 15: }
PROG0422.C
4.9 De notar que, na primeira linha, pretende-se escrever a letra 'A', na segunda, a letra 'B' (que é igual a 'A' + 1 ), e assim sucessivamente. Para tal, podemos usar a variável que controla as linhas para ir acrescentando 1 unidade ao caráter a ser escrito em cada uma das linhas. No entanto, como a variável i começa com o valor 1, e não 0 , como seria desejável para escrever a letra 'A' na primeira linha, somos obrigados a subtrair 1 unidade a cada caráter escrito para obter o caráter correto.
1: #include <stdio.h>
2:
3: int main(void)
4: { 5: int n; 6:
7: printf("Qual o nº de ramos: "); scanf("%d", &n);
8: for (int i=1 ; i<=n ; i++)
9: { 10: for (int j=1 ; j<=i ; j++)
11: putchar('A'+i-1); 12: putchar('\n'); 13: } 14: return 0; 15: }
4.10
1: #include <stdio.h> 2:
3: int main(void)
4: { 5: char ch; 6: 7: do 8: { 9: printf("Introduza um char: "); 10: scanf(" %c", &ch); 11: }
12: while ( (!(ch>='a' && ch<='z')) && 13: (!(ch>='A' && ch<='Z'))); 14: 15: printf("Foi Introduzido o char '%c' com o ASCII %d\n", ch, ch); 16: return 0; 17: }
PROG0424.C
4.11
4.12
1: #include <stdio.h>
2:
3: int main(void)
4: {
5: int n_min, n_max; 6:
7: do
8: { 9: printf("Introd. um nº entre 0 e 127: "); 10: scanf("%d", &n_min); 11: }
12: while (n_min < 0 || n_min > 127); 13: 14: do
15: { 16: printf("Introd. outro nº entre 0 e 127: "); 17: scanf("%d", &n_max);
18: }
19: while (n_max < 0 || n_max > 127);
20:
21: // Ver se é necessário trocar os valores das variáveis
22:
23: if (n_min > n_max)
24: { 25: int tmp = n_min; 26: n_min = n_max;
27: n_max = tmp;
28: }
29:
30: for (int i=n_min ; i<=n_max ; i++)
31: printf("%3d --> %c\n", i, (char) i);
32:
33: return 0; 34: }
Na primeira instrução, x recebe o valor de i já incrementado, ao passo que, na segunda instrução, o valor de i só é incrementado depois de atribuído a x :
i=5; x= ++i; printf(" %d %d", i, x); /* Mostra 6 6 */
4.13 Sim.
i=5; x= i++; printf(" %d %d", i, x); /* Mostra 6 5 */
4.14 Não. Estes operadores só podem ser utilizados em variáveis.
4.15 Na instrução a=-2, a variável a recebe o valor -2 e, na instrução a-=2, o valor de a é decrementado em 2 unidades. Lembrar que a-=2 é equivalente a a=a-2
4.16 O programa vai entrar (teoricamente) num ciclo infinito, pois o teste do ciclo é realizado apenas depois de a variável ser incrementada, nunca sendo, por isso, igual a zero. De notar que se trata de um ciclo do … while
4.17 A diferença entre os dois pedaços de código está na altura em que a variável i é incrementada e no valor da variável que é usado para o teste da condição do ciclo while :
i = 0; while (i++) printf("%d\n", i); i = 0; while (++i) printf("%d\n", i);
No exemplo da esquerda, o valor de i é usado no teste do ciclo while. Como i tem o valor 0 (falso ), o ciclo termina imediatamente e o printf nunca chega a ser executado. Na instrução seguinte, o valor de i já será igual a 1. No exemplo da direita, o valor de i é incrementado antes de ser avaliado na condição do ciclo. Assim, no primeiro teste da condição, o valor de i vai ser igual a 1, e não 0 , como no exemplo anterior, pois o incremento é realizado antes da utilização da variável. Estamos perante um ciclo (teoricamente) infinito, pois a condição será sempre diferente de 0
4.18 O ciclo, em cada uma das 200 iterações, executa a sua instrução, mas não é o printf. Neste caso, executa 200 vezes a instrução vazia que é indicada pelo ponto e vírgula, o qual, provavelmente, o programador colocou a seguir ao for por engano. Só em seguida escreve o valor de i, que é igual a 201: for (i=1; i<=200 ; i++) ; printf("%d\n", i);
4.19
a) 20 vezes.
b) 10 vezes (para os valores de i = 1, 3, 5, 7, 9, 11, 13, 15, 17, 19).
c) 41 vezes (20 – (–20) + 1).
d) 50 vezes (10*5).
4.20
De notar que !z não coloca em z o valor lógico contrário ao que z tem, pois uma variável só é alterada quando se lhe faz alguma atribuição. Exemplos: z = !z ou quando se usam os operadores ++ ou
A instrução !z não faz rigorosamente nada. Em princípio, o compilador emite o aviso correspondente.