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:
- Compreender o fluxo de Entrada Padrão (
stdin) e Saída Padrão (stdout). - Capturar dados digitados pelo teclado utilizando o comando
leia(). - Dominar a diferença entre
escreva()(mantém na mesma linha) eescreval()(com quebra de linha). - 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:
- 📄 Arquivo Pronto (.alg): Baixar Capitulo_04.alg (abra diretamente no VisuAlg 3.0)
- 📦 Exercícios Separados (.zip): Baixar Capitulo_04.zip
🏢 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:#fff1. 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:
- O interpretador faz a conversão automática do texto digitado para o tipo da variável declarada na seção
var(se forreal, converte para decimal; se forinteiro, 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()
| Comando | O 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:
✅ Exemplo de Execução no Console (F9):
🛠️ Prática Obrigatória 1: Emissor de Romaneio de Carga
Passo 1: O Desafio
Crie um algoritmo chamado "Romaneio_Expedicao" que solicite via teclado:
numeroPedido(inteiro)descricaoItem(caractere)quantidadeCaixas(inteiro)pesoUnitario(real)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):
🛠️ 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)
- Salve o arquivo como:
Atividade_04_SeuNome_SeuSobrenome.alg. - No VisuAlg, execute com
F9, digite os valores de teste e confira as saídas. - No Microsoft Teams, envie na tarefa “VisuAlg Cap 04 - Entrada e Saída”.
- 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:
Prática 2:
Desafio:
📝 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.
- Segundo o capítulo, o que representam as três etapas do ciclo IPO (Input, Processing, Output)?
- O que faz o comando
leia(variavel)e o que acontece quando o usuário pressiona a teclaEnter? - Qual é a diferença entre
escreva()eescreval(), segundo a tabela do capítulo, e para qual situação cada um é mais indicado? - Na sintaxe de máscara de formatação numérica
valorFrete:8:2, o que representa o número8e o que representa o número2? - No Exemplo Guiado (Cotador Interativo), por que o comando
escreva()foi usado antes de cadaleia(), em vez deescreval()? - No Exemplo Guiado, qual foi a fórmula utilizada para calcular o
totalFrete? - 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?
- 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?
- Segundo as Instruções de Entrega, qual deve ser o padrão de nome do arquivo salvo para envio desta atividade?
- 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?