Capítulo 04: Interação com o Usuário (Entrada e Saída de Dados)

🎯 Objetivo da Aula

Até o momento, nossos algoritmos trabalhavam com dados fixos previamente escritos no código (Hardcoded). Porém, no mundo corporativo real, o sistema deve ser dinâmico: ele precisa perguntar as informações ao operador, aguardar a digitação e responder com relatórios personalizados.

Nesta aula, você aprenderá a:

  1. Compreender o fluxo de Entrada Padrão (stdin) e Saída Padrão (stdout).
  2. Capturar dados digitados pelo teclado utilizando o comando leia().
  3. Dominar a diferença entre escreva() (mantém na mesma linha) e escreval() (com quebra de linha).
  4. Formatar saídas numéricas com máscaras de casas decimais e alinhamento (valor:largura:decimais).

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


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

Situação: O balcão de atendimento ao cliente da FastLog precisa de um sistema interativo no terminal. Quando um cliente chega para despachar uma encomenda, o atendente precisa digitar os dados da carga no teclado e, em seguida, o sistema deve imprimir instantaneamente o Comprovante de Despacho Logístico com os custos e impostos calculados na hora.

Missão: Você deve programar o Terminal de Autoatendimento FastLog, capturando interativamente o nome do cliente, o peso da carga e a distância do frete, devolvendo uma fatura perfeitamente formatada.


🧠 Fundamentos: O Ciclo de Entrada, Processamento e Saída (IPO)

Todo software do planeta opera dentro do ciclo clássico IPO (Input, Processing, Output):

graph LR
    Input["1. ENTRADA (Input)<br/>Teclado: leia(peso, km)"] --> Process["2. PROCESSAMENTO<br/>CPU / RAM: total <- (peso*2) + (km*3.5)"]
    Process --> Output["3. SAÍDA (Output)<br/>Monitor: escreval('Total: R$ ', total)"]
    
    style Input fill:#2980b9,stroke:#fff,stroke-width:2px,color:#fff
    style Process fill:#8e44ad,stroke:#fff,stroke-width:2px,color:#fff
    style Output fill:#217346,stroke:#fff,stroke-width:2px,color:#fff

1. O Comando de Entrada: leia()

O comando leia(variavel) suspende temporariamente a execução do programa e aguarda o usuário digitar um valor e pressionar a tecla Enter:

1
2
escreva("Digite o nome do motorista: ")
leia(nomeMotorista)
  • O interpretador faz a conversão automática do texto digitado para o tipo da variável declarada na seção var (se for real, converte para decimal; se for inteiro, converte para inteiro).

Comandos na mesma linha
O VisuAlg não exige que cada comando fique em sua própria linha. Por isso, escreva(...) e leia(...) também podem aparecer juntos, como um atalho mais compacto: escreva("Digite o nome do motorista: ") leia(nomeMotorista). As duas formas funcionam exatamente igual — você vai ver o estilo compacto em vários gabaritos de código deste curso a partir daqui.


2. A Diferença Crucial: escreva() vs escreval()

ComandoO que faz?Onde o cursor fica posicionado?Ideal para quê?
escreva()Imprime o texto na tela.Na mesma linha, logo após a última letra.Perguntas de formulário (o usuário digita na frente do texto).
escreval()Imprime o texto e pula uma linha (line break).Na linha de baixo.Linhas de relatórios, títulos e quebras de parágrafo.

3. A Máscara de Formatação Numérica no VisuAlg

Para evitar que números decimais apareçam como 1500.33333333 na tela, o VisuAlg utiliza a sintaxe de máscara:

$$\text{variavel} : \text{espaços_totais} : \text{casas_decimais}$$

  • valorFrete:8:2 ➔ Reserva 8 espaços de largura e formata com exatamente 2 casas decimais (ex: 1500.50).
  • qtdItens:4 ➔ Reserva 4 espaços para um número inteiro.

📖 Exemplo Guiado: Simulador de Frete Interativo

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
36
algoritmo "Cotador_Interativo"
var
   cliente : caractere
   pesoKg, distanciaKm, valorKm, taxaFixa, totalFrete : real

