Linguagem C
25.ª Edição Atualizada e Aumentada
FCA Editora (c) 2025
Linguagem C
FCA Editora (c) 2025
3.1 As variáveis do tipo float ou double podem conter erros de arredondamento, devido ao conjunto de operações a que poderão ter sido sujeitas e devido ao formato usado para a sua representação em memória. Pode acontecer que uma variável contenha um valor próximo de 0.0 (por exemplo, 0.00000001 ), o que representa, então, verdade, e não falso, como seria esperado pelo programador.
3.2
a) Verdade.
b) Verdade. É a própria estrutura da linguagem que o determina.
c) Falso.
d) Verdade. Mesmo um bloco é considerado uma única instrução, apesar de poder conter várias instruções no seu interior.
e) Falso. O programador organiza o código como bem entender.
f) Verdade. Qualquer delas tem associado um valor que pode ser analisado e avaliado como valor lógico.
3.3 A instrução if-else contém apenas uma instrução a seguir ao if. O compilador verifica se, a seguir a essa instrução, aparece a palavra else. Caso não apareça, é porque o if terminou (isto é, não tem else ) e a próxima instrução não pertence ao if. O mesmo se passa em relação ao else
3.4 Sim, nada o impede.
3.5 Não.
3.6 Sim. O extrato da esquerda verifica se x é igual a zero. Caso seja, escreve a string XXX , senão, escreve YYY. O extrato da direita não faz um teste, mas uma atribuição do valor zero a x , alterando o valor da variável. Como em C qualquer atribuição devolve o valor atribuído, o valor da atribuição é zero, sendo este o valor que vai ser avaliado pela instrução if. Como em C zero representa falso, o programa vai sempre escrever YYY no ecrã, independentemente do valor presente inicialmente na variável x. Acresce o facto de a variável x ser alterada e ficar com ovalor zero.
3.7 d) Leitura do código.
3.8 c) Mais legível do que outro que não esteja indentado.
3.9 d) Um compilador não faz qualquer tipo de verificação da indentação.
3.10 Vantagens:
■ A instrução if-else permite o teste de condições que não estão limitadas a valores constantes;
■ A instrução if-else permite a verificação de mais de uma condição: if (x>10 && x<100)
Desvantagens:
■ Quando o número de condições é muito elevado, if-else encadeados podem tornar o código particularmente difícil de ler;
■ A instrução switch permite processar diversos case, controlando-os com a instrução break
3.11 Não se pode utilizar a instrução break num if. A instrução break pode apenas ser usada no switch (e em ciclos, como verá no Capítulo 4).
3.12
3.13
a) Falso.
b) Verdade.
c) Verdade. /* Notar que é uma atribuição */
d) Falso. /* Notar que é uma atribuição */
a) Falso.
b) Verdade.
c) Falso, pois o resultado da expressão é zero.
d) Verdade.
3.14 if (x == 0 && y <= 32) printf("Sucesso!!!"); 3.15
3.15.1 break dentro de um if
3.15.2 Em C, if não tem then
3.15.3 switch não tem else, mas default . 3.16
1: #include <stdio.h> 2: /* Versão 1 */ 3: int main(void)
4: { 5: int n;
6: printf("Introd. um nº: "); scanf("%d", &n);
7: 8: if (n==0)
9: printf("Número é igual a zero\n"); 10: else
11: printf("Número não é igual a zero\n");
12:
13: return 0; 14: } PROG0326A.C
1: #include <stdio.h> 2: /* Versão 2 */ 3: int main(void)
3.17
4: { 5: int n;
6: printf("Introd. um nº: "); scanf("%d", &n);
7:
8: if (!n)
9: printf("Número é igual a zero\n"); 10: else
11: printf("Número não é igual a zero\n"); 12:
13: return 0; 14: }
PROG0326B.C
1: #include <stdio.h>
2: /* Versão 3 */
3: int main(void)
4: {
5: int n;
6: printf("Introd. um nº: "); scanf("%d", &n);
7:
8: if (n!=0)
9: printf("Número não é igual a zero\n"); 10: else
11: printf("Número é igual a zero\n"); 12:
13: return 0; 14: }
PROG0326C.C
1: #include <stdio.h>
2: /* Versão 4 */
3: int main(void)
4: { 5: int n;
6: printf("Introd. um nº: "); scanf("%d", &n);
7:
8: if (n)
9: printf("Número não é igual a zero\n"); 10: else
11: printf("Número é igual a zero\n"); 12: 13: return 0; 14: }
PROG0326D.C
1: #include <stdio.h> 2: int main(void)
3: { 4: int n; 5: printf("Introd. um nº: ");scanf("%d", &n); 6: switch (n)
7: { 8: case 0: printf("Número é igual a zero\n");
9: break; 10: default: printf("Número não é igual a zero\n"); 11: }
12: return 0; 13: }
PROG0327.C
3.18
3.19
1: #include <stdio.h>
2: int main(void)
3: { 4: int ano;
5: printf("Introd. um anoº: ");scanf("%d", &ano);
6: if (ano%4 == 0)
7: printf("Ano é Bissexto\n"); 8: else
9: printf("Ano não é Bissexto\n"); 10: return 0; 11: }
a)
b)
1: #include <stdio.h>
2: int main(void)
3: { 4: int mes, n_dias;
5: printf("Introd. o nº do mes 1..12: "); 6: scanf("%d", &mes);
7:
8: if (mes == 2)
9: n_dias = 28; 10: else
11: if (mes == 4 || mes == 6 || mes == 9 || mes == 11) 12: n_dias = 30; 13: else
14: n_dias = 31; 15:
16: printf("O mes %d tem %d dias\n", mes, n_dias); 17: return 0; 18: }
PROG0329A.C
1: #include <stdio.h>
2: int main(void)
3: { 4: int mes, n_dias; 5: printf("Introd. o nº do mes 1..12: "); 6: scanf("%d", &mes);
7: 8: switch(mes)
9: { 10: case 2: n_dias = 28; 11: break; 12: case 4: 13: case 6: 14: case 9: 15: case 11: n_dias = 30; 16: break; 17: default: n_dias = 31; 18: }
19:
20: printf("O mes %d tem %d dias\n", mes, n_dias); 21: return 0; 22: }
PROG0329B.C
1: #include <stdio.h>
2: int main(void)
3: { 4: int mes, n_dias=0; 5: printf("Introd. o nº do mes 1..12: "); 6: scanf("%d", &mes); 7: 8: switch(mes)
9: { 10: case 1: /* 31 dias */ 11: case 3: 12: case 5: 13: case 7: 14: case 8: 15: case 10: 16: case 12: n_dias = n_dias + 1; 17: 18: case 4: /* 30 dias */ 19: case 6: 20: case 9:
21: case 11: n_dias = n_dias + 2; 22:
23: default: n_dias = n_dias + 28; 24: }
25:
26: printf("O mes %d tem %d dias\n", mes, n_dias); 27: return 0; 28: }
Todos os meses têm, pelo menos, 28 dias. No entanto, alguns têm de apresentar 30 dias (2 + 28) e outros 31 dias (1 + 2 + 28).
1: #include <stdio.h> 2:
3: int main(void)
4: { 5: int dia, mes, ano; 6: printf("Data: dd mm aaaa: "); 7: scanf("%d %d %d", &dia, &mes, &ano); 8: switch(mes)
9: { 10: case 2: if (dia >=1 && dia <= 28 + (ano%4==0)) 11: printf("Data Valida"); 12: else
13: printf("Data Invalida"); 14: break; 15: case 4: 16: case 6: 17: case 9:
18: case 11: if (dia >=1 && dia <= 30)
19: printf("Data Valida"); 20: else
21: printf("Data Invalida");
22: break;
23: default: if (mes <1 || mes > 12)
24: printf("Data Invalida");
25: else
26: if (dia >=1 && dia <= 31)
27: printf("Data Valida");
28: else
29: printf("Data Invalida");
30: }
31:
32: return 0;
33: }
PROG0330.C
De notar que a expressão ano%4==0 devolve o valor 1 ou 0 , consoante o ano seja múltiplo de 4 ou não. Este valor é, então, adicionado a 28 , de modo a obter o valor 29 ou 28 , conforme o ano seja bissexto ou não.