Capítulo 17: Funções I: Procedimentos sem Retorno (Modularização I e Escopo)

🎯 Objetivo da Aula

Programas corporativos reais não possuem 20 ou 30 linhas: eles contêm milhares de linhas de código. Escrever tudo amontoado dentro de uma única funcao inicio() torna o software impossível de ler, testar e manter. A solução consagrada da Engenharia de Software é a Modularização.

Nesta aula, você aprenderá a:

  1. Compreender o princípio DRY (Don’t Repeat Yourself) e a decomposição modular.
  2. Dominar a sintaxe de funções sem retorno: funcao vazio Nome(parametros) { ... } no Portugol Studio.
  3. Diferenciar Variáveis Globais (declaradas fora das funções) de Variáveis Locais (declaradas dentro da função).
  4. Praticar a Passagem de Parâmetros por Valor.

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


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

Situação: O sistema de emissão de faturas da FastLog possui diversas telas diferentes (Cadastro de Motoristas, Consulta de Frota, Emissão de CT-e, etc.). Em todas as telas, é obrigatório imprimir um Cabeçalho Visual Padronizado com o logotipo da empresa e desenhar molduras de mensagens. Toda vez que o slogan da empresa muda, o programador precisa alterar 10 partes diferentes do código manual.

Missão: Você deve criar a sub-rotina modular funcao vazio imprimir_cabecalho(cadeia titulo) e funcao vazio exibir_alerta(cadeia msg), centralizando a formatação visual e eliminando a duplicidade de código no sistema.


🧠 Fundamentos: A Teoria da Modularização

1. O que é uma Função sem Retorno (funcao vazio)?

Uma Função vazio (Procedure / Void Function) é um bloco independente de instruções que realiza uma tarefa específica quando é invocada pelo programa principal, mas não devolve nenhum valor numérico ou textual diretamente:

graph TD
    A[funcao inicio - Principal] -->|1. Invoca: imprimir_cabecalho| B["funcao vazio imprimir_cabecalho()"]
    B -->|2. Desenha moldura e título| B
    B -->|3. Retorna controle ao chamador| A
    A -->|4. Continua execução normal| C[Processar Pedido]
    
    style A fill:#2980b9,stroke:#fff,stroke-width:2px,color:#fff
    style B fill:#f39c12,stroke:#fff,stroke-width:2px,color:#fff
    style C fill:#217346,stroke:#fff,stroke-width:2px,color:#fff

2. Onde Declarar Funções no Portugol Studio?

As funções devem ser escritas dentro do bloco programa { }, no mesmo nível hierárquico da função inicio():

 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
programa 
{
	// 1. Variáveis Globais (Visíveis por todas as funções)
	cadeia empresaGlobal = "FastLog Transportes S.A."

	// 2. Declaração do Módulo / Procedimento
	funcao vazio desenhar_linha() 
	{
		escreva("------------------------------------------\n")
	}

	funcao vazio imprimir_cabecalho(cadeia titulo) 
	{
		desenhar_linha()
		escreva("   ", empresaGlobal, "\n")
		escreva("   ", titulo, "\n")
		desenhar_linha()
	}

	// 3. Ponto de Entrada Principal
	funcao inicio() 
	{
		imprimir_cabecalho("MÓDULO DE EXPEDIÇÃO")
		escreva("Sessão Operacional Iniciada.\n")
		desenhar_linha()
	}
}

3. Escopo de Variáveis: Global vs Local

Tipo de EscopoOnde é declarada?Onde pode ser lida/alterada?Tempo de Vida na RAM
Variável GlobalNo topo do bloco programa, fora de qualquer função.No inicio() e dentro de qualquer outra função.Enquanto o programa estiver rodando.
Variável LocalDentro das chaves { } de uma função específica.Apenas e exclusivamente dentro daquela função.Criada ao chamar e destruída ao sair.

📖 Exemplo Guiado: Sistema Modular com Notificações

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
programa 
{
	funcao vazio desenhar_divisor() 
	{
		escreva("==================================================\n")
	}

	funcao vazio notificar_status(cadeia mensagem, logico ehUrgente) 
	{
		escreva("\n")
		se (ehUrgente) 
		{
			escreva(">>> [ALERTA DE EMERGÊNCIA]:\n")
			escreva("    ", mensagem, "\n")
		} 
		senao 
		{
			escreva(">>> [INFORMAÇÃO DO SISTEMA]:\n")
			escreva("    ", mensagem, "\n")
		}
		desenhar_divisor()
	}

	funcao inicio() 
	{
		desenhar_divisor()
		escreva("       FASTLOG - TORRE DE CONTROLE 2026           \n")
		desenhar_divisor()

		// Invocação das funções parametrizadas
		notificar_status("Caminhão BRA-2E19 atracado na doca 04.", falso)
		notificar_status("Sensor de temperatura da câmara fria 02 disparou!", verdadeiro)
	}
}

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
==================================================
       FASTLOG - TORRE DE CONTROLE 2026           
==================================================

>>> [INFORMAÇÃO DO SISTEMA]:
    Caminhão BRA-2E19 atracado na doca 04.
==================================================

>>> [ALERTA DE EMERGÊNCIA]:
    Sensor de temperatura da câmara fria 02 disparou!
==================================================

🛠️ Prática Obrigatória 1: Procedimento de Menu Padronizado

Passo 1: O Desafio

