Capítulo 18: Funções II: Parâmetros e Retorno Tipado (Modularização II)

🎯 Objetivo da Aula

Enquanto uma Função vazio apenas executa uma ação na tela sem devolver nada para quem a chamou, uma Função com Retorno é uma máquina matemática: ela recebe dados de entrada (parâmetros), processa o cálculo internamente e devolve um resultado concreto (retorno) que pode ser guardado em uma variável ou utilizado em fórmulas matemáticas complexas.

Nesta aula, você aprenderá a:

  1. Compreender a diferença conceitual entre Função vazio e Função Tipada com Retorno.
  2. Dominar a sintaxe: funcao tipo_retorno Nome(parametros) { ... retorne resultado }.
  3. Utilizar o comando retorne no Portugol Studio.
  4. Construir uma Biblioteca de Funções Tarifárias e Matemáticas Puras.

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


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

Situação: O departamento de engenharia tarifária da FastLog precisa padronizar os cálculos de frete de toda a empresa. A fórmula do frete é composta por: $$\text{FreteBase} = (\text{DistanciaKm} \times 3.50) + (\text{PesoKg} \times 0.80)$$ $$\text{FreteComSeguro} = \text{FreteBase} \times 1.015 \quad (\text{Acréscimo de 1.5%})$$ Se cada programador escrever essa conta manualmente em diferentes partes do sistema, qualquer reajuste de tarifas causará divergências financeiras.

Missão: Você deve construir a Biblioteca Central de Funções Tarifárias, criando funções com retorno tipado para cálculo de frete base, seguro e conversão monetária internacional.


🧠 Fundamentos: Funções Tipadas na Computação

1. Função vazio vs Função Tipada

CaracterísticaFunção sem Retorno (funcao vazio)Função Tipada (funcao real / inteiro / ...)
Gera valor de resposta?Não. Apenas executa ações na tela.Sim. Devolve obrigatoriamente um valor tipado.
Instrução de SaídaNão possui.Exige o comando retorne valor.
Pode ser guardada em variável?❌ Não (x = imprimir() gera erro de compilação!).Sim (x = calcular_total(10, 20)).
Pode ser usada dentro de um se?❌ Não.Sim (se (validar_senha(s) == verdadeiro)).
graph LR
    subgraph Chamada ["funcao inicio()"]
        Input["Parâmetros: peso=500.0, km=200.0"] --> Func["Chama: calcular_frete(500.0, 200.0)"]
    end
    subgraph Processamento ["funcao real calcular_frete()"]
        Func --> Proc["Processa fórmula tarifária"]
        Proc --> Ret["retorne 1100.00"]
    end
    Ret --> Output["Variável 'total' recebe: R$ 1100.00"]
    
    style Input fill:#2980b9,stroke:#fff,color:#fff
    style Func fill:#8e44ad,stroke:#fff,color:#fff
    style Ret fill:#27ae60,stroke:#fff,color:#fff
    style Output fill:#217346,stroke:#fff,color:#fff

2. A Sintaxe no Portugol Studio

1
2
3
4
5
6
// Especificamos o tipo de retorno ANTES do nome da função
funcao real somar_valores(real a, real b) 
{
	real resultado = a + b
	retorne resultado // Devolve o valor para quem chamou!
}

O tipo de retorno pode ser qualquer um dos cinco tipos primitivos do Portugol Studio — inclusive cadeia, para funções que devolvem texto pronto para exibição:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
funcao cadeia classificar_urgencia(inteiro diasRestantes) 
{
	se (diasRestantes <= 1) 
	{
		retorne "URGENTE"
	} 
	senao 
	{
		retorne "NORMAL"
	}
}

