Desafio C

Menu com switch e validação com goto

Enunciado

Implemente um menu que repete até o usuário escolher sair. Use switch para tratar as opções 1, 2 e 0 (sair). Use goto apenas para o caso de opção inválida, imprimindo uma mensagem e voltando ao início do menu. O programa deve ler a opção repetidamente até ser válida ou sair.

Requisitos

  • Usar switch com break em cada caso.
  • Usar goto para reiniciar o menu em caso de opção inválida.
  • Encerrar quando a opção for 0.
  • Imprimir mensagens conforme as opções.

Código inicial

#include <stdio.h>

int main(void) {
    int opcao;
    // implemente o menu com switch e goto
    return 0;
}

Saída esperada

Opcao 1 selecionada
Opcao invalida
Opcao 2 selecionada
Saindo...
Ver dica

Coloque um rótulo antes do scanf e use goto quando a opção não for 0, 1 ou 2. Dentro do switch, use break para não executar os casos seguintes.

Mostrar solução
#include <stdio.h>

int main(void) {
    int opcao;

inicio:
    printf("Escolha uma opcao (0-sair, 1-opcao1, 2-opcao2): ");
    scanf("%d", &opcao);

    switch (opcao) {
        case 1:
            printf("Opcao 1 selecionada\n");
            break;
        case 2:
            printf("Opcao 2 selecionada\n");
            break;
        case 0:
            printf("Saindo...\n");
            break;
        default:
            printf("Opcao invalida\n");
            goto inicio;  // volta ao menu
    }

    return 0;
}

Passo a passo

  1. Incluímos <stdio.h>.
  2. Declaramos opcao.
  3. O rótulo inicio: marca o ponto de retorno.
  4. Imprimimos o menu e lemos a opção com scanf.
  5. O switch compara opcao com 1, 2 e 0.
  6. Cada case imprime a mensagem e usa break para sair do switch.
  7. O default trata opções inválidas: imprime "Opcao invalida" e usa goto inicio para repetir o menu.
  8. Quando a opção é 0, imprime "Saindo..." e o break sai do switch, encerrando o programa.

Por que funciona

O switch seleciona o caso correspondente e o break evita que a execução continue nos casos seguintes (fall-through). O goto desvia incondicionalmente para o rótulo inicio, criando um laço simples para opções inválidas. Apesar de funcional, o goto é usado aqui apenas para demonstrar seu mecanismo; em código real, um while seria preferível.

Erros comuns

  • Esquecer o break em um case: o programa executa os casos seguintes (fall-through), imprimindo mensagens erradas.
  • Usar goto para um rótulo inexistente: erro de compilação.
  • Colocar o rótulo dentro de um bloco: o goto pode pular para dentro de um escopo, causando comportamento indefinido se variáveis forem declaradas depois do rótulo.

Outra forma de resolver

Substituir o goto por um laço while (1) com continue ou break. Exemplo:

while (1) {
    printf("Escolha...");
    scanf("%d", &opcao);
    switch (opcao) {
        case 1: printf("Opcao 1\n"); break;
        case 2: printf("Opcao 2\n"); break;
        case 0: printf("Saindo...\n"); return 0;
        default: printf("Opcao invalida\n"); continue;
    }
}

Essa forma é mais estruturada e evita goto.

Saída esperada

Opcao 1 selecionada
Opcao invalida
Opcao 2 selecionada
Saindo...