inicio
   taxaFixa <- 50.00
   valorKm <- 3.20

   escreval("==========================================")
   escreval("      FASTLOG - COTAÇÃO DE FRETES         ")
   escreval("==========================================")
   
   // Entrada de Dados (observe o uso do escreva para o cursor ficar na frente)
   escreva("Informe o Nome do Cliente: ")
   leia(cliente)
   
   escreva("Informe o Peso da Carga (kg): ")
   leia(pesoKg)
   
   escreva("Informe a Distância da Entrega (km): ")
   leia(distanciaKm)
   
   // Processamento
   totalFrete <- taxaFixa + (distanciaKm * valorKm) + (pesoKg * 0.80)
   
   // Saída Formatada
   escreval("")
   escreval("------------ RESUMO DO PEDIDO ------------")
   escreval("Cliente Cadastrado : ", cliente)
   escreval("Distância da Rota  : ", distanciaKm:6:1, " km")
   escreval("Peso Declarado     : ", pesoKg:6:2, " kg")
   escreval("------------------------------------------")
   escreval("VALOR TOTAL COTAÇÃO: R$ ", totalFrete:8:2)
   escreval("==========================================")
fimalgoritmo

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
==========================================
      FASTLOG - COTAÇÃO DE FRETES         
==========================================
Informe o Nome do Cliente: Distribuidora Alpha
Informe o Peso da Carga (kg): 450
Informe a Distância da Entrega (km): 180

------------ RESUMO DO PEDIDO ------------
Cliente Cadastrado : Distribuidora Alpha
Distância da Rota  :  180.0 km
Peso Declarado     : 450.00 kg
------------------------------------------
VALOR TOTAL COTAÇÃO: R$   986.00
==========================================

🛠️ Prática Obrigatória 1: Emissor de Romaneio de Carga

Passo 1: O Desafio

Crie um algoritmo chamado "Romaneio_Expedicao" que solicite via teclado:

  1. numeroPedido (inteiro)
  2. descricaoItem (caractere)
  3. quantidadeCaixas (inteiro)
  4. pesoUnitario (real)
  5. valorUnitario (real)

Passo 2: O Processamento e Relatório

O programa deve calcular o Peso Total da Carga (quantidadeCaixas * pesoUnitario) e o Valor Total Assegurado (quantidadeCaixas * valorUnitario), imprimindo um romaneio fiscal formatado.

✅ Resultado Esperado (Prática 1):

1
2
3
4
5
6
7
=== ROMANEIO DE EXPEDIÇÃO ===
Pedido Nº: 1092
Item: Caixa de Ferramentas
Total de Caixas: 20 un
Peso Total: 160.00 kg
Valor Total Assegurado: R$ 3200.00
=============================

🛠️ Prática Obrigatória 2: Calculadora de Divisão de Despesas por Passageiro

Na van de transporte executivo da empresa, o motorista precisa dividir o custo total da viagem (Combustível + Pedágio) igualmente entre os passageiros transportados. Crie um algoritmo "Divisao_Despesas" que receba o gasto com diesel, o gasto com pedágio e a quantidade de passageiros, informando o valor exato que cada um deve pagar formatado com 2 casas decimais.


📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_04_SeuNome_SeuSobrenome.alg.
  2. No VisuAlg, execute com F9, digite os valores de teste e confira as saídas.
  3. No Microsoft Teams, envie na tarefa “VisuAlg Cap 04 - Entrada e Saída”.
  4. Clique em Entregar (Turn In).

💡 Checkpoint de Lógica & Engenharia de Software

Você acabou de dominar a base de Interfaces de Linha de Comando (CLI - Command Line Interface). Softwares profissionais em servidores Linux (como Docker, Git e Kubernetes) operam essencialmente através do mesmo mecanismo de leitura do teclado e impressão formatada no console.


🔥 Desafio de Fixação: Comprovante de Pagamento de Diária

Crie um algoritmo que peça o nome do motorista, a quantidade de horas extras trabalhadas no mês e o valor da hora normal. Calcule as horas extras com 50% de acréscimo e exiba o holerite simplificado.


