Capítulo 08: Seleção Múltipla (ESCOLHA-CASO-OUTROCASO)

🎯 Objetivo da Aula

Quando um sistema precisa processar um menu com 5, 10 ou 20 opções numéricas (como uma Central de Atendimento ao Cliente - SAC), encadear dezenas de comandos se ... senao se ... senao se torna o código poluído, difícil de ler e lento para manter.

Nesta aula, você aprenderá a:

  1. Compreender o funcionamento da Seleção Múltipla (Switch / Case).
  2. Dominar a sintaxe da estrutura escolha (variavel) caso ... outrocaso ... fimescolha.
  3. Identificar quando utilizar escolha em vez de se-senao.
  4. Construir menus executivos de navegação e tarifadores por categorias de transporte.

📥 Material de Apoio e Código-Fonte da Aula:


🏢 O Cenário Prático (Seu Desafio)

Situação: A central de suporte telefônico da FastLog atende motoristas, clientes e fornecedores. Ao ligar para o 0800, a URA (Unidade de Resposta Audível) solicita que o usuário digite um número no teclado:

  • 1: Rastreamento de Carga em Trânsito
  • 2: Agendamento de Descarga em Docas
  • 3: Cotação de Novos Fretes
  • 4: Central de Ocorrências e Sinistros
  • 5: Falar com Atendente Humano

Missão: Criar o algoritmo da URA Inteligente FastLog, direcionando o usuário para o setor competente e tratando qualquer digitação de número inválido com a cláusula outrocaso.


🧠 Fundamentos: A Arquitetura do escolha-caso

1. Como Funciona a Seleção Múltipla?

O comando escolha avalia o valor de uma única variável (geralmente do tipo inteiro ou caractere) e salta diretamente para o rótulo caso correspondente:

graph TD
    A[Opção Digitada pelo Usuário] --> Switch{escolha opcao}
    Switch -- "caso 1" --> C1[1. Rastreamento de Carga]
    Switch -- "caso 2" --> C2[2. Agendamento de Docas]
    Switch -- "caso 3" --> C3[3. Cotação de Novos Fretes]
    Switch -- "caso 4" --> C4[4. Central de Sinistros]
    Switch -- "outrocaso" --> Def[Opção Inválida! Tente Novamente.]
    
    C1 --> Fim[fimescolha]
    C2 --> Fim
    C3 --> Fim
    C4 --> Fim
    Def --> Fim
    
    style Switch fill:#8e44ad,stroke:#fff,stroke-width:2px,color:#fff
    style C1 fill:#2980b9,stroke:#fff,stroke-width:2px,color:#fff
    style C2 fill:#2980b9,stroke:#fff,stroke-width:2px,color:#fff
    style C3 fill:#2980b9,stroke:#fff,stroke-width:2px,color:#fff
    style C4 fill:#2980b9,stroke:#fff,stroke-width:2px,color:#fff
    style Def fill:#c0392b,stroke:#fff,stroke-width:2px,color:#fff

2. A Comparação: Quando Usar se e Quando Usar escolha?

CaracterísticaEstrutura se-senaoEstrutura escolha-caso
Tipo de AvaliaçãoFaixas contínuas, intervalos (>= 10 e <= 50), expressões booleanas complexas.Valores pontuais e exatos (1, 2, "S").
Operadores Aceitos>, <, >=, <=, <>, =, e, ou.Apenas igualdade pontual com os casos listados.
Legibilidade em MenusBaixa (muitas linhas e parênteses).Altíssima (limpo, direto e padronizado).
Comportamento no VisuAlgTesta linha por linha em cascata.Pula direto para o bloco do caso correto.

= e <> também comparam texto (caractere)
Os operadores = (igual) e <> (diferente) não se limitam a números: nomeModal <> "INVÁLIDO" compara diretamente o conteúdo de duas variáveis caractere, sem precisar de nenhuma função especial.


3. A Sintaxe no VisuAlg

1
2
3
4
5
6
7
8
escolha (variavel)
   caso valor1
      // comandos
   caso valor2, valor3 // Aceita múltiplos valores separados por vírgula!
      // comandos
   outrocaso
      // executado se nenhum caso acima for correspondido
fimescolha

No VisuAlg não precisa de break / pare:
Ao contrário de linguagens como C, Java e JavaScript (onde você precisa escrever break; para não vazar para o próximo caso), no VisuAlg e Pascal a estrutura encerra automaticamente ao fim do bloco do caso!


📖 Exemplo Guiado: Menu de Atendimento da URA

Código do Algoritmo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
algoritmo "Menu_URA_FastLog"
var
   opcao : inteiro

