Capítulo 08: Seleção Múltipla (ESCOLHA-CASO-PARE / Switch-Case)

🎯 Objetivo da Aula

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

Nesta aula, você aprenderá a:

  1. Compreender o funcionamento da Seleção Múltipla (Switch / Case).
  2. Dominar a sintaxe: escolha (variavel) { caso 1: ... pare caso contrario: ... }.
  3. Compreender a função mandatória do comando pare (break) no Portugol Studio.
  4. Construir menus interativos 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 telefônica (URA) da FastLog atende motoristas e fornecedores. Ao ligar para a central, o usuário escuta o menu:

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

Missão: Programar o Roteador Telefônico da URA FastLog, direcionando o usuário para o setor competente e tratando digitações inválidas com o caso contrario.


🧠 Fundamentos: A Estrutura escolha-caso

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

O comando escolha avalia o valor de uma única variável 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 Fretes]
    Switch -- "caso 4" --> C4[4. Central de Sinistros]
    Switch -- "caso contrario" --> Def[Opção Inválida!]
    
    C1 --> P1[pare]
    C2 --> P2[pare]
    C3 --> P3[pare]
    C4 --> P4[pare]
    Def --> Fim[Fim da Estrutura]
    P1 --> Fim
    P2 --> Fim
    P3 --> Fim
    P4 --> Fim
    
    style Switch fill:#8e44ad,stroke:#fff,color:#fff
    style C1 fill:#2980b9,stroke:#fff,color:#fff
    style C2 fill:#2980b9,stroke:#fff,color:#fff
    style C3 fill:#2980b9,stroke:#fff,color:#fff
    style C4 fill:#2980b9,stroke:#fff,color:#fff
    style Def fill:#c0392b,stroke:#fff,color:#fff

2. O Papel Crítico do Comando pare (Break)

Por que o pare é Obrigatório no Portugol Studio?
Diferente do VisuAlg, no Portugol Studio (assim como em C, Java e JavaScript), se você esquecer de colocar o comando pare, o código continuará descendo e executará os casos seguintes mesmo que eles não correspondam à opção digitada (Fall-Through)!


3. A Sintaxe Completa

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
escolha (opcao) 
{
	caso 1:
		escreva("Opção 1 Selecionada\n")
		pare
	caso 2:
		escreva("Opção 2 Selecionada\n")
		pare
	caso contrario:
		escreva("Opção Inválida!\n")
}

📖 Exemplo Guiado: URA Telefônica do SAC

Código do Programa:

 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
39
40
41
42
43
programa 
{
	funcao inicio() 
	{
		inteiro opcao

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

		escreva("\n")
		escolha (opcao) 
		{
			caso 1:
				escreva(">> [RASTREAMENTO]: Conectando ao satélite da frota...\n")
				pare
			caso 2:
				escreva(">> [DOCAS]: Abrindo agenda de slots para descarga...\n")
				pare
			caso 3:
				escreva(">> [COMERCIAL]: Iniciando simulador de tarifas...\n")
				pare
			caso 4:
				escreva(">> [SINISTROS]: Transferindo com urgência para a torre...\n")
				pare
			caso 5:
				escreva(">> [HUMANO]: Aguarde na linha para o próximo atendente...\n")
				pare
			caso contrario:
				escreva(">> [ERRO]: Opção inválida! Digite um número de 1 a 5.\n")
		}

		escreva("==========================================\n")
	}
}

✅ Exemplo de Execução no Console (Shift + F6):

 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 Humano
==========================================
Digite a opção desejada (1 a 5): 1

>> [RASTREAMENTO]: Conectando ao satélite da frota...
==========================================

🛠️ Prática Obrigatória 1: Calculadora Aritmética Modular

Passo 1: O Desafio

Crie um programa calculadora_menu.por que receba dois números reais (n1 e n2) e ofereça um menu:

  • 1 ➔ Soma (+)
  • 2 ➔ Subtração (-)
  • 3 ➔ Multiplicação (*)
  • 4 ➔ Divisão (/)
  • caso contrario"Operação Inválida!".

✅ Resultado Esperado (Prática 1):

1
2
3
4
5
N1: 40.0
N2: 8.0
1. Soma | 2. Subtração | 3. Multiplicação | 4. Divisão
Opção: 4
DIVISÃO: 5.0

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

Crie um programa tarifador_modal.por que receba o peso da mercadoria em kg e o código do modal:

  • 1 (Rodoviário): R$ 2,50/kg
  • 2 (Ferroviário): R$ 1,40/kg
  • 3 (Aéreo Expresso): R$ 9,80/kg
  • 4 (Marítimo): R$ 0,90/kg Calcule e exiba o custo total do transporte.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_08_SeuNome_SeuSobrenome.por.
  2. Certifique-se de que todos os blocos caso terminam com o comando pare.
  3. No Microsoft Teams, envie na tarefa “Portugol Cap 08 - Estrutura Escolha”.
  4. Clique em Entregar (Turn In).

💡 Checkpoint de Lógica & Engenharia de Software