🔑 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
algoritmo "Romaneio_Expedicao"
var
   numeroPedido, quantidadeCaixas : inteiro
   descricaoItem : caractere
   pesoUnitario, valorUnitario, pesoTotal, valorTotal : real
inicio
   escreva("Número do Pedido: ") leia(numeroPedido)
   escreva("Descrição do Item: ") leia(descricaoItem)
   escreva("Quantidade de Caixas: ") leia(quantidadeCaixas)
   escreva("Peso Unitário (kg): ") leia(pesoUnitario)
   escreva("Valor Unitário (R$): ") leia(valorUnitario)

   pesoTotal <- quantidadeCaixas * pesoUnitario
   valorTotal <- quantidadeCaixas * valorUnitario

   escreval("")
   escreval("=== ROMANEIO DE EXPEDIÇÃO ===")
   escreval("Pedido Nº: ", numeroPedido)
   escreval("Item: ", descricaoItem)
   escreval("Total de Caixas: ", quantidadeCaixas, " un")
   escreval("Peso Total: ", pesoTotal:7:2, " kg")
   escreval("Valor Total Assegurado: R$ ", valorTotal:8:2)
   escreval("=============================")
fimalgoritmo

Prática 2:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
algoritmo "Divisao_Despesas"
var
   gastoDiesel, gastoPedagio, custoTotal, valorPorPassageiro : real
   qtdPassageiros : inteiro
inicio
   escreva("Gasto Total com Diesel (R$): ") leia(gastoDiesel)
   escreva("Gasto Total com Pedágios (R$): ") leia(gastoPedagio)
   escreva("Quantidade de Passageiros: ") leia(qtdPassageiros)

   custoTotal <- gastoDiesel + gastoPedagio
   valorPorPassageiro <- custoTotal / qtdPassageiros

   escreval("")
   escreval("Custo Total da Viagem: R$ ", custoTotal:8:2)
   escreval("Valor Individual por Passageiro: R$ ", valorPorPassageiro:6:2)
fimalgoritmo

Desafio:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
algoritmo "Holerite_HorasExtras"
var
   nomeMotorista : caractere
   valorHoraNormal, horasExtras, valorHoraExtra, totalExtra : real
inicio
   escreva("Nome do Motorista: ") leia(nomeMotorista)
   escreva("Valor da Hora Normal (R$): ") leia(valorHoraNormal)
   escreva("Horas Extras Trabalhadas: ") leia(horasExtras)

   valorHoraExtra <- valorHoraNormal * 1.50
   totalExtra <- horasExtras * valorHoraExtra

   escreval("")
   escreval("Colaborador: ", nomeMotorista)
   escreval("Valor da Hora Extra (50%): R$ ", valorHoraExtra:6:2)
   escreval("Total a Receber em Horas Extras: R$ ", totalExtra: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 representam as três etapas do ciclo IPO (Input, Processing, Output)?
  2. O que faz o comando leia(variavel) e o que acontece quando o usuário pressiona a tecla Enter?
  3. Qual é a diferença entre escreva() e escreval(), segundo a tabela do capítulo, e para qual situação cada um é mais indicado?
  4. Na sintaxe de máscara de formatação numérica valorFrete:8:2, o que representa o número 8 e o que representa o número 2?
  5. No Exemplo Guiado (Cotador Interativo), por que o comando escreva() foi usado antes de cada leia(), em vez de escreval()?
  6. No Exemplo Guiado, qual foi a fórmula utilizada para calcular o totalFrete?
  7. Na Prática Obrigatória 1 (Emissor de Romaneio de Carga), quais são as cinco variáveis que devem ser solicitadas ao usuário via teclado?
  8. Na Prática Obrigatória 2 (Divisão de Despesas por Passageiro), qual operação deve ser realizada para obter o valor que cada passageiro deve pagar?
  9. Segundo as Instruções de Entrega, qual deve ser o padrão de nome do arquivo salvo para envio desta atividade?
  10. Segundo o Checkpoint de Lógica, o que é uma CLI (Command Line Interface) e quais exemplos de softwares profissionais o capítulo cita como operando por esse mesmo mecanismo?