Na aula anterior aprendemos que, na linguagem C, os programas são executados sequencialmente, i.e. linha por linha, incondicionalmente.
No entanto, frequêntemente precisamos que o programa tome decisões, e aja de acordo com algumas condições encontradas. Para podermos fazer isso, vamos aprender sobre estruturas condicionais.
Uma estrutura condicional define um bloco de código. Esse bloco de código só é executado se a CONDIÇÃO dada for verdadeira. Se a condição for falsa, as linhas dentro do bloco condicional são puladas.
Um bloco condicional é definido usando a palavra reservada if:int main(){ char estudante, nome[100]; double preco = 30.0; printf("Digite o nome do cliente : "); scanf("%s", nome); printf("O cliente %s eh estudante ? (S/N) : ", nome); scanf(" %c", &estudante); if ( estudante == 'S' ) { preco = preco/2.0; } printf("O ingresso para o(a) %s : R$%.2lf\n",nome,preco); return 0; }
Algumas observações inportantes:
Nas estruturas condicionais simples, compostas simplesmente por um if, caso a condição dada seja falsa, as linhas do bloco condicional serão puladas, e as linhas seguintes executadas incondicionalmente. No entanto, pode ser interessante tomar uma ação diferente se a condição for falsa. Para isso utilizamos condicionais compostos.
Nessas estruturas, temos 2 blocos condicionais em sequência: o primeiro é executado se a condição dada for verdadeira, o segundo é executado se a condição for falsa.
Note que, como uma condição só pode ser verdadeira ou falsa (ou seja, é booleana), um dos blocos condicionais será executado.
A estrutura extra é definida usando a palavra reservada else. Todo else precisa ser precedido por um if correspondente.
int main(){ char nome[100]; double nota1, nota2, nota3, nota_final; printf("Digite o nome do(a) aluno(a) : "); scanf("%s", nome); printf("Digite a nota da prova 1 : "); scanf("%lf", ¬a1); printf("Digite a nota da prova 2 : "); scanf("%lf", ¬a2); printf("Digite a nota da prova 3 : "); scanf("%lf", ¬a3); nota_final = ( ( 2 * nota1) + ( 2 * nota2 ) + ( 3 * nota3 ) )/7.0; if ( nota_final >= 5.0 ) { printf("%s foi aprovado com %.2lf!!\n", nome, nota_final); } else{ printf("%s foi reprovado por %.2lf :(\n", nome, 5.0 - nota_final); } return 0; }
Por vezes, pode ser que 2 casos nao sejam suficientes para decidir a ação correta a ser executada pelo programa. Por exemplo, se tiver 2 variáveis booleanas de controle já temos um total de 4 possibilidades.
Nesses casos, podemos encadear as estruturas condicionais, criando diversos blocos condicionais. Isso é feito adicionando novas condições ao bloco else de um if anterior.
int main(){ char nome[100]; double nota1, nota2, nota3, frequencia, nota_final; printf("Digite o nome do(a) aluno(a) : "); scanf("%s", nome); printf("Digite a nota da prova 1 : "); scanf("%lf", ¬a1); printf("Digite a nota da prova 2 : "); scanf("%lf", ¬a2); printf("Digite a nota da prova 3 : "); scanf("%lf", ¬a3); printf("Digite a porcentagem da frequencia : "); scanf("%lf", &frequencia); nota_final = ( ( 2 * nota1) + ( 2 * nota2 ) + ( 3 * nota3 ) )/7.0; if(frequencia < 75.00){ printf("%s foi reprovado, menção : SR\n",nome); } else if(nota_final < 3.0){ printf("%s foi reprovado, menção : II\n",nome); } else if(nota_final < 5.0){ printf("%s foi reprovado, menção : MI\n",nome); } else if(nota_final < 7.0){ printf("%s foi aprovado, menção : MM\n",nome); } else if(nota_final < 9.0){ printf("%s foi aprovado, menção : MS\n",nome); } else{ printf("%s foi aprovado, menção : SS\n",nome); } return 0; }
Algumas observações importantes:
Todas as condições de um bloco condicional devem ser expressões que possam ser avaliadas como verdadeiras ou falsas. No entanto, é possível combinar expressões diferentes utilizando operadores lógicos, criando assim condições compostas de múltiplas expressões.
Os operadores lógicos disponíveis são:
&&
||
!
if ( (x > 0) && (y < 0)){ /* Executado se X for positivo E y negativo */ } if ( (in == 'S') || (in == 's')){ /* Executado se in for 'S' OU 's'*/ } if ( !end ){ /* Executado se end for FALSO */ } if ( (!achou) && (idx < tamanho)){ /* Executado se achou for falso E idx menor do que tamaho */ }
Note que cada expressão precisa estar delimitada por parênteses.
Teste de Seleção 1 | Fórmula de Bhaskara | Intervalo |
Lanche | ... ATÉ ... | Mês |
Além dos condicionais if/else, a linguagem C possui outra maneira de criar blocos condicionais, através da palavra reservada switch (muito utilizado para criar menus).
O switch é utilizado quando sabemos que existem alguns casos que podem acontecer, na prática, se conhecemos alguns dos valores que uma variável pode assumir. Nesse caso, definimos a estrutura do switch para executar um dos casos possíveis.
Neste caso, o primeiro caso que for verdadeiro, ou seja, se o valor da variável for igual ao da constante que define o caso, será executado.
O switch é construído da seguinte maneira:
switch (variável) { case <CONSTANTE 1>: /* comando 1 */ /* comando 2 */ /* ... */ break; case <CONSTANTE 2>: /* comando 1 */ /* comando 2 */ /* ... */ break; /* outros possíveis casos */ default: /* comando 1 */ /* comando 2 */ /* ... */ }
Observações importantes:
break
é muito importante. Ele que delimita o final do caso. Se ele for esquecido, as linhas de comando dos casos abaixo do escolhido também serão executadas.Vejamos um exemplo de utilização do switch para retornar o dia da semana a partir de um número:
#include <stdio.h> int main(){ int day; printf("Digite um número\n"); scanf("%d", &day); day = day%7; /* existem apenas 7 dias na semana */ switch (day){ case 0: printf("Segunda-feira\n"); break; case 1: printf("Terça-feira\n"); break; case 2: printf("Quarta-feira\n"); break; case 3: printf("Quinta-feira\n"); break; case 4: printf("Sexta-feira\n"); break; case 5: printf("Sábado\n"); break; case 6: printf("Domingo\n"); break; } return 0; }