inicio
   escreval("==========================================")
   escreval("     CENTRAL DE ATENDIMENTO FASTLOG       ")
   escreval("==========================================")
   escreval(" [1] Rastreamento de Carga")
   escreval(" [2] Agendamento de Docas")
   escreval(" [3] Cotação de Novos Fretes")
   escreval(" [4] Central de Sinistros e Emergências")
   escreval(" [5] Falar com Atendente")
   escreval("==========================================")
   escreva("Digite a opção desejada (1 a 5): ")
   leia(opcao)

   escreval("")
   escolha opcao
      caso 1
         escreval(">> [SETOR DE RASTREAMENTO]: Conectando ao satélite da frota...")
      caso 2
         escreval(">> [SETOR DE DOCAS]: Abrindo agenda de slots para descarregamento...")
      caso 3
         escreval(">> [SETOR COMERCIAL]: Iniciando simulador de cotação de fretes...")
      caso 4
         escreval(">> [URGÊNCIA / SINISTROS]: Transferindo com prioridade para a torre...")
      caso 5
         escreval(">> [ATENDIMENTO HUMANO]: Aguarde na linha para o próximo atendente...")
      outrocaso
         escreval(">> [ERRO]: Opção inválida! Digite um número de 1 a 5.")
   fimescolha

   escreval("==========================================")
fimalgoritmo

✅ Exemplo de Execução no Console (F9):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
==========================================
     CENTRAL DE ATENDIMENTO FASTLOG       
==========================================
 [1] Rastreamento de Carga
 [2] Agendamento de Docas
 [3] Cotação de Novos Fretes
 [4] Central de Sinistros e Emergências
 [5] Falar com Atendente
==========================================
Digite a opção desejada (1 a 5): 4

>> [URGÊNCIA / SINISTROS]: Transferindo com prioridade para a torre...
==========================================

🛠️ Prática Obrigatória 1: Tarifador por Modal de Transporte

Passo 1: O Desafio

Crie um algoritmo chamado "Tarifador_Modal" que receba o peso da carga em kg e o código do modal de transporte:

  • 1Rodoviário: R$ 2,50 por kg
  • 2Ferroviário: R$ 1,40 por kg
  • 3Aéreo: R$ 9,80 por kg
  • 4Marítimo (Cabotagem): R$ 0,90 por kg
  • outrocaso ➔ Exibir "Modal não cadastrado".

✅ Resultado Esperado (Prática 1):

1
2
3
4
5
Informe o peso da carga (kg): 500
Escolha o modal (1-Rodov | 2-Ferrov | 3-Aéreo | 4-Marít): 3

MODAL SELECIONADO: Aéreo Expresso
CUSTO TOTAL DO TRANSPORTE: R$ 4900.00

🛠️ Prática Obrigatória 2: Classificador de Região de Entrega

Crie um algoritmo "Classificador_Regiao" que receba o código numérico do estado de destino (códigos fictícios, criados apenas para fins didáticos deste exercício — não correspondem aos códigos reais do IBGE):

  • 11, 12, 13 ➔ Exibir: "Região Sudeste - Prazo: 24h"
  • 21, 22 ➔ Exibir: "Região Sul - Prazo: 48h"
  • 31 ➔ Exibir: "Região Centro-Oeste - Prazo: 72h"
  • outrocaso ➔ Exibir: "Região Norte/Nordeste - Prazo: 120h".

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_08_SeuNome_SeuSobrenome.alg.
  2. Teste digitando todas as opções e também um número inválido (ex: 99) para validar o outrocaso.
  3. No Microsoft Teams, envie na tarefa “VisuAlg Cap 08 - Seleção Múltipla”.
  4. Clique em Entregar (Turn In).

💡 Checkpoint de Lógica & Engenharia de Software

Você acabou de dominar a base de Máquinas de Estados Finitos (State Machines) e do padrão de projeto de software Factory / Strategy Pattern. Roteadores Web (como Express no Node.js ou Django no Python) usam tabelas de correspondência para direcionar requisições para a rota correta.


🔥 Desafio de Fixação: Calculadora de Descontos por Categoria de Cliente

Crie um algoritmo que receba o valor total da compra e a categoria do cliente:

  • Categoria 1 (Bronze): 5% de desconto.
  • Categoria 2 (Prata): 10% de desconto.
  • Categoria 3 (Ouro): 15% de desconto.
  • Categoria 4 (Diamante VIP): 20% de desconto.
  • outrocaso: Sem desconto (preço integral).

🔑 Gabarito de Código Completo

Prática 1:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
algoritmo "Tarifador_Modal"
var
   modal : inteiro
   pesoKg, taxaPorKg, valorTotal : real
   nomeModal : caractere
