Em C as instruções podem ser simples ou compostas. Até agora apenas vimos instruções simples. Exemplos:
x=7; printf(...); scanf(...);
Uma instrução composta é um conjunto de instruções delimitado por chavetas. Exemplo de uma instrução composta:
{ x=7; printf(...); scanf(...); }
Uma instrução composta também costuma ser designada por bloco. Além de conter instruções, os blocos também podem ter declarações de variáveis.
Os programas que vimos até agora têm a seguinte estrutura:
main() { declarações instrução1 instrução2 instrução3 ... instruçãoN }
O programa começa com a palavra main() e é seguido de um bloco. Esse bloco pode ter declarações (ex: variáveis) e depois aparece um conjunto de instruções que são executadas sequencialmente uma após outra. Contudo, há situações em que queremos que a execução das instruções não seja sequencial, existindo instruções especiais para consiguir tal efeito. Essas instruções chamam-se estruturas de controlo e alteram o fluxo sequencial do programa.
Nesta aula vamos aprender uma estrutura de controlo muito importante que permite que o computador tome decisões de modo a só executar instruções mediante a verificação de uma condição. Essa estrutura de controlo chama-se if-else.
Exemplo 1: o programa seguinte pede ao utilizador para introduzir um número e depois responde dizendo se o número é par ou ímpar.
#include <stdio.h> main() { int n; printf("Introduza um número inteiro: "); scanf( "%d", &n ); if( n % 2 == 0 ) printf("%d é par\n", n); else printf("%d é ímpar\n", n); }
Ao ser executado, o programa vai fazer o seguinte (o que aparece em bold é escrito pelo utilizador):
Introduza um número inteiro: 7 7 é ímpar
Exemplo 2: o programa seguinte pede ao utilizador para introduzir um número não negativo. Se o utilizador não obedecer, o computador escreve a mensagem: "Número inválido" no ecrã. Em ambos os casos, o computador termina com uma mensagem de "Até logo".
#include <stdio.h> main() { int n; printf("Introduza um número inteiro não negativo: "); scanf( "%d", &n ); if( n < 0 ) printf("Número inválido\n"); printf("Até logo\n"); }
Ao ser executado, o programa vai fazer o seguinte:
Introduza um número inteiro não negativo: 6 Até logo
Se a pessoa introduzisse um número negativo iria aparecer:
Introduza um número inteiro não negativo: -20 Número inválido Até logo
Antes de aprenderem a instrução if-else não podiam fazer este tipo de programas porque o computador executava sempre todas as instruções desde o início do programa. Com a instrução if-else o computador executa só algumas instruções. Tudo vai depender do valor da condição do if.
Em inglês, a palavra if significa se e a palavra else significa senão. Saber inglês ajuda bastante. O bocado:
if( n % 2 == 0 ) printf("%d é par\n", n); else printf("%d é ímpar\n", n);
significa:
se( n a dividir por 2 der resto 0 ) Escreve( n é par ); senão Escreve( n é ímpar )
O caso geral da instrução if-else é:
if( expressão ) instrução1 else instrução2
em que a parte do else é opcional. O if-else funciona do seguinte modo. O valor da expressão é calculado. Se for verdadeiro (em C, tudo o que é diferente de zero é verdadeiro), a instrução1 será executada mas a instrução2 não. Se a condição for falsa (o valor da expressão é zero), a instrução2 será executada mas a instrução1 não.
Reparem que uma instrução tanto pode ser simples como composta. Por outras palavras, se quiserem executar mais do que uma instrução simple, terão de agrupá-las dentro das chavetas e criar uma instrução composta. Exemplo:
if( expressão ) { instrução1 instrução2 instrução3 instrução4 } else { instrução5 instrução6 } instrução7 instrução8
No exemplo acima, se a expressão for verdadeira o computador irá executar as instruções 1, 2, 3, 4, 7, 8. Se a condição for falsa o computador irá executar as instruções 5, 6, 7, 8.
As instruções podem ser instruções quaisquer. Por exemplo, podem ser printf, scanf, instruções de atribuição, e até podem ser outras instruções if-else.
As expressões costumam ser expressões lógicas (condições) cujo valor é verdadeiro ou falso. Essas expressões podem usar os seguintes operadores relacionais:
Símbolo | Significado |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Mais um exemplo: o seguinte programa é uma modificação do programa que calcula a área de um círculo. Neste caso, se o utilizador introduzir um número negativo para o raio, o computador deve escrever que não consegue calcular a área. Caso contrário, calcula a área e escreve o resultado no ecrã.
#include <stdio.h> #define PI 3.14159 main() { float area, raio; printf("Introduza o raio: "); scanf("%f", &raio); if( raio < 0 ) printf("Não posso calcular a área\n"); else { area = PI * raio * raio; printf("A área é %f\n", area ); } }
Reparem que há muitas maneiras de se fazer o mesmo programa. O programa também poderia ter sido escrito assim:
#include <stdio.h> #define PI 3.14159 main() { float area, raio; printf("Introduza o raio: "); scanf("%f", &raio); if( raio >= 0 ) { area = PI * raio * raio; printf("A área é %f\n", area ); } else printf("Não posso calcular a área\n"); }
e também poderia ter sido escrito assim:
#include <stdio.h> #define PI 3.14159 main() { float area, raio; printf("Introduza o raio: "); scanf("%f", &raio); if( raio >= 0 ) { area = PI * raio * raio; printf("A área é %f\n", area ); } if( raio < 0 ) printf("Não posso calcular a área\n"); }