🚀 Capítulo 05: Estruturas Condicionais (If, Else e Switch-Case) em C

🎯 Objetivos da Aula

Ao final desta aula, você será capaz de:

  1. Controlar o fluxo de execução de um programa C utilizando desvios condicionais if, else if e else.
  2. Utilizar o operador ternário (condicao ? valor1 : valor2) para atribuições concisas.
  3. Implementar seleções múltiplas de forma limpa usando a estrutura switch-case e a instrução break.
  4. Evitar erros comuns de escopo e parênteses em blocos de decisão.

🧠 1. Desvio Condicional Simples e Composto (if / else)

A instrução if permite que o programa execute um bloco de código apenas se uma condição for verdadeira. Se a condição for falsa, o bloco else pode oferecer um caminho alternativo.

flowchart TD
    Inicio([Início]) --> Condicao{"Média >= 7.0?"}
    Condicao -- SIM --> BlocoIf["Exibe: 'Aprovado!'"]
    Condicao -- NÃO --> ChecaRec{"Média >= 5.0?"}
    ChecaRec -- SIM --> BlocoRec["Exibe: 'Recuperação'"]
    ChecaRec -- NÃO --> BlocoElse["Exibe: 'Reprovado'"]
    
    BlocoIf --> Fim([Fim da Decisão])
    BlocoRec --> Fim
    BlocoElse --> Fim

Sintaxe Básica em C:

if (condicao) {
    // Bloco executado se a condição for verdadeira (1)
} else if (outraCondicao) {
    // Bloco executado se a primeira for falsa e esta for verdadeira
} else {
    // Bloco executado se todas as condições anteriores forem falsas (0)
}

🔀 2. Seleção Múltipla com switch-case

A estrutura switch-case é ideal para substituir múltiplos if-else quando testamos o valor de uma única variável inteira ou caractere.

#include <stdio.h>
 
int main() {
    int opcao = 0;
    
    printf("--- MENU DO SISTEMA ---\n");
    printf("1 - Cadastrar Aluno\n");
    printf("2 - Listar Alunos\n");
    printf("3 - Emitir Relatorio\n");
    printf("0 - Sair\n");
    printf("Escolha uma opcao: ");
    scanf("%d", &opcao);
    
    switch (opcao) {
        case 1:
            printf(">> Abrindo tela de cadastro...\n");
            break; // O break impede que a execução caia nos cases seguintes!
        case 2:
            printf(">> Carregando lista de alunos...\n");
            break;
        case 3:
            printf(">> Gerando relatorio em PDF...\n");
            break;
        case 0:
            printf(">> Encerrando o sistema. Ate logo!\n");
            break;
        default:
            printf(">> Opcao invalida! Digite um numero de 0 a 3.\n");
            break;
    }
    
    return 0;
}

💻 3. Prática Guiada: Classificador de Conceito Escolar

Vamos construir um programa em C que calcula a média e atribui um conceito de ‘A’ a ‘F’:

#include <stdio.h>
 
int main() {
    float media = 0.0f;
    
    printf("Digite a media final do aluno (0.0 a 10.0): ");
    scanf("%f", &media);
    
    char conceito;
    
    if (media >= 9.0f) {
        conceito = 'A';
    } else if (media >= 8.0f) {
        conceito = 'B';
    } else if (media >= 7.0f) {
        conceito = 'C';
    } else if (media >= 5.0f) {
        conceito = 'D';
    } else {
        conceito = 'F';
    }
    
    // Uso do operador ternario para definir o status curto
    printf("\n=========================================\n");
    printf(" Media informada : %.2f\n", media);
    printf(" Conceito Obtido : %c\n", conceito);
    printf(" Situacao        : %s\n", (media >= 7.0f) ? "APROVADO" : "REPROVADO");
    printf("=========================================\n");
    
    return 0;
}

⚔️ 4. Desafios Práticos (Exercícios 30/50/20)

🥉 Nível Bronze (Fixação)

  1. Para que serve a instrução break dentro de um bloco switch-case? O que acontece se ela for omitida?
  2. Como funciona o operador ternario (a > b) ? a : b?

🥈 Nível Prata (Aplicação)

  1. Escreva um programa em C que solicite a idade de um cidadão e informe sua classe eleitoral:
    • Menor que 16 anos: “Não eleitor”
    • Entre 18 e 69 anos: “Eleitor obrigatório”
    • Entre 16 e 17 anos OU maior/igual a 70 anos: “Eleitor facultativo”

🥇 Nível Ouro (Desafio)

  1. Crie uma calculadora simples em C que solicite dois números float e um caractere representando a operação (+, -, *, /). Utilize a estrutura switch-case para realizar a operação correspondente e valide a divisão por zero (exibindo mensagem de erro caso o divisor seja zero).

💡 Gabaritos Sanfonados de Resposta

💡 Ver Gabarito do Nível Bronze
  1. O break encerra a execução do switch-case. Se for omitido, a execução continua caindo nos cases subsequentes (fall-through), executando códigos indesejados.
  2. É um atalho para um if-else. Se a condição (a > b) for verdadeira, retorna a; caso contrário, retorna b.
💡 Ver Gabarito do Nível Prata & Ouro (Código C)
#include <stdio.h>
 
int main() {
    float n1, n2;
    char op;
    
    printf("Digite o primeiro numero: ");
    scanf("%f", &n1);
    printf("Digite a operacao (+, -, *, /): ");
    scanf(" %c", &op);
    printf("Digite o segundo numero: ");
    scanf("%f", &n2);
    
    switch (op) {
        case '+': printf("Resultado: %.2f\n", n1 + n2); break;
        case '-': printf("Resultado: %.2f\n", n1 - n2); break;
        case '*': printf("Resultado: %.2f\n", n1 * n2); break;
        case '/':
            if (n2 != 0) {
                printf("Resultado: %.2f\n", n1 / n2);
            } else {
                printf("Erro: Divisao por zero nao permitida!\n");
            }
            break;
        default: printf("Operacao invalida!\n"); break;
    }
    return 0;
}

📚 Referências Teóricas Oficiais

  • KERNIGHAN, Brian W.; RITCHIE, Dennis M.. A Linguagem de Programação C. 2ª Edição. Campus, 1989. Cap. 3 (Controle de Fluxo).
  • ISO/IEC 9899:2018. C17 Language Specification — Selection Statements.

⬅️ Capítulo Anterior (Operadores) | Voltar ao Sumário | Próximo Capítulo (Laços de Repetição) ➡️