Linguagem C_Exercicios Propostos Solucao_4

Page 1


4.1

Linguagem C

25.ª Edição Atualizada e Aumentada

FCA Editora (c) 2025

4.2

4

EXERCÍCIOS PROPOSTOS – SOLUÇÃO

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

PROG0423.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);

PROG0425.C

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.

Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.