📖 Exemplo Guiado: Motor Tarifário com Funções Puras

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
44
45
46
47
48
49
50
51
52
53
54
55
programa 
{
	// 1. Função Tipada: Cálculo do Frete Base
	funcao real calcular_frete_base(real distancia, real pesoKg) 
	{
		real custo = (distancia * 3.50) + (pesoKg * 0.80)
		retorne custo
	}

	// 2. Função Tipada: Aplicação de Taxa de Seguro RCTR-C (1.5%)
	funcao real aplicar_seguro(real valorBase) 
	{
		retorne valorBase * 1.015 // Acrescenta 1.5%
	}

	// 3. Função Tipada Booleana: Validação de Peso
	funcao logico validar_peso_maximo(real pesoKg) 
	{
		se (pesoKg <= 30000.0) 
		{
			retorne verdadeiro
		} 
		senao 
		{
			retorne falso
		}
	}

	funcao inicio() 
	{
		real km, peso, valorBase, valorFinal

		escreva("=== MOTOR TARIFÁRIO FASTLOG 2026 ===\n")
		escreva("Distância da Rota (km): ")
		leia(km)
		escreva("Peso da Carga (kg): ")
		leia(peso)

		se (validar_peso_maximo(peso)) 
		{
			// Chamada encadeada de funções com retorno
			valorBase = calcular_frete_base(km, peso)
			valorFinal = aplicar_seguro(valorBase)

			escreva("\n------------------------------------\n")
			escreva("Frete Base Calculado   : R$ ", valorBase, "\n")
			escreva("Frete Final com Seguro : R$ ", valorFinal, "\n")
			escreva("------------------------------------\n")
		} 
		senao 
		{
			escreva("\n[ERRO]: Carga excede o limite máximo permitido de 30 toneladas!\n")
		}
	}
}

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

1
2
3
4
5
6
7
8
=== MOTOR TARIFÁRIO FASTLOG 2026 ===
Distância da Rota (km): 400
Peso da Carga (kg): 1200

------------------------------------
Frete Base Calculado   : R$ 2360.0
Frete Final com Seguro : R$ 2395.4
------------------------------------

🛠️ Prática Obrigatória 1: Função de Validação de Placa Mercosul

Passo 1: O Desafio

Utilizando a biblioteca Texto, crie uma função booleana: funcao logico validar_tamanho_placa(cadeia placa) A função deve retornar verdadeiro se o tamanho da placa for exatamente 7 caracteres (txt.numero_caracteres(placa) == 7), ou falso caso contrário. No inicio(), leia uma placa e utilize a função dentro de um se.

✅ Resultado Esperado (Prática 1):

1
2
Digite a placa do caminhão: BRA2E19
>>> [SUCESSO]: Placa 'BRA2E19' é válida (7 caracteres).

🛠️ Prática Obrigatória 2: Calculadora de Performance Ponderada

Crie uma função funcao real calcular_score(real pont, real seg, real econ) que calcule a média ponderada com os seguintes pesos:

  • Pontualidade: Peso 4
  • Segurança: Peso 4
  • Economia Diesel: Peso 2 $$\text{Score} = \frac{(\text{pont} \times 4) + (\text{seg} \times 4) + (\text{econ} \times 2)}{10}$$

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_18_SeuNome_SeuSobrenome.por.
  2. Certifique-se de que todas as funções tipadas possuem a instrução retorne.
  3. No Microsoft Teams, envie na tarefa “Portugol Cap 18 - Parâmetros e Retorno”.
  4. Clique em Entregar (Turn In).

💡 Checkpoint de Lógica & Engenharia de Software

Você acabou de aplicar o conceito de Funções Puras (Pure Functions). Em programação funcional e arquiteturas modernas de microsserviços (como AWS Lambda e Google Cloud Functions), as funções são desenhadas sem efeitos colaterais: recebem dados por parâmetro e retornam novos dados com total previsibilidade.


🔥 Desafio de Fixação: Conversor de Moeda Internacional

Crie uma função funcao real converter_dolar(real valorUSD, real cotacao) que receba um valor em dólares e a cotação do dia, retornando o valor convertido em Reais (BRL).


