Estruturas Condicionais

Last updated: August 26th, 2018

Introdução

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.

Estrutura Condicional Simples

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:

  • A condição fica obrigatoriamente entre parêntesis,
  • As chaves delimitam o bloco condicional,
  • Os comandos do bloco condicional estão identados em relação à condição,
  • Não existe limite prático para os comandos do bloco condicional.

Estrutura Condicional Composta

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", &nota1);

    printf("Digite a nota da prova 2 : ");
    scanf("%lf", &nota2);

    printf("Digite a nota da prova 3 : ");
    scanf("%lf", &nota3);

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

Encadeamento de Estruturas Condicionais

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", &nota1);

    printf("Digite a nota da prova 2 : ");
    scanf("%lf", &nota2);

    printf("Digite a nota da prova 3 : ");
    scanf("%lf", &nota3);

    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:

  • Somente um desses blocos será executado. O bloco a ser executado é o primeiro cuja condição for avaliada como verdadeira. Os blocos seguintes serão pulados.
  • Não existe um limite de blocos condicionais encadeados.
  • O else final é opcional.

Condições Compostas

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:

  • AND - &&
  • OR - ||
  • NOT - !
Vejamos um exemplo:
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.

Exercícios Recomendados (1035 ~ 1052 URI)

Questões desafio (Nivel: Médio / Difícil) (URI ~ Codeforces)

Materiais Extras

Switch Case

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:

  • O comando 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.
  • O caso default é opcional. Ele funciona como o else, sendo executado sempre que nenhum outro caso for executado.

Exemplo:

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