Você acabou de aplicar o conceito de Roteamento de Requisições e Máquinas de Estados. Servidores Web em Node.js, C# e Java utilizam tabelas de correspondência para direcionar URLs para seus respectivos controladores (Controllers).


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

Crie um programa com escolha-caso que receba o valor da compra e a categoria do cliente:

  • 1 (Bronze): 5% de desconto
  • 2 (Prata): 10% de desconto
  • 3 (Ouro): 15% de desconto
  • 4 (Diamante VIP): 20% de desconto
  • caso contrario: Sem desconto (0%).

🔑 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
programa {
	funcao inicio() {
		real n1, n2
		inteiro op

		escreva("N1: ") leia(n1)
		escreva("N2: ") leia(n2)
		escreva("1. Soma | 2. Subtração | 3. Multiplicação | 4. Divisão\nOpção: ")
		leia(op)

		escolha (op) {
			caso 1:
				escreva("SOMA: ", n1 + n2, "\n")
				pare
			caso 2:
				escreva("SUBTRAÇÃO: ", n1 - n2, "\n")
				pare
			caso 3:
				escreva("MULTIPLICAÇÃO: ", n1 * n2, "\n")
				pare
			caso 4:
				se (n2 != 0) {
					escreva("DIVISÃO: ", n1 / n2, "\n")
				} senao {
					escreva("ERRO: Divisão por zero!\n")
				}
				pare
			caso contrario:
				escreva("OPÇÃO INVÁLIDA!\n")
		}
	}
}

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
programa {
	funcao inicio() {
		real pesoKg, taxaPorKg = 0.0, totalFrete
		inteiro modal
		cadeia nomeModal = "INVÁLIDO"

		escreva("Informe o peso da carga (kg): ") leia(pesoKg)
		escreva("Selecione 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
				pare
			caso 2:
				nomeModal = "Ferroviário Carga Pesada"
				taxaPorKg = 1.40
				pare
			caso 3:
				nomeModal = "Aéreo Expresso"
				taxaPorKg = 9.80
				pare
			caso 4:
				nomeModal = "Marítimo (Cabotagem)"
				taxaPorKg = 0.90
				pare
			caso contrario:
				escreva("Modal não cadastrado!\n")
		}

		se (nomeModal != "INVÁLIDO") {
			totalFrete = pesoKg * taxaPorKg
			escreva("\nMODAL SELECIONADO: ", nomeModal, "\n")
			escreva("CUSTO TOTAL DO FRETE: R$ ", totalFrete, "\n")
		}
	}
}

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
30
31
32
programa {
	funcao inicio() {
		real valorBruto, taxaDesconto = 0.0, valorDesconto, valorLiquido
		inteiro categoria

		escreva("Valor Total da Compra (R$): ") leia(valorBruto)
		escreva("Categoria (1-Bronze | 2-Prata | 3-Ouro | 4-Diamante): ") leia(categoria)

		escolha (categoria) {
			caso 1:
				taxaDesconto = 0.05
				pare
			caso 2:
				taxaDesconto = 0.10
				pare
			caso 3:
				taxaDesconto = 0.15
				pare
			caso 4:
				taxaDesconto = 0.20
				pare
			caso contrario:
				taxaDesconto = 0.0
		}

		valorDesconto = valorBruto * taxaDesconto
		valorLiquido = valorBruto - valorDesconto

		escreva("\nDesconto Comercial: R$ ", valorDesconto, " (", taxaDesconto * 100, "%)\n")
		escreva("VALOR LÍQUIDO A FATURAR: R$ ", valorLiquido, "\n")
	}
}

📝 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. O que o comando escolha avalia para decidir para qual caso saltar, segundo o capítulo?
  2. Segundo o quadro CRITICAL do capítulo, o que acontece se o comando pare for esquecido dentro de um caso no Portugol Studio?
  3. Como se chama, em inglês, o comportamento descrito no capítulo em que a execução “cai” para os casos seguintes por falta do pare?
  4. Qual cláusula é usada dentro do escolha para tratar valores que não correspondem a nenhum caso definido?
  5. Quais são as cinco opções do menu da Central de Atendimento (URA) apresentadas no Cenário Prático e reproduzidas no Exemplo Guiado?
  6. Na Prática Obrigatória 1 (Calculadora Aritmética Modular), quais são as quatro operações do menu e seus respectivos números de opção?
  7. Na Prática Obrigatória 2 (Tarifador por Modal de Transporte), qual é a tarifa por kg do modal “Aéreo Expresso” (código 3)?
  8. Segundo o Checkpoint de Lógica, a que conceito de programação de servidores (citado no texto) a estrutura escolha-caso é comparada?
  9. Na sintaxe apresentada na seção de Fundamentos, o que deve vir logo após o bloco de instruções de cada caso, antes do próximo caso?
  10. Diferente de qual outra linguagem (citada no quadro CRITICAL) o Portugol Studio exige o comando pare obrigatoriamente, assim como C, Java e JavaScript?