inicio
   escreva("Informe o peso da carga (kg): ")
   leia(pesoKg)
   escreva("Escolha o modal (1-Rodov | 2-Ferrov | 3-Aéreo | 4-Marít): ")
   leia(modal)

   escolha modal
      caso 1
         nomeModal <- "Rodoviário Padrão"
         taxaPorKg <- 2.50
      caso 2
         nomeModal <- "Ferroviário Carga Pesada"
         taxaPorKg <- 1.40
      caso 3
         nomeModal <- "Aéreo Expresso"
         taxaPorKg <- 9.80
      caso 4
         nomeModal <- "Marítimo (Cabotagem)"
         taxaPorKg <- 0.90
      outrocaso
         nomeModal <- "INVÁLIDO"
         taxaPorKg <- 0.0
   fimescolha

   escreval("")
   se (nomeModal <> "INVÁLIDO") entao
      valorTotal <- pesoKg * taxaPorKg
      escreval("MODAL SELECIONADO: ", nomeModal)
      escreval("CUSTO TOTAL DO TRANSPORTE: R$ ", valorTotal:8:2)
   senao
      escreval("[ERRO]: Modal não cadastrado no sistema.")
   fimse
fimalgoritmo

Prática 2:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
algoritmo "Classificador_Regiao"
var
   codigoEstado : inteiro
inicio
   escreva("Informe o código de destino: ")
   leia(codigoEstado)

   escreval("")
   escolha codigoEstado
      caso 11, 12, 13
         escreval("DESTINO : Região Sudeste")
         escreval("PRAZO   : 24 horas úteis (Entrega Expressa)")
      caso 21, 22
         escreval("DESTINO : Região Sul")
         escreval("PRAZO   : 48 horas úteis (Padrão)")
      caso 31
         escreval("DESTINO : Região Centro-Oeste")
         escreval("PRAZO   : 72 horas úteis")
      outrocaso
         escreval("DESTINO : Região Norte / Nordeste")
         escreval("PRAZO   : 120 horas úteis (Logística Fluvial/Aérea)")
   fimescolha
fimalgoritmo

Desafio:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
algoritmo "Desconto_Categorias"
var
   categoria : inteiro
   valorBruto, percentualDesconto, valorDesconto, valorLiquido : real
inicio
   escreva("Valor Total da Carga (R$): ") leia(valorBruto)
   escreva("Categoria do Cliente (1-Bronze | 2-Prata | 3-Ouro | 4-Diamante): ")
   leia(categoria)

   escolha categoria
      caso 1
         percentualDesconto <- 0.05
      caso 2
         percentualDesconto <- 0.10
      caso 3
         percentualDesconto <- 0.15
      caso 4
         percentualDesconto <- 0.20
      outrocaso
         percentualDesconto <- 0.0
   fimescolha

   valorDesconto <- valorBruto * percentualDesconto
   valorLiquido <- valorBruto - valorDesconto

   escreval("")
   escreval("Desconto Comercial: R$ ", valorDesconto:8:2, " (", (percentualDesconto*100):4:1, "%)")
   escreval("VALOR LÍQUIDO A FATURAR: R$ ", valorLiquido:8:2)
fimalgoritmo

📝 Atividade Extra: Questionário de Fixação (Caderno)

Instruções: Responda no caderno, de próprio punho, as 10 perguntas abaixo com base no que foi estudado neste capítulo. Ao concluir, leve o caderno até o professor para correção e visto.

  1. Segundo o capítulo, o que o comando escolha avalia, e para onde ele salta diretamente após a avaliação?
  2. Segundo a tabela comparativa do capítulo, quando é mais indicado usar se-senao em vez de escolha-caso, e quando é mais indicado o contrário?
  3. Na sintaxe do escolha-caso, para que serve a cláusula outrocaso?
  4. É possível associar múltiplos valores a um único bloco caso? Dê o exemplo de sintaxe apresentado no capítulo.
  5. Segundo a nota do capítulo, o que é diferente entre o VisuAlg/Pascal e linguagens como C, Java e JavaScript quanto à necessidade do comando break?
  6. No Exemplo Guiado (Menu de Atendimento da URA), quais são as 5 opções numéricas apresentadas no menu da Central de Atendimento FastLog?
  7. Na Prática Obrigatória 1 (Tarifador por Modal de Transporte), qual valor por kg é cobrado no modal Aéreo (código 3)?
  8. Na Prática Obrigatória 2 (Classificador de Região de Entrega), qual prazo de entrega é atribuído aos códigos de estado 21 e 22?
  9. Segundo o Checkpoint de Lógica, quais dois conceitos de engenharia de software o escolha-caso exemplifica?
  10. Segundo as Instruções de Entrega, além de testar todas as opções válidas, que outro tipo de teste deve ser feito para validar o outrocaso?