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

🎯 Objetivo da Aula

Um software profissional precisa ser dinâmico: ele conversa com o operador humano, solicita informações pelo teclado, processa os dados na memória RAM e devolve relatórios e faturas na tela.

Nesta aula, você aprenderá a:

  1. Compreender o ciclo de Entrada (stdin), Processamento e Saída (stdout).
  2. Capturar dados digitados pelo usuário com o comando leia().
  3. Dominar a Concatenação de textos e variáveis com vírgulas no comando escreva().
  4. Utilizar a biblioteca nativa Matematica para arredondar valores monetários com 2 casas decimais (mat.arredondar()).

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


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

Situação: A recepção do Centro de Distribuição da FastLog precisa de um sistema de autoatendimento no balcão. O atendente digita os dados do despacho (nome do cliente, peso da mercadoria em kg e distância da entrega em km). O programa deve processar as tarifas em tempo real e emitir o Recibo Oficial de Conhecimento de Transporte (CT-e) na tela.

Missão: Programar o Terminal de Atendimento FastLog, capturando interativamente os dados pelo teclado e exibindo a fatura final com valores monetários devidamente arredondados.


🧠 Fundamentos: O Ciclo de Entrada e Saída

graph LR
    Input["1. ENTRADA (leia)<br/>Teclado: peso, km"] --> Process["2. PROCESSAMENTO<br/>CPU / RAM: total = taxa + (km * 3.5)"]
    Process --> Output["3. SAÍDA (escreva)<br/>Console: Recibo Formatado"]
    
    style Input fill:#2980b9,stroke:#fff,color:#fff
    style Process fill:#8e44ad,stroke:#fff,color:#fff
    style Output fill:#27ae60,stroke:#fff,color:#fff

1. O Comando leia()

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

1
2
3
cadeia motorista
escreva("Digite o nome do motorista: ")
leia(motorista)

Comandos na mesma linha
O Portugol Studio não usa ; para separar comandos, então escreva(...) e leia(...) também podem ficar juntos na mesma linha, como um atalho mais compacto:

1
escreva("Digite o nome do motorista: ") leia(motorista)

As duas formas (linhas separadas ou combinadas) funcionam exatamente igual — você vai ver o estilo compacto em vários gabaritos de código deste curso a partir daqui.


2. Concatenação de Dados com escreva()

Para combinar textos fixos (entre aspas) e variáveis, separamos os elementos por vírgulas:

1
escreva("Olá, ", motorista, "! Seu veículo tem peso de ", pesoKg, " kg.\n")

3. Arredondamento com a Biblioteca Matematica

Para evitar números com dízimas periódicas como 1500.3333333 no console, importamos a biblioteca nativa Matematica:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
programa 
{
	inclua biblioteca Matematica --> mat // Importa e dá o apelido 'mat'

	funcao inicio() 
	{
		real valorOriginal = 1500.3333333
		real valorArredondado = mat.arredondar(valorOriginal, 2) // 2 casas decimais
		escreva("Total a Pagar: R$ ", valorArredondado, "\n")
	}
}

📖 Exemplo Guiado: Simulador de Frete Interativo

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
programa 
{
	inclua biblioteca Matematica --> mat

	funcao inicio() 
	{
		cadeia cliente
		real pesoKg, distanciaKm, totalFrete
		real taxaFixa = 60.00
		real tarifaPorKm = 3.50

		escreva("==========================================\n")
		escreva("      FASTLOG - COTAÇÃO DE FRETES         \n")
		escreva("==========================================\n")
		
		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 * tarifaPorKm) + (pesoKg * 0.75)
		totalFrete = mat.arredondar(totalFrete, 2)

		// Saída Formatada
		escreva("\n------------ RESUMO DO PEDIDO ------------\n")
		escreva("Cliente Cadastrado : ", cliente, "\n")
		escreva("Distância da Rota  : ", distanciaKm, " km\n")
		escreva("Peso Declarado     : ", pesoKg, " kg\n")
		escreva("------------------------------------------\n")
		escreva("VALOR TOTAL COTAÇÃO: R$ ", totalFrete, "\n")
		escreva("==========================================\n")
	}
}

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

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

------------ RESUMO DO PEDIDO ------------
Cliente Cadastrado : Metalúrgica Delta
Distância da Rota  : 250.0 km
Peso Declarado     : 600.0 kg
------------------------------------------
VALOR TOTAL COTAÇÃO: R$ 1385.0
==========================================

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

Passo 1: O Desafio

Crie um programa romaneio_expedicao.por que solicite pelo teclado:

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

O programa deve calcular o Peso Total (quantidadeCaixas * pesoUnitario) e o Valor Assegurado (quantidadeCaixas * valorUnitario), exibindo o romaneio completo.

✅ Resultado Esperado (Prática 1):

1
2
3
4
5
6
7
=== ROMANEIO DE EXPEDIÇÃO ===
Pedido Nº: 2045
Item: Baterias Automotivas
Total de Caixas: 15 un
Peso Total: 180.0 kg
Valor Assegurado: R$ 4500.0
=============================