🔑 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
programa {
	inclua biblioteca Texto --> txt

	funcao logico validar_tamanho_placa(cadeia placa) {
		se (txt.numero_caracteres(placa) == 7) {
			retorne verdadeiro
		} senao {
			retorne falso
		}
	}

	funcao inicio() {
		cadeia placaDigitada

		escreva("Digite a placa do caminhão (7 dígitos): ")
		leia(placaDigitada)

		escreva("\n")
		se (validar_tamanho_placa(placaDigitada)) {
			escreva(">>> [SUCESSO]: Placa '", placaDigitada, "' atende ao padrão Mercosul (7 caracteres).\n")
		} senao {
			escreva(">>> [ERRO]: Placa inválida! Comprimento incorreto.\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
programa {
	funcao real calcular_score(real pont, real seg, real econ) {
		real mediaPonderada = ((pont * 4.0) + (seg * 4.0) + (econ * 2.0)) / 10.0
		retorne mediaPonderada
	}

	funcao inicio() {
		real n1, n2, n3, scoreFinal

		escreva("=== AVALIAÇÃO DE DESEMPENHO DO MOTORISTA ===\n")
		escreva("Nota de Pontualidade (0 a 10): ") leia(n1)
		escreva("Nota de Segurança Viária (0 a 10): ") leia(n2)
		escreva("Nota de Economia Diesel (0 a 10): ") leia(n3)

		scoreFinal = calcular_score(n1, n2, n3)

		escreva("\n------------------------------------------\n")
		escreva("ÍNDICE DE PERFORMANCE (SCORE): ", scoreFinal, "\n")
		
		se (scoreFinal >= 8.5) {
			escreva("STATUS: CLASSIFICAÇÃO EXCELENTE (Elegível a Prêmio)\n")
		} senao {
			escreva("STATUS: CLASSIFICAÇÃO REGULAR\n")
		}
		escreva("------------------------------------------\n")
	}
}

Desafio:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
programa {
	funcao real converter_dolar(real valorUSD, real cotacao) {
		retorne valorUSD * cotacao
	}

	funcao inicio() {
		real freteUSD, cotacaoHoje, freteBRL

		escreva("=== COTAÇÃO DE FRETE INTERNACIONAL ===\n")
		escreva("Valor do Frete Marítimo (US$): ") leia(freteUSD)
		escreva("Cotação Atual do Dólar (R$): ") leia(cotacaoHoje)

		freteBRL = converter_dolar(freteUSD, cotacaoHoje)

		escreva("\nValor Original em Dólares : US$ ", freteUSD, "\n")
		escreva("VALOR CONVERTIDO EM REAIS : R$  ", freteBRL, "\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. Qual é a principal diferença entre uma Função vazio e uma Função Tipada com Retorno, segundo a tabela comparativa dos Fundamentos?
  2. Qual comando obrigatório uma Função Tipada deve usar para devolver seu resultado, e onde ele se posiciona na sintaxe de declaração da função?
  3. Segundo a tabela comparativa dos Fundamentos, uma função vazio pode ser usada dentro de uma condição se, como se (validar_senha(s) == verdadeiro)? Por quê?
  4. No Exemplo Guiado (Motor Tarifário), qual fórmula a função calcular_frete_base utiliza para calcular o custo, com base na distância e no peso?
  5. No Exemplo Guiado, qual é a função responsável por verificar se o peso da carga não ultrapassa o limite máximo, e qual valor ela retorna em cada um dos dois casos possíveis?
  6. Na Prática Obrigatória 1 (Validação de Placa Mercosul), qual condição a função validar_tamanho_placa verifica para retornar verdadeiro?
  7. Na Prática Obrigatória 2 (Calculadora de Performance Ponderada), quais são os pesos atribuídos a Pontualidade, Segurança e Economia Diesel no cálculo do Score?
  8. Segundo o Checkpoint de Lógica & Engenharia de Software, o que caracteriza uma Função Pura (Pure Function), e em quais arquiteturas modernas esse conceito é citado como aplicado?
  9. No Exemplo Guiado, o que o programa exibe se o peso digitado exceder 30.000 kg (30 toneladas)?
  10. Explique com suas palavras, usando a fórmula apresentada no Cenário Prático, por que centralizar o cálculo de frete em uma função evita divergências financeiras quando há reajuste de tarifas.