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
switchcombreakem cada caso. - Usar
gotopara 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
- Incluímos
<stdio.h>. - Declaramos
opcao. - O rótulo
inicio:marca o ponto de retorno. - Imprimimos o menu e lemos a opção com
scanf. - O
switchcomparaopcaocom 1, 2 e 0. - Cada
caseimprime a mensagem e usabreakpara sair doswitch. - O
defaulttrata opções inválidas: imprime "Opcao invalida" e usagoto iniciopara repetir o menu. - Quando a opção é 0, imprime "Saindo..." e o
breaksai doswitch, 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
breakem umcase: o programa executa os casos seguintes (fall-through), imprimindo mensagens erradas. - Usar
gotopara um rótulo inexistente: erro de compilação. - Colocar o rótulo dentro de um bloco: o
gotopode 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...