Crie um programa menu_modular.por que contenha a função: funcao vazio exibir_menu() Essa função deve desenhar na tela o menu com as opções:

  • [1] Cadastrar Motorista
  • [2] Consultar Frota
  • [3] Relatório de Viagens
  • [0] Sair do Sistema

No programa principal inicio(), chame essa função dentro de um laço faca-enquanto (opcao != 0).


🛠️ Prática Obrigatória 2: Procedimento Calculador de ICMS Parametrizado

Crie uma função sem retorno chamada funcao vazio calcular_icms(real valorFrete, real aliquota) que receba o valor bruto do frete e a alíquota (ex: 0.12 para 12%), calculando e imprimindo o valor exato do imposto no console. Chame a função 3 vezes no programa principal para fretes diferentes.


📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_17_SeuNome_SeuSobrenome.por.
  2. Certifique-se de que todas as funções estão dentro de programa { }.
  3. No Microsoft Teams, envie na tarefa “Portugol Cap 17 - Funções e Modularização”.
  4. Clique em Entregar (Turn In).

💡 Checkpoint de Lógica & Engenharia de Software

Você acabou de aplicar o princípio DRY (Don’t Repeat Yourself). Em grandes empresas de tecnologia, a reutilização de código através de bibliotecas de funções economiza milhões de reais em horas de desenvolvimento e reduz drasticamente a ocorrência de bugs.


🔥 Desafio de Fixação: Moldura com Caractere Customizável

Crie uma função funcao vazio moldura_customizada(cadeia msg, caracter simbolo) que receba a mensagem e o símbolo de borda (ex: '#' ou '*'), desenhando uma caixa personalizada ao redor do texto.


🔑 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
programa {
	funcao vazio exibir_menu() {
		escreva("==========================================\n")
		escreva("         PAINEL OPERACIONAL FASTLOG       \n")
		escreva("==========================================\n")
		escreva(" [1] Cadastrar Motorista\n")
		escreva(" [2] Consultar Frota\n")
		escreva(" [3] Relatório de Viagens\n")
		escreva(" [0] Sair do Sistema\n")
		escreva("==========================================\n")
		escreva("Digite a opção: ")
	}

	funcao inicio() {
		inteiro opcao

		faca {
			exibir_menu()
			leia(opcao)

			escolha (opcao) {
				caso 1: escreva(">> Módulo de Cadastro acionado.\n\n") pare
				caso 2: escreva(">> Módulo de Consulta acionado.\n\n") pare
				caso 3: escreva(">> Módulo de Relatórios acionado.\n\n") pare
				caso 0: escreva(">> Encerrando o sistema...\n") pare
				caso contrario: escreva(">> Opção inválida!\n\n")
			}
		} enquanto (opcao != 0)
	}
}

Prática 2:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
programa {
	funcao vazio calcular_icms(real valorFrete, real aliquota) {
		real imposto = valorFrete * aliquota
		escreva("------------------------------------------\n")
		escreva("Frete Base : R$ ", valorFrete, "\n")
		escreva("Alíquota   : ", (aliquota * 100), "%\n")
		escreva("ICMS Devido: R$ ", imposto, "\n")
		escreva("------------------------------------------\n")
	}

	funcao inicio() {
		escreva("=== APURAÇÃO FISCAL DE FRETES ===\n")
		calcular_icms(1500.00, 0.12)
		calcular_icms(3200.00, 0.18)
		calcular_icms(850.00, 0.07)
	}
}

Desafio:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
programa {
	funcao vazio moldura_customizada(cadeia msg, caracter simbolo) {
		escreva(simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, "\n")
		escreva(simbolo, " ", msg, "\n")
		escreva(simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, simbolo, "\n")
	}

	funcao inicio() {
		moldura_customizada("SISTEMA OK", '#')
		moldura_customizada("ALERTA DOCA", '*')
	}
}

📝 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 é uma Função vazio (funcao vazio), segundo a definição dos Fundamentos, e o que a diferencia de uma função que devolve valor?
  2. Qual é a sintaxe geral de declaração de uma função sem retorno no Portugol Studio?
  3. Onde as funções devem ser declaradas em relação ao bloco programa { } e à função inicio(), segundo o capítulo?
  4. Segundo a tabela de Escopo de Variáveis, qual é a diferença entre uma Variável Global e uma Variável Local quanto ao local de declaração e à visibilidade dentro do programa?
  5. No exemplo de código dos Fundamentos, onde a variável empresaGlobal é declarada, e por que ela pode ser usada dentro da função imprimir_cabecalho()?
  6. No Exemplo Guiado (Sistema Modular com Notificações), qual é o propósito do parâmetro ehUrgente da função notificar_status, e o que ele determina no comportamento da função?
  7. Na Prática Obrigatória 1 (Procedimento de Menu Padronizado), quais são as 4 opções que devem aparecer no menu exibido pela função exibir_menu()?
  8. Na Prática Obrigatória 2 (Calculador de ICMS Parametrizado), quais dois parâmetros a função calcular_icms deve receber, e quantas vezes ela deve ser chamada no programa principal?
  9. Segundo o Checkpoint de Lógica & Engenharia de Software, o que significa o princípio DRY (Don’t Repeat Yourself) e qual é o benefício citado da reutilização de código em grandes empresas de tecnologia?
  10. Qual é o problema prático enfrentado no sistema de faturas da FastLog, descrito no Cenário Prático, que motivou a criação de funções centralizadas como imprimir_cabecalho e exibir_alerta?