🛠️ Prática Obrigatória 2: Rateio de Despesas de Viagem

Crie um programa rateio_despesas.por que receba:

  • O total gasto com óleo diesel.
  • O total gasto com pedágios e alimentação.
  • A quantidade de passageiros na van corporativa. O programa deve somar todos os custos e informar o valor individual por passageiro arredondado em 2 casas decimais.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_04_SeuNome_SeuSobrenome.por.
  2. Execute o código e valide se os valores digitados geram saídas perfeitas.
  3. No Microsoft Teams, envie na tarefa “Portugol Cap 04 - Entrada e Saída”.
  4. Clique em Entregar (Turn In).

💡 Checkpoint de Lógica & Engenharia de Software

Você acabou de dominar a comunicação bidirecional com o usuário. Softwares de terminal (CLIs) em ambientes de DevOps utilizam esse mesmo mecanismo para coletar parâmetros em scripts de automação e implantação (Deploy).


🔥 Desafio de Fixação: Holerite com Cálculo de Horas Extras

Crie um programa que receba o nome do motorista, o salário base e as horas extras trabalhadas. Calcule a hora extra com 50% de adicional e exiba o holerite com o salário líquido final.


🔑 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
programa {
	funcao inicio() {
		inteiro numeroPedido, quantidadeCaixas
		cadeia descricaoItem
		real pesoUnitario, valorUnitario, pesoTotal, valorTotal

		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

		escreva("\n=== ROMANEIO DE EXPEDIÇÃO ===\n")
		escreva("Pedido Nº: ", numeroPedido, "\n")
		escreva("Item: ", descricaoItem, "\n")
		escreva("Total de Caixas: ", quantidadeCaixas, " un\n")
		escreva("Peso Total: ", pesoTotal, " kg\n")
		escreva("Valor Assegurado: R$ ", valorTotal, "\n")
		escreva("=============================\n")
	}
}

Prática 2:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
programa {
	inclua biblioteca Matematica --> mat

	funcao inicio() {
		real gastoDiesel, gastoPedagio, custoTotal, valorPorPassageiro
		inteiro qtdPassageiros

		escreva("Gasto com Diesel (R$): ") leia(gastoDiesel)
		escreva("Gasto com Pedágios/Alimentação (R$): ") leia(gastoPedagio)
		escreva("Quantidade de Passageiros: ") leia(qtdPassageiros)

		custoTotal = gastoDiesel + gastoPedagio
		valorPorPassageiro = mat.arredondar(custoTotal / qtdPassageiros, 2)

		escreva("\nCusto Total da Viagem: R$ ", custoTotal, "\n")
		escreva("Valor por Passageiro : R$ ", valorPorPassageiro, "\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
programa {
	inclua biblioteca Matematica --> mat

	funcao inicio() {
		cadeia nomeMotorista
		real salarioBase, horasExtras, valorHoraNormal, valorHoraExtra, salarioFinal

		escreva("Nome do Motorista: ") leia(nomeMotorista)
		escreva("Salário Base (R$): ") leia(salarioBase)
		escreva("Horas Extras Trabalhadas: ") leia(horasExtras)

		valorHoraNormal = salarioBase / 220.0 // Base de 220h mensais
		valorHoraExtra = valorHoraNormal * 1.50
		salarioFinal = mat.arredondar(salarioBase + (horasExtras * valorHoraExtra), 2)

		escreva("\n=== DEMONSTRATIVO DE PAGAMENTO ===\n")
		escreva("Colaborador: ", nomeMotorista, "\n")
		escreva("Valor da Hora Normal: R$ ", mat.arredondar(valorHoraNormal, 2), "\n")
		escreva("Valor da Hora Extra (50%): R$ ", mat.arredondar(valorHoraExtra, 2), "\n")
		escreva("SALÁRIO LÍQUIDO A RECEBER: R$ ", salarioFinal, "\n")
		escreva("==================================\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 leia(variavel) faz quando executado, segundo o capítulo?
  2. Quais são as três etapas do ciclo de Entrada, Processamento e Saída apresentado no diagrama do capítulo?
  3. Como se combinam textos fixos e variáveis dentro do comando escreva()? Que símbolo separa os elementos?
  4. Qual comando é usado para importar a biblioteca Matematica no Portugol Studio, e qual apelido é dado a ela no exemplo do capítulo?
  5. Qual função da biblioteca Matematica é usada para arredondar um valor com um número específico de casas decimais? Dê um exemplo de uso.
  6. Na Prática Obrigatória 1 (Romaneio de Expedição), quais cinco dados o programa deve solicitar ao usuário pelo teclado?
  7. Como o Peso Total deve ser calculado na Prática Obrigatória 1, segundo a fórmula descrita?
  8. Na Prática Obrigatória 2 (Rateio de Despesas de Viagem), como deve ser calculado o valor individual por passageiro?
  9. Segundo o Checkpoint de Lógica, em que tipo de sistemas (citados no texto) esse mesmo mecanismo de entrada e saída pelo teclado é utilizado?
  10. Qual tecla o usuário deve pressionar após digitar um valor para que o comando leia() capture a informação?