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;
}