Você está na página 1de 67

PROGRAMAÇÃO

ESTRUTURADA
© 2023 Faculdade Vincit.
Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998.
Nenhuma parte deste livro, sem autorização prévia por escrito da editora, poderá ser reproduzida
ou transmitida sejam quaisquer forem os meios empregados: eletrônicos, fotográ cos, gravação ou
quaisquer outros.

Diretor Editorial Projeto Grá co

Luiz F. Braga Lopes Cléber Molina

Assistência Editorial Diagramação

Anderson Miyatake Alex Rocha

Preparação dos originais Capa

Alex Rocha Cléber Molina

Revisão

Cleverson Dias Nunes

Dados Internacionais de Catalogação na Publicação (CIP)


(Câmara Brasileira do Livro, SP, Brasil)

R672a Rocha, Alex Diego Araujo da

Programação Estruturada / Alex


Rocha. Maringá, Faculdade Vincit, 2023.

Bibliografia
ISBN 00-000-0000-0

1. Computadores – Programação 2.
Computadores – Processamento de dados
I. Título.

00-0000 CDD-000.0000-000.00000

Faculdade Vincit
Av. João Paulino Vieira Filho, 870. Primeiro andar, salas 1 a 14.
CEP 87020-015 ᆞMaringá/PR
email: conteudo@uniciv.com.br
Palavra do diretor
Nosso mundo atual não mais valoriza pessoas que detém conhecimento,
que são norteadas por fortes valores morais ou que acumulam grandes
fortunas. O valor é alocado às pessoas que compartilham o
conhecimento que detém, que usam seus valores morais como fonte de
mudança no mundo e que investem suas fortunas sabiamente.

A partir dessa premissa, nossa instituição tem como missão oferecer


cursos que sejam acessíveis, de excelência cultural, sustentável e ética
contribuindo para o desenvolvimento social e tecnológico do país.

Eu, Luiz Fernando Braga Lopes, acredito na transformação através da


disciplina e estudo constante. Sou faixa preta em karatê e desde que comecei a estudar, nunca mais
parei. Sempre estou me atualizando, buscando novos cursos, novos desa os e novas formas de
inovar.

Por acreditar tanto no poder da inovação, criei um Centro de Inovação, a única instituição do Brasil
focada em pós-graduação que apostou 100% na área da TI. São mais de 100 disciplinas gravadas
com mais de 50 professores que contribuíram para que nossa instituição fosse construída.

E desse nosso espírito de inovação e conquista surgiu a Faculdade VINCIT. Vincit, em português,
signi ca Vencer e essa palavra traduz o nosso objetivo de ajudar nossos alunos a vencerem em suas
vidas através de inovação, colaboração, disciplina e adaptabilidade.

Estamos vivenciando uma era de queda de barreiras. As barreiras que separavam áreas de
conhecimento, que separam a vida pessoal da vida pro ssional e o ambiente doméstico do ambiente
de trabalho estão cada vez menores.

Não é mais possível pensar em realização pessoal e qualidade de vida sem considerar com peso
signi cativo o âmbito pro ssional, sem o sentimento de contribuição a esse mundo que muda cada
vez mais rápido, sem a sensação de que há sempre algo a mais para almejar e que as possibilidades de
crescimento estão mais próximas de cada um, contanto que você faça as escolhas certas.

Pensando nisso, convido-o a se apaixonar pela sua área de atuação, pois é através dessa paixão que
você encontrará motivação para aprofundar-se, para dedicar-se e será fácil e natural que você sempre
faça escolhas que te abram possibilidades e essas escolhas farão com que os objetivos que você almeja
se tornem alcançáveis.
Apresentação
Caríssimo aluno (a), é com imenso prazer que o reencontro em mais uma obra escrita. Certamente
estamos juntos, caminhando na jornada do conhecimento para que você se torne um (uma)
destacado pro ssional, ascendendo a cada degrau de sua formação na escalada do sucesso de sua
carreira.

Nesta obra, daremos continuidade ao aprendizado de algoritmos e lógica de programação, e


aprenderemos um importante conceito relacionado à programação de computadores: o paradigma
da Programação Estruturada. É através deste paradigma de programação que podemos elaborar
melhores algoritmos, capazes de solucionar problemas maiores e mais complexos, sem comprometer
a qualidade e o entendimento do programa.

Este livro está organizado em cinco capítulos, que apresentam as particularidades do paradigma da
Programação Estruturada. Passaremos por cada um dos capítulos fundamentando os pilares desse
paradigma de programação, sedimentando esse aprendizado de forma sistematizada e simpli cada.

Iniciaremos, no primeiro capítulo, com uma breve introdução ao paradigma da Programação


Estruturada, entendendo quais são os pilares dessa técnica de programação, sendo um resumo para
os próximos quatro capítulos do livro. Veremos, de forma resumida, quais conceitos devemos
aprender para dominar este paradigma de programação, e que fundamentam o aprendizado de
outros paradigmas e técnicas de programação que conheceremos futuramente.

O segundo capítulo e o terceiro capítulo fundamentam os conceitos iniciais do paradigma da


programação estruturada, pois ensinam como funcionam as estruturas de dados utilizadas na
programação de algoritmos. Você aprenderá como e quando devem ser utilizadas as estruturas
homogêneas e heterogêneas de dados, além de compreender as limitações de cada tipo de estrutura.

Já no quarto capítulo você aprenderá o principal pilar da Programação Estruturada: a Programação


Modular. É através deste conceito que você entenderá o que são e como funcionam as subrotinas, já
que permitem ao programador modularizar a estrutura do programa, algo que proporciona alguns
benefícios à programação, como legibilidade e o reaproveitamento de código.

Por m, mas não menos importante, o quinto e último capítulo deste livro traz os conceitos da
Programação Recursiva. Este importante conceito lhe proporcionará uma visão diferente de como
resolver problemas complexos na programação; você aprenderá a técnica para analisar e elaborar
soluções para problemas em que não se conhece a solução nal, apenas uma parte dela.

Apesar de breve, este livro apresenta conceitos extremamente importantes para o aprendizado de
algoritmos. A Programação Estruturada é um paradigma de programação muito importante, e
ainda muito utilizado para elaborar programas comerciais. Além disso, é a base fundamental para o
aprendizado de outros paradigmas de programação, como a Orientação a Objetos e também a
Orientação a Eventos, entre outros.

Aproveite ao máximo este livro, que preparei com muito carinho e dedicação. Espero que ajude em
sua caminhada como futuro pro ssional de desenvolvimento de software. Desejo-lhe sorte e
sucesso em sua jornada.

Bons estudos!
Sumário
I. Introdução à Programação Estruturada 7

Pseudocódigo 8

Fluxogramas 11

Tipos complexos 13

Programação modular 14

II. Estruturas homogêneas: Vetores e Matrizes 19

De nição 19

Vetores 20

Matrizes 24

Estruturas multidimensionais 28

III. Estruturas heterogêneas: Registros 31

Conceito 32

Registros de tipos primitivos 35

Registros de tipos complexos 36

Registros com vetores 37

Registros de registros 38

Vetores de registros 39

IV. Programação modular: Procedimentos e Funções 41

Subrotinas 41

Procedimentos 43

Funções 45

Passagem de parâmetros 48

Passagem por valor 49


Passagem por referência 50

Passagem de vetores 51

Passagem de registros 53

Parâmetros Opcionais 54

V. Recursividade 56

Caso base e caso recursivo 57

Notação Cientí ca 59

Sequência de Fibonacci 60

Referências 63
Programação Estruturada Introdução à Programação Estruturada

Capítulo Introdução à
I Programação Estruturada

Introdução
Olá, aluno! Seja bem vindo à disciplina Programação Estruturada. Nesta disciplina, daremos
continuidade ao conteúdo lecionado na primeira etapa do conteúdo a respeito de algoritmos e
lógica de programação, lecionada pela primeira disciplina de mesmo nome. Porém, neste momento,
focaremos nossos esforços em aprender os conceitos do paradigma da programação estruturada;
técnicas de programação mais complexas, porém mais próximas da realidade do uso comercial das
linguagens de programação disponíveis atualmente.

A programação estruturada é um paradigma de programação que determina como um programa


terá seus algoritmos estruturalmente organizados, possibilitando utilizar instruções como saltos e
rotuladores, funções e procedimentos e também recursividades. Todos esses conceitos dão sentido
não linear à execução dos algoritmos, deixando-os mais complexos, porém com maior capacidade de
organização de instruções e resolução de problemas.

Seguindo a mesma metodologia do primeiro livro, continuaremos a utilizar o pseudocódigo


de nido naquela obra. O objetivo em utilizar o pseudocódigo é exatamente igual, ou seja, não nos
prenderemos em uma tecnologia ou linguagem de programação especí ca, pois os conceitos que
serão ensinados neste livro poderão ser aplicados a qualquer linguagem de programação que
permita implementar algoritmos de forma estruturada.

Outra técnica que continuaremos abordando é o uso dos uxogramas para a representação de
algoritmos estudados neste livro. O intuito é que você adote, de nitivamente, os elementos de
uxograma para elaboração de seus algoritmos, independentemente do paradigma de programação
adotado, linguagem de programação ou complexidade do problema a ser resolvido. Os uxogramas
continuarão a facilitar sua abstração e lógica, permitindo que elabore os programas,
individualmente ou em equipe, sem a necessidade de adotar uma linguagem de programação ou
tecnologia especí ca.

9
Programação Estruturada Introdução à Programação Estruturada
Espero que aproveite ao máximo este livro, e que, ao nal de sua leitura, possa superar qualquer
barreira no aprendizado deste conteúdo. Bons estudos!

Pseudocódigo
Na disciplina de Algoritmos e Lógica de Programação, você foi apresentado aos conceitos do
pseudocódigo. De nimos, como uma espécie de contrato, um conjunto de instruções para
simularmos uma linguagem de programação, e que é somente utilizada de maneira conceitual, não
podendo ser utilizada para escrever programas de computador reais, sobretudo por não existir um
compilador para nossa [pseudo]linguagem.

Embora haja inúmeras limitações no uso de pseudocódigos para elaboração de algoritmos, quando
utilizados para o ensino de programação de computadores, facilitam muito a compreensão de quem
está aprendendo, permitindo compreender seus conceitos, dos mais simples aos mais complexos,
desprendido de uma linguagem de programação especí ca, já que esta possui sintaxe e semântica
própria, o que pode di cultar a absorção de outras tecnologias e aumentar, ainda mais, a curva de
aprendizado de outras linguagens no futuro.

O conjunto de instruções apresentado a seguir é exatamente o mesmo que adotamos para o


primeiro livro. Entretanto, há o acréscimo de algumas novas instruções que possibilitarão a
implementação de algoritmos utilizando o paradigma da programação estruturada. Essas novas
instruções terão seus conceitos devidamente explicados nos capítulos a seguir.

CONJUNTO DE INSTRUÇÕES PARA PSEUDOCÓDIGO

Instrução Descrição

PROGRAMA “” Será a primeira instrução do algoritmo. Identi ca, entre


aspas, o nome do algoritmo. Seu uso é obrigatório.
Exemplo: PROGRAMA “Calculadora IMC”

VARIÁVEIS Delimita um espaço para a declaração de variáveis a serem


utilizadas durante toda execução do algoritmo. Seu uso
somente é obrigatório caso haja variáveis a serem declaradas.

CONSTANTES Delimita um espaço para a declaração de constantes a serem


utilizadas durante toda execução do algoritmo. Seu uso
somente é obrigatório caso haja constantes a serem
declaradas.

INÍCIO ALGORITMO Delimita o início da escrita do algoritmo.

10
Programação Estruturada Introdução à Programação Estruturada

CONJUNTO DE INSTRUÇÕES PARA PSEUDOCÓDIGO

Instrução Descrição

FIM ALGORITMO Delimita o m da escrita do algoritmo.

LEIA() Instrução responsável pela obtenção de valores do usuário e


atribuição em variáveis.

ESCREVA Instrução responsável pela apresentação de valores ao


usuário.

SE … ENTÃO Delimita o início de um bloco de desvio condicional


baseado em teste lógico. Exemplo: SE (VALOR / 3) > 0
ENTÃO.

FIM SE Delimita o m de um bloco SE … ENTÃO

FAÇA … ENQUANTO … Delimita o um bloco de laço de repetição baseado em teste


lógico no nal. Exemplo: FAÇA … ENQUANTO i < 10.

ENQUANTO … FAÇA Delimita o início de um bloco de laço de repetição baseado


em teste lógico no início. Exemplo: ENQUANTO i < 10
FAÇA

FIM ENQUANTO Delimita o m de um bloco ENQUANTO … FAÇA

PARA … DE … ATÉ … FAÇA Delimita o início de um bloco de laço de repetição baseado


em variável de controle. Exemplo: PARA i DE 1 ATÉ 100
FAÇA

FIM PARA Delimita o m de um bloco PARA … DE … ATÉ … FAÇA

BOOLEANO Tipo de dados. O conjunto de valores possíveis é


determinado por {verdadeiro, falso}

CARACTERE Tipo de dados. O conjunto de valores possíveis é


determinado pela tabela ASCII. Precisa ser informado entre
apóstrofos. Exemplo: ‘A’.

INTEIRO Tipo de dados. O conjunto de valores possíveis é


determinado por {Z}. Exemplo: 1554

REAL Tipo de dados. O conjunto de valores possíveis é


determinado por {Q}. Exemplo: 150,25.

11
Programação Estruturada Introdução à Programação Estruturada

CONJUNTO DE INSTRUÇÕES PARA PSEUDOCÓDIGO

Instrução Descrição

TAMANHO() Função que retorna a quantidade de caracteres de um texto

SUBTEXTO() Retorna uma particula de um texto, de acordo com a


posição inicial e a quantidade de caracteres a ser obtido.
Exemplo: SUBTEXTO(“palavra”, 1, 5). O resultado será
“palav”.

CARAC2INT() Função que converte um símbolo grá co em seu respectivo


valor computacional. Funciona somente com os caracteres
de ‘0’ a ‘9’

INT2CARAC() Função que converte um número em seu respectivo


símbolo grá co. Funciona somente com valores entre 0 e 9.

INT2TEXTO() Função que converte valores do tipo INTEIRO em


TEXTO, sem limite de valores.

TEXTO2INT() Função que converte valores do tipo TEXTO em


INTEIRO, removendo a formatação regional e colocando o
valor em formato ANSI. A parte racional será descartada.

REAL2TEXTO() Função que converte valores do tipo REAL em TEXTO,


aplicando a formatação de região. Exemplo: o valor em real
2.59000000 cará 2,59 após a função.

TEXTO2REAL() Função que converte valores do tipo TEXTO em REAL,


removendo a formatação regional e colocando o valor em
formato ANSI. Exemplo: o valor em texto 3,25 cará
3.25000000 após a função.

ALEATÓRIO() Retorna um número aleatório qualquer, do tipo REAL,


entre 0 e 1.

PROCEDIMENTO Identi ca um bloco de subrotina do tipo procedimento.


Exemplo: PROCEDIMENTO ListarMenu()

INÍCIO PROCEDIMENTO Delimita o início da de nição de uma sub-rotina do tipo


procedimento.

FIM PROCEDIMENTO Delimita o m da de nição de uma sub-rotina do tipo


procedimento.

12
Programação Estruturada Introdução à Programação Estruturada

CONJUNTO DE INSTRUÇÕES PARA PSEUDOCÓDIGO

Instrução Descrição

FUNÇÃO Identi ca um bloco de subrotina do tipo função.


Exemplo: FUNÇÃO CalcularFibonacci() : INTEIRO

INÍCIO FUNÇÃO Delimita o início da de nição de uma sub-rotina do tipo


função.

FIM FUNÇÃO Delimita o m da de nição de uma sub-rotina do tipo


função.

RETORNAR Identi ca um ponto de retorno de valor de uma sub-rotina


do tipo função. Após retornar, a função é interrompida e
desempilhada.

REFERÊNCIA Indica que um parâmetro de subrotina será passado por


referência.

VETOR DE Declara um vetor; uma estrutura serializada homogênea,


que permite acessar seus valores através de suas posições.
Exemplo: cpf: VETOR[11] DE INTEIRO

REGISTRO Delimita o início da declaração de um tipo de dado de


registro.

FIM REGISTRO Delimita o m de uma declaração de um tipo de dado de


registro.

Fluxogramas
Em relação aos uxogramas, também faremos uso dos que foram de nidos no primeiro livro,
porém acrescentamos somente mais um elemento geométrico, responsável por representar o
Módulo de Subrotina. Utilizaremos esse elemento em uxogramas que representam algoritmos
estruturados, que implementam chamadas a subrotinas em sua estrutura, através de procedimentos
e funções.

13
Programação Estruturada Introdução à Programação Estruturada

ELEMENTOS DE FLUXOGRAMA

Símbolo Descrição

Seta de uxo de dados. Indica o uxo de execução do programa.

Terminal. Identi ca o início e o m de um algoritmo.

Entrada e Saída de Dados. Identi ca o procedimento que está


obtendo ou retornando dados de processamento. Pode ser a entrada
manual de um valor realizada por um usuário externo.

Processamento. Identi ca uma instrução ou processamento. Pode


ser um cálculo; a geração de um texto automático; o envio de uma
instrução a um aparelho externo;

Decisão. Identi ca um ponto de decisão, em que fará um desvio no


uxo do programa mediante ao resultado lógico de uma pergunta. O
resultado pode ser S (Sim) ou N (Não).

Conector. Não tem associação com nenhuma estrutura de


programação. Apenas identi ca o entroncamento entre duas ou mais
setas de uxo com o mesmo sentido. Dessa forma, todas as setas de
uxo serão direcionadas ao conector, porém apenas uma sairá.

Exibição. Indica um valor ou um texto de saída, para exibição ao


usuário.

Preparação. Essa gura geométrica é dedicada a um único tipo de


estrutura de programação, o laço PARA. Tal gura delimita um bloco
de código que será repetido por um número especí co de vezes.

Módulo de Subrotina. Determina a chamada de uma sub-rotina no


uxograma, podendo ser um PROCEDIMENTO ou uma
FUNÇÃO.

14
Programação Estruturada Introdução à Programação Estruturada

Tipos complexos
O livro anterior trouxe muitos conceitos sobre os tipos primitivos de dados, que foram utilizados
durante praticamente todo o livro para tipar1 as variáveis e constantes dos algoritmos utilizados
como exemplos. E certamente você deve se recordar dos tipos primitivos, sendo eles: BOOLEANO,
INTEIRO, REAL, CARACTERE e TEXTO.

Embora as variáveis e constantes de tipos primitivos consigam armazenar - ou representar - quase


todos os valores presentes em nossa realidade, como respostas lógicas, números e textos, tais
estruturas são limitadas, porque armazenam valores atômicos e sem agrupamentos. Imagine
implementar um algoritmo cuja função é realizar o cadastro de dez alunos, solicitando nome, idade,
renda familiar e se é bolsista. Se utilizarmos variáveis de tipos primitivos serão quatro para cada
aluno, e, ao total, 40 variáveis serão necessárias para armazenar os dados de todos os alunos. En m, a
utilização neste caso não é nada prática.

Por esse motivo é muito comum utilizarmos tipos complexos para tipar as variáveis, pois quando há
grandes massas de dados para serem carregadas ou processadas por algoritmos, tais estruturas
podem ser declaradas com poucas instruções e de forma serializada. Logo isso pode ser feito
utilizando vetores, matrizes e registros.

Os vetores e as matrizes tem, praticamente, o mesmo tipo de estrutura, ou seja, são referências para
segmentações de espaços de memória - variáveis - serializadas, que possuem sempre o mesmo tipo de
dados, em que é possível acessar e atribuir seus valores através de um índice indicando a posição. Já
os registros são agrupamentos de espaços de memória de tipos diferentes, e possuem esse nome
porque é possível associar sua estrutura a registros de um formulário, como uma cha de cadastro
com vários campos. Falaremos mais sobre estruturas homogêneas e heterogêneas nos capítulos II e
III.

1
Estabelecer um tipo de dados.

15
Programação Estruturada Introdução à Programação Estruturada

código terminal
1 PROGRAMA “01.01 - Cadastro de Aluno” [1º Aluno]
2 TIPOS Nome:
3 REGISTRO ALUNO GILMAR OLIVEIRA DUTRA
4 NOME: TEXTO Idade:
5 IDADE: INTEIRO 19
6 RENDA: REAL Renda Familiar:
7 BOLSISTA: CHAR 8500.00
8 FIM REGISTRO É Bolsista?: [S/N]
9 VARIÁVEIS N
10 i : INTEIRO
11 alunos: VETOR[10] DE REGISTRO DE [2º Aluno]
12 ALUNO Nome:
13 INÍCIO ALGORITMO MARIA CLARA OLIVEIRA
14 PARA i DE 1 ATÉ 10 FAÇA Idade:
15 ESCREVA(“[”, i, “º aluno]”) 27
16 ESCREVA(“Nome:”) Renda Familiar:
17 LEIA(alunos[i]→NOME) 3800.00
18 ESCREVA(“Idade:”) É Bolsista?: [S/N]
19 LEIA(alunos[i]→IDADE) S
20 ESCREVA(“Renda Familiar:”)
21 LEIA(alunos[i]→RENDA) [3º Aluno]
22 ESCREVA(“É Bolsista?: [S/N]”) Nome:
23 LEIA(alunos[i]→BOLSISTA) ALEXANDRE GOMES DA SILVA
24 ESCREVA(“”) Idade:
25 FIM PARA 37
26 FIM ALGORITMO

Programação modular
Após relembrarmos o conjunto de instruções de nosso pseudocódigo, e também os elementos
geométricos usados em uxogramas para representar nossos algoritmos, podemos, de fato, discutir
os fundamentos da programação estruturada. Mas para falarmos sobre programação estruturada,
não podemos deixar de citar o fundamento mais importante deste paradigma de prorrogação, a
programação modular.

O conceito da programação modular permite ao desenvolvedor dividir o algoritmo em seções,


melhorando a organização do programa, dividindo o problema em partes menores. Isso também
garante um melhor reaproveitamento do código, pois garante que blocos de instruções, que
precisam ser repetidos, possam ser de nidos dentro de uma seção, e serem referenciados mais de
uma vez.

Para que essa divisão do algoritmo em seções possa acontecer, é necessário utilizar instruções de
de nição de subrotinas, conhecidas como funções e procedimentos. Os procedimentos são
subrotinas que, durante sua execução, não retornam nenhum tipo de valor em suas chamadas,
diferentemente das funções, que retornam valores em suas chamadas, podendo ser atribuídos em
variáveis e processados por outros pontos do código.

16
Programação Estruturada Introdução à Programação Estruturada
Tanto os procedimentos quanto às funções podem receber argumentos, valores em suas chamadas,
desde que implementem parâmetros em suas de nições. Os parâmetros permitem a troca de
informações entre os escopos do programa, já que os dados dispostos em variáveis no programa
principal não são visíveis para as subrotinas, e vice-versa. Os procedimentos e as funções serão
abordadas no capítulo IV.

código terminal
1 PROGRAMA “01.02 - Tabuada” Informe um número:
2 PROCEDIMENTO ExibirTabuada(n: INTEIRO) 8
3 VARIÁVEIS
4 i, p: INTEIRO [Tabuada do 8]
5 INÍCIO PROCEDIMENTO 8 X 0 = 0
6 ESCREVA(“”) 8 X 1 = 8
7 ESCREVA(“[Tabuada do ”, n, “]”) 8 X 2 = 16
8 PARA i DE 0 ATÉ 10 FAÇA 8 X 3 = 24
9 produto ← n * i 8 X 4 = 32
10 ESCREVA(n, “ X ”, i, “ = ”, p) 8 X 5 = 40
11 FIM PARA 8 X 6 = 48
12 FIM PROCEDIMENTO 8 X 7 = 56
13 8 X 8 = 64
14 FUNÇÃO LerValor(): INTEIRO 8 X 9 = 72
15 VARIÁVEIS 8 X 10 = 80
16 valor: INTEIRO
17 INÍCIO FUNÇÃO
18 ESCREVA(“Informe um número:”)
19 LEIA(valor)
20 RETORNAR valor
21 FIM FUNÇÃO
22
23 VARIÁVEIS
24 valor : INTEIRO
25 INÍCIO ALGORITMO
26 valor ← LerValor()
27 ExibirTabuada(valor)
28 FIM ALGORITMO

17
Programação Estruturada Introdução à Programação Estruturada

Figura 1.1 - Fluxograma de um algoritmo com subrotina

Por m, a utilização de procedimentos e funções possibilita a implementação da recursividade,


sendo a possibilidade de um algoritmo chamar uma subrotina consecutivamente, cuja estratégia de
resolução do problema é fragmentá-lo em partes menores, enquanto não há solução trivial,
conhecido como caso recursivo, pois a única solução é empilhar uma nova chamada da mesma
função. O objetivo nal é encontrar o caso base, que é a solução trivial do problema, capaz de
desempilhar as chamadas da função recursiva. Falaremos sobre recursividade no capítulo V.

18
Programação Estruturada Introdução à Programação Estruturada

código terminal
1 PROGRAMA “01.03 - Fatorial” Informe um número:
2 FUNÇÃO CalculaFatorial(n: INTEIRO): 5
INTEIRO
3 INÍCIO FUNÇÃO 5! = 120
4 SE (n <= 1) ENTÃO
5 RETORNAR 1
6 SENÃO
7 RETORNAR n * Fatorial(n - 1)
8 FIM SE
9 FIM FUNÇÃO
10 VARIÁVEIS
11 valor : INTEIRO
12 fatorial : INTEIRO
13 INÍCIO ALGORITMO
14 ESCREVA(“Informe um número: ”)
15 LEIA(valor)
16 fatorial ← CalculaFatorial(valor)
17 ESCREVA(“”)
18 ESCREVA(valor, “! = ”, fatorial)
19 FIM ALGORITMO

Figura 1.2 - Fluxograma de um algoritmo recursivo.

Conclusão
Este capítulo possibilitou a você relembrar os conceitos vistos no primeiro livro sobre Algoritmos e
Lógica de Programação. Utilizaremos o mesmo conjunto de instruções de pseudocódigo e
elementos de uxograma para representar os algoritmos deste livro, porém acrescidos de mais
alguns elementos que conheceremos a partir do próximo capítulo.

19
Programação Estruturada Introdução à Programação Estruturada
O capítulo também apresentou, de forma introdutória, os conceitos do paradigma da programação
estruturada, em que utilizaremos os tipos de dados complexos de dados e também programação
modular, com as subrotinas do tipo procedimento e função.

Aprenderemos, com profundidade, todos os conceitos da programação estruturada apresentada


neste capítulo, e logo iniciaremos pelos tipos complexos, sendo o assunto do capítulo a seguir.

20
Programação Estruturada Estruturas homogêneas: Vetores e Matrizes

Capítulo Estruturas homogêneas:


II Vetores e Matrizes

Introdução
Após uma breve introdução aos conceitos da Programação Estruturada, apresentada no capítulo
anterior, veremos com mais detalhes cada um dos conceitos desse importante paradigma de
programação. Inicialmente veremos os conceitos relacionados às estruturas de dados, começando
pelas estruturas homogêneas, em que conheceremos os vetores e as matrizes, e, no próximo
capítulo, conheceremos as estruturas heterogêneas.

As estruturas homogêneas são comumente utilizadas para manipular massas de dados, permitindo
ao programador alocar sequências de espaços na memória, de um mesmo tipo, sem muito esforço.
Dessa forma, é possível implementar programas capazes de processar um grande volume de
informações com poucas instruções, já que as estruturas homogêneas permitem armazenar e
recuperar os dados com facilidade, apenas utilizando índices e estruturas de repetição.

Neste capítulo, você aprenderá a utilizar os tipos de dados primitivos combinados às estruturas
homogêneas para implementar algoritmos e cientes, capazes de armazenar informações através de
arranjos na memória, associados a uma única variável declarada. E será através de índices, valores
que representam posições em uma estrutura homogênea, que poderá manipular as informações de
vetores e matrizes, atribuindo e recuperando dados de suas estruturas.

Espero que este capítulo facilite sua compreensão sobre as estruturas de dados, e que traga um bom
início em sua jornada de aprendizados sobre o paradigma da Programação Estruturada.

Desejo-lhe boa sorte e bons estudos!

De nição
As estruturas homogêneas são alocações estáticas de espaços de dados serializadas na memória do
computador, isto é, segmentos de dados pré-estabelecidos, em que suas posições estão indexadas, e

21
Programação Estruturada Estruturas homogêneas: Vetores e Matrizes
são associadas por uma única referência de variável no programa. Cada uma das posições indexadas
armazena sempre o mesmo tipo de dados, de nido de acordo com a declaração da variável associada
à estrutura homogênea.

Durante a inicialização do programa, caso haja alguma declaração de uma variável de um tipo
homogêneo, uma estrutura será imediatamente declarada na memória volátil do computador,
sendo alocados todos seus espaços de forma estática. Cada um dos espaços alocados, também
conhecidos como células, são endereçados sequencialmente, porém, tais endereços de memória são
abstraídos do programador, sendo que este precisa apenas informar o valor do índice para
identi car cada célula da estrutura, e não seu endereço físico. O computador encarregar-se-á de
calcular e acessar a posição física de cada célula, de acordo com o índice solicitado.

Apesar de todas as posições da estrutura serem de um único tipo - por isso o nome homogêneo -,
não signi ca dizer que esse tipo precisa ser, obrigatoriamente, um tipo primitivo, podendo ser,
também, um tipo heterogêneo, que comporta elementos - propriedades - de diferentes tipos. No
entanto, de nido o tipo da estrutura - primitivo ou heterogêneo -, todos os elementos da estrutura
serão idênticos, tendo exatamente o mesmo tipo de dados de nido na declaração da variável de
controle para todas as células da estrutura. Falaremos mais sobre dados heterogêneos no próximo
capítulo.

Toda estrutura homogênea é, tecnicamente, um vetor, já que a alocação de espaços na memória


acontece unidirecionalmente, partindo do primeiro endereço de memória disponível até ser alocado
o espaço necessário para todas as células da estrutura. Todavia o programador dispõe de um recurso
extremamente importante na utilização de vetores, sendo este a possibilidade de declarar tais
estruturas com múltiplas dimensões. Por esse motivo, os vetores são conceitualmente classi cados
como vetores (unidimensionais), matrizes (bidimensionais) e demais estruturas multidimensionais.

Vetores
Vetores são estruturas lineares, de uma única dimensão, em que seus espaços são endereçados por
um único índice. O número de células na estrutura de um vetor é xo, de nido em sua declaração
pelo programador, sem possibilidade de realocação após a sua criação na memória2.

2
Realocação de memória e a possibilidade de reconstrução de uma estrutura homogênea em tempo de execução de uma
aplicação.

22
Programação Estruturada Estruturas homogêneas: Vetores e Matrizes

Figura 2.1 - Estrutura de um vetor na memória do computador.

Os vetores têm inúmeras aplicações, sendo muito utilizados para armazenar caracteres em
sequência, por exemplo. O tipo de dados TEXTO pode ser considerado - pelo menos para ns
didáticos - como um vetor de caracteres. O problema é que o tipo string - tipo de dado para
armazenar texto em linguagens de alto nível -, análogo ao tipo TEXTO de nosso pseudocódigo, é
implementado por uma estrutura dinâmica3, que realoca mais ou menos espaços na memória de
acordo com a quantidade de caracteres atribuídos à variável de seu tipo. Entretanto, algumas
linguagens de programação de nível mais baixo não possuem de nição do tipo string, e os
programadores geralmente tratam textos por vetores de caracteres com quantidades xas de células.

3
Toda variável do tipo texto (string), é nalizada com o caractere nulo, representado pelo índice 0 da tabela ASCII. Nas
linguagens de programação C e C++, o caractere pode ser expresso por ‘\0’.

23
Programação Estruturada Estruturas homogêneas: Vetores e Matrizes

Figura 2.2 - Estrutura de uma variável do tipo TEXTO.

Além de tratamento de textos, os vetores conseguem ser muito úteis para armazenar e trabalhar com
massas de dados, independentemente do tipo que se quer armazenar, desde que todas as células
sejam sempre do mesmo tipo, conforme a limitação das estruturas homogêneas. Para isso, basta
declarar um vetor com o número de células necessárias, e utilizar alguma estrutura de repetição para
percorrer o vetor com base em seu índice, e atribuir os dados às células da estrutura dinamicamente.

Figura 2.3 - Massas de dados estruturadas em vetores.

Em nosso pseudocódigo, reservamos as palavras “VETOR DE” para de nir o tipo da variável que
fará referência a esse tipo de estrutura, com sintaxe semelhante à de nição de variáveis de tipos
primitivos. Sendo assim, caso precise declarar um vetor em algum algoritmo, basta especi car a
quantidade de células que terá o vetor, além do tipo de dados na declaração da variável, do seguinte
modo: "VETOR[quantidade_de_células] DE tipo_de_dados". Observe o exemplo a seguir:

24
Programação Estruturada Estruturas homogêneas: Vetores e Matrizes

código terminal
1 PROGRAMA “02.01 - Uso de VETORES” ALGORITMOS
2 VARIÁVEIS LÓGICA
3 i : INTEIRO COMPUTAÇÃO
4 palavras : VETOR[5] DE TEXTO ANÁLISE
5 INÍCIO ALGORITMO ESTRUTURADA
6 palavras[1] ← “ALGORITMOS”
7 palavras[2] ← “LÓGICA”
8 palavras[3] ← “COMPUTAÇÃO”
9 palavras[4] ← “ANÁLISE”
10 palavras[5] ← “ESTRUTURADA”
11
12 ESCREVA(palavras[1])
13 ESCREVA(palavras[2])
14 ESCREVA(palavras[3])
15 ESCREVA(palavras[4])
16 ESCREVA(palavras[5])
17 FIM ALGORITMO

A maior vantagem de se trabalhar com vetores é poder manipular massas de dados com praticidade
e velocidade, utilizando estruturas de controle de repetição. E apesar de podermos utilizar qualquer
laço de repetição para varrer - percorrer - um vetor, uma das estruturas de repetição traz algo
apropriado para essa operação: uma variável de controle. Certamente você já deve estar imaginando
o laço de repetição ao qual me re ro: o laço PARA.

código terminal
1 PROGRAMA “02.02 - VETORES E LAÇOS” INFORME 5 NÚMEROS:
2 VARIÁVEIS
3 i : INTEIRO 1º número:
4 numeros : VETOR[5] DE INTEIRO 10
5 INÍCIO ALGORITMO
6 ESCREVA(“INFORME 5 NÚMEROS:”) 2º número:
7 22
8 PARA i DE 1 ATÉ 5 FAÇA
9 ESCREVA(“”) 3º número:
10 ESCREVA(i, “º número:”) 45
11 LEIA(numeros[i])
12 numeros[i] ← numeros[i] * 10 4º número:
13 FIM PARA 2
14
15 ESCREVA(“”) 5º número:
16 ESCREVA(“MULTIPLICAÇÃO POR 10:”) 3
17
18 PARA i DE 1 ATÉ 5 FAÇA MULTIPLICAÇÃO POR 10:
19 ESCREVA(numeros[i]) 100
20 FIM PARA 220
21 FIM ALGORITMO 450
20
30

25
Programação Estruturada Estruturas homogêneas: Vetores e Matrizes

Matrizes
Assim como os vetores, as matrizes também são arranjos lineares, alocando seus espaços de dados na
memória de maneira estática e sequencial. A diferença entre essas estruturas está na indexação, pois,
no caso das matrizes, há dois índices posicionais que identi cam cada célula da estrutura ao invés de
um, como nos vetores, permitindo ao programador interpretar tais arranjos como estruturas
matriciais, já que cada índice representa o posicionamento em uma dimensão, e a intersecção das
posições identi ca cada célula do arranjo.

Figura 2.4 - Estrutura de uma matriz (4x5)

Embora a abstração sobre as matrizes permite-nos compreendê-la como arranjos


multidimensionais, sua alocação de espaços acontece exatamente da mesma forma que uma
estrutura unidimensional, ou seja, a disposição de seus espaços na memória será unidirecional, da
mesma forma que os vetores. Aliás, qualquer estrutura homogênea, independentemente da
quantidade de dimensões que possui, sua alocação acontecerá de maneira unidirecional na
memória.

26
Programação Estruturada Estruturas homogêneas: Vetores e Matrizes

Figura 2.5 - Estrutura de uma matriz na memória do computador.

A utilização de matrizes possui uma série de vantagens e utilidades. A mais comum de ser citada é a
capacidade de organização das informações proporcionada pela disposição de linhas e colunas.
Além de estabelecer uma relação geométrica e posicional entre suas células, as matrizes fornecem
uma visão de tabela, semelhante ao que conhecemos nos editores de planilha, como o Microsoft
Excel, OpenO ce Calc, etc., algo que facilita, e muito, a organização de dados de um formulário,
utilizando linhas como registros e as colunas como campos.

27
Programação Estruturada Estruturas homogêneas: Vetores e Matrizes

Figura 2.6 - Exemplo de formulário representado através de uma matriz

A declaração de matrizes em nosso pseudocódigo será muito semelhante - senão idêntica - à


declaração de vetores, já que utilizaremos também as palavras reservadas “VETOR DE” para
declarar suas variáveis. A diferença está por conta de como faremos a declaração da quantidade de
células do arranjo, pois será o produto da quantidade de elementos da primeira dimensão (linhas)
pela quantidade de elementos da segunda dimensão (colunas), expresso da seguinte forma: VETOR
[quantidade_de_linhas][quantidade_de_colunas] DE tipo_de_dados. Observe o exemplo a seguir.

28
Programação Estruturada Estruturas homogêneas: Vetores e Matrizes

código terminal
1 PROGRAMA “02.03 - Uso de MATRIZES” MATRIZ 3x2:
2 VARIÁVEIS 10|18
3 matr: VETOR[3][2] DE INTEIRO 60|90
4 INÍCIO ALGORITMO 40|12
5 matr[1][1] ← 10
6 matr[1][2] ← 18
7 matr[2][1] ← 60
8 matr[2][2] ← 90
9 matr[3][1] ← 40
10 matr[3][2] ← 12
11
12 ESCREVA(“MATRIZ 3X2:”)
13 ESCREVA(matr[1][1], “|”, matr[1][2])
14 ESCREVA(matr[2][1], “|”, matr[2][2])
15 ESCREVA(matr[3][1], “|”, matr[3][2])
16 FIM ALGORITMO

Outra semelhança com os vetores é a possibilidade de se utilizar laço de repetição para manipular
massas de dados em matrizes. Entretanto, como há, agora, duas dimensões para controle posicional,
deve haver o mesmo número de variáveis de controle, sendo uma para controle das linhas e outra
para controle das colunas. É facilmente dedutível que haja uma variável de controle para cada
dimensão espacial da estrutura.

código terminal
1 PROGRAMA “02.03 - MATRIZES E LAÇOS” MATRIZ DE VEÍCULOS:
2 VARIÁVEIS
3 linha: INTEIRO 1,1:
4 veiculos: VETOR[2][2] DE TEXTO VW GOL
5 INÍCIO ALGORITMO 1,2:
6 ESCREVA(“MATRIZ DE VEÍCULOS:”) GM CORSA
7 2,1:
8 PARA linha DE 1 ATÉ 2 FAÇA FIAT PALIO
9 PARA coluna DE 1 ATÉ 2 FAÇA 2,2:
10 ESCREVA(linha,”,”, coluna, FORD KÁ
11 “:”)
12 LEIA(veiculos[linha][coluna]) LISTAGEM:
13 FIM PARA VW GOL
14 FIM PARA GM CORSA
15 FIAT PALIO
16 ESCREVA(””) FORD KÁ
17 ESCREVA(“LISTAGEM:”)
18
19 PARA linha DE 1 ATÉ 2 FAÇA
20 PARA coluna DE 1 ATÉ 2 FAÇA
21 LEIA(veiculos[linha][coluna])
22 FIM PARA
23 FIM PARA
FIM ALGORITMO

29
Programação Estruturada Estruturas homogêneas: Vetores e Matrizes

Estruturas multidimensionais
Existem casos em que é necessário trabalharmos com dados dispostos em estruturas
multidimensionais. Ainda que as matrizes também sejam consideradas estruturas
multidimensionais, possui destaque para as disciplinas de programação pela frequência que são
utilizadas para resolver problemas, sendo classi cadas, conceitualmente, como uma estrutura
própria, assim como acontece com os vetores. Todavia, quando a estrutura possui mais de duas
dimensões, não existe uma nomenclatura especí ca na computação, sendo frequentemente
referenciadas como estruturas multidimensionais.

Figura 2.7 - Representação de uma estrutura tridimensional (4x4x3)

De fato é de se estranhar estruturas com mais de duas dimensões na programação, e geralmente nos
perguntamos o porquê de se utilizar essas estruturas e para quê elas servem. Porém digo que são
comumente utilizadas em várias funções na computação, não somente na programação de sistemas,
mas também na análise de dados, desenvolvimento grá co e até mesmo posicionamento
geoespacial. Essas estruturas são muito utilizadas para armazenar dados de relatórios, dispostos em
espaços tridimensionais, conhecidos como cubos OLAP4. Outras possibilidades de uso são:
desenvolvimento de elementos grá cos 3D, detalhamento de plantas de engenharia civil, etc.

4
On-line Analytical Processing é uma forma de analisar massas de dados através de múltiplas perspectivas, geralmente
através de uma estrutura geométrica de múltiplas dimensões, como um cubo (tridimensional).

30
Programação Estruturada Estruturas homogêneas: Vetores e Matrizes

Figura 2.8 - Exemplo de uso de um cubo OLAP (estrutura tridimensional)

A declaração de estruturas de mais de duas dimensões, dentro do pseudocódigo, é muito


semelhante - senão idêntica, também - à declaração de vetores e matrizes. Você também utilizará as
palavras reservadas VETOR DE para declarar a estrutura, porém, ao informar os valores das
dimensões, você deverá informar, entre colchetes, a quantidade de elementos de todas as dimensões
necessárias. Por exemplo, se desejar declarar uma estrutura tridimensional, como um cubo, deverá
especi car três quantidades de elementos entre colchetes; caso opte por declarar uma estrutura com
quatro dimensões, serão quatro quantidades de elementos entre colchetes, e assim por diante.

código
1 PROGRAMA “02.05 - ESTRUTURAS MULTIDIMENSIONAIS”
2 VARIÁVEIS
3 cubo_dados: VETOR[2][2][2] DE TEXTO
4 INÍCIO ALGORITMO
5 ESCREVA(“MATRIZ DE VEÍCULOS:”)
6
7 cubo_dados[1][1][1] ← 100
8 cubo_dados[1][1][2] ← 500
9 cubo_dados[1][2][1] ← 700
10 cubo_dados[1][2][2] ← 1100
11 cubo_dados[2][1][1] ← 300
12 cubo_dados[2][1][2] ← 800
13 cubo_dados[2][2][1] ← 900
14 cubo_dados[2][2][2] ← 700
15 FIM ALGORITMO

31
Programação Estruturada Estruturas homogêneas: Vetores e Matrizes
Para percorrer todos os elementos da estrutura, será necessário estruturar um laço de repetição e
declarar uma variável de controle para cada uma das dimensões da estrutura, da mesma forma que
zemos com a matriz. Não tem segredo, se a estrutura possui três dimensões, então serão três laços;
caso possua quatro dimensões, logo serão quatro laços.

código terminal
1 PROGRAMA “02.06 - CUBOS E LAÇOS” ANÁLISE DE VENDAS:
2 VARIÁVEIS [1º PRODUTO]
3 produto, regiao, semestre : INTEIRO REGIÃO 1:
4 cubo_dados: VETOR[2][2][2] DE TEXTO SEM. 1: 100
5 INÍCIO ALGORITMO SEM. 2: 500
6 ESCREVA(“MATRIZ DE VEÍCULOS:”) REGIÃO 2:
7 cubo_dados[1][1][1] ← 100 SEM. 1: 1100
8 cubo_dados[1][1][2] ← 500 SEM. 2: 300
9 cubo_dados[1][2][1] ← 700
10 cubo_dados[1][2][2] ← 1100 [2º PRODUTO]
11 cubo_dados[2][1][1] ← 300 REGIÃO 1:
12 cubo_dados[2][1][2] ← 800 SEM. 1: 300
13 cubo_dados[2][2][1] ← 900 SEM. 2: 800
14 cubo_dados[2][2][2] ← 700 REGIÃO 2:
15 SEM. 1: 900
16 ESCREVA(“ANÁLISE DE VENDAS: ”) SEM. 2: 700
17 PARA produto DE 1 ATÉ 2 FACA
18 ESCREVA(“”)
19 ESCREVA(“[”, produto, “º PRODUTO]”)
20 PARA regiao DE 1 ATÉ 2 FAÇA
21 ESCREVA(“REGIÃO ”, regiao, “:”)
22
23 PARA periodo DE 1 ATÉ 2 FAÇA
24 ESCREVA(“ SEM. ”, periodo,
“: ”,
cubo_dados[produto][regiao][semestre])
25 FIM PARA
26 FIM PARA
27 FIM PARA
28 FIM ALGORITMO

Conclusão
Nesta unidade você conheceu as estruturas homogêneas, grupo em que se encontram os vetores e as
matrizes. Tais estruturas são importantíssimas para o aprendizado das estruturas de dados,
responsáveis por armazenar as informações estruturadas em uma aplicação. Com essas estruturas é
possível trabalhar com massas de dados, sem a necessidade de declarar dezenas, senão milhares de
variáveis no escopo do programa, permitindo que o programador trabalhe com uidez e
simplicidade ao desenvolver suas aplicações.

No próximo capítulo falaremos sobre as estruturas heterogêneas, que permitem ao programador


controlar registros de dados, semelhante ao que vemos em um formulário.

32
Programação Estruturada Estruturas heterogêneas: Registros

Capítulo Estruturas heterogêneas:


III Registros

Introdução
À medida em que avançamos no aprendizado da programação, nossas mentes se abrem com os
conceitos aprendidos, e novas dúvidas surgem a m de entendermos como abstrair problemas de
nossa realidade e como implementamos as soluções destes problemas através da programação de
algoritmos. Certamente você já deve ter se deparado com a necessidade de implementar várias
variáveis associadas a uma mesma informação, certo?

A nal de contas, é possível utilizar vetores para automatizar a gravação e leitura de uma grande
massa de dados, como nomes, endereços, datas de nascimento, salários, descrições, observações e
muitos outros dados, geralmente associados através de formulários. Porém, caso precise armazenar
todos estes dados ao mesmo tempo, quantos vetores e variáveis serão necessários? E quanto às
matrizes? Será o meio de armazenamento mais e ciente para representar formulários de dados
dentro de um algoritmo?

Apesar de estruturas como vetores e matrizes parecerem ser as mais adequadas para representar
formulários, estas possuem uma série de limitações de utilização, sendo as principais a capacidade de
somente armazenar dados de um único tipo,já que são estruturas homogêneas, e a associação das
colunas - índices - aos campos dos formulários, já que o desenvolvedor precisará criar um dicionário
para associar as posições da estrutura aos campos, o que tornaria a programação ainda mais
complicada. É por estes motivos que as principais linguagens de programação disponibilizam
estruturas heterogêneas para estruturar dados de formulários, já que tais estruturas superam as
limitações dos vetores e matrizes.

Aproveite o capítulo para aprender esse importante conceito sobre estruturas de dados. Bons
estudos!

33
Programação Estruturada Estruturas heterogêneas: Registros

Conceito
As estruturas heterogêneas são aquelas que permitem o agrupamento de espaços de memória;
variáveis que se relacionam e compõem parte da informação. Tais variáveis podem ser de tipos
diferentes, e não estão dispostas em um arranjo, como os vetores e as matrizes, mas de maneira que
seus respectivos valores são acessados através de seus próprios nomes de variáveis, precedidos pelo
nome da estrutura que compõem.

Segundo Laureano (2008), uma estrutura de dados pode ser classi cada como heterogênea quanto
envolve a utilização de mais um tipo de dado básico (primitivo), sendo representadas pelos
registros. Tais registros possuem um certo número de campos que se relacionam logicamente entre
si, semelhantemente ao que acontece em um formulário, que possui campos de domínios5
diferentes, fazendo parte de um mesmo contexto.

Figura 3.1 - Exemplo de um formulário de prontuário médico.

Dentro de um programa, o registro se comporta como um tipo de dados, pois, primeiro, precisa ter
sua estrutura declarada, já existirá um espaço reservado para de nição de seu nome e declaração de
suas propriedades; atributos que comporão a estrutura de dados. Posteriormente, o novo tipo de
dados será utilizado para declarar variáveis, que re etirão a estrutura declarada no tipo, criando
todos os espaços de memória referentes às propriedades do registro.
5
Domínio de campo/propriedade diz respeito ao seu tipo de dados e também ao limite, inicial e nal, de informações
que suporta.

34
Programação Estruturada Estruturas heterogêneas: Registros

Figura 3.2 - Representação de um registro na memória do computador.

Para declarar um registro, será necessário antes declararmos seu tipo, de nindo um nome e suas
propriedades. A estrutura deve ser declarada na seção “TIPOS”, de nida logo abaixo da linha de
de nição do título do programa, sendo delimitada pelas palavras reservadas “REGISTRO” e “FIM
REGISTRO”. Entre os delimitadores, serão declaradas as propriedades e seus respectivos tipos de
dados. Não nos esqueçamos também de de nirmos o nome do tipo de registro, que vem logo após
o delimitador inicial “REGISTRO”, na mesma linha, precedido por um espaço:

código
1 PROGRAMA “03.01 - Declaração de um tipo de registro”
2 TIPOS
3 REGISTRO TIPO_PACIENTE
4 CODIGO: INTEIRO
5 NOME: TEXTO
6 DATA_NASC: TEXTO
7 DATA_ENTRADA: TEXTO
8 PRONTUARIO: TEXTO
9 FIM REGISTRO
10 INÍCIO ALGORITMO
11 FIM ALGORITMO

Perceba que, apesar de termos declarado propriedades do registro como se fossem variáveis,
nenhuma delas será de fato criada na memória sem que façamos a declaração de uma variável do
tipo registro, pois o que temos é somente a de nição do tipo, que será utilizado de maneira
semelhante aos tipos primitivos de dados que conhecemos para realizar a declaração dos valores.
Para isso, faremos a declaração de uma variável do tipo do registro de que acabamos de declarar,
seguindo a sintaxe “nome_variável : REGISTRO DE tipo_registro”.

35
Programação Estruturada Estruturas heterogêneas: Registros

código
1 PROGRAMA “03.02 - Declaração de uma variável de registro”
2 TIPOS
3 REGISTRO TIPO_PACIENTE
4 CODIGO: INTEIRO
5 NOME: TEXTO
6 DATA_NASC: TEXTO
7 DATA_ENTRADA: TEXTO
8 PRONTUARIO: TEXTO
9 FIM REGISTRO
10 VARIÁVEIS
11 pac1: REGISTRO DE TIPO_PACIENTE
12 INÍCIO ALGORITMO
13 FIM ALGORITMO

Para que possamos utilizar o registro declarado no escopo do programa, basta referenciar sua
variável, e, em seguida, cada uma de suas propriedades precedidas pelo operador de acesso às
propriedades de registro →. Este operador fornece acesso a cada uma das propriedades do registro,
tanto para leitura quanto para atribuição de valores.

código terminal
1 PROGRAMA “03.03 - Declaração e uso de PRONTUÁRIO ELETRÔNICO
uma variável de registro”
2 TIPOS CÓDIGO: 18172
3 REGISTRO TIPO_PACIENTE NOME: JOSÉ MARIA DA SILVA
4 CODIGO: INTEIRO NASC: 17/08/1964
5 NOME: TEXTO ENT: 22/01/2023
6 DATA_NASC: TEXTO PRONT: TRAUMATISMO CRANIANO
7 DATA_ENTRADA: TEXTO
8 PRONTUARIO: TEXTO
9 FIM REGISTRO
10 VARIÁVEIS
11 pac1: REGISTRO DE TIPO_PACIENTE
12 INÍCIO ALGORITMO
13 pac1→CODIGO ← 18172
14 pac1→NOME ← “JOSÉ MARIA DA SILVA”
15 pac1→DATA_NASC ← “17/08/1964”
16 pac1→DATA_ENTRADA ← “22/01/2023”
17 pac1→PRONTUARIO ← “TRAUMATISMO
CRANIANO”
18
19 ESCREVA(“PRONTUÁRIO ELETRÔNICO”)
20 ESCREVA(“”)
21 ESCREVA(“CÓDIGO: ”, pac1→CODIGO)
22 ESCREVA(“NOME: ”, pac1→NOME)
23 ESCREVA(“NASC: ”, pac1→DATA_NASC)
24 ESCREVA(“ENT: ”, pac1→DATA_ENTRADA)
25 ESCREVA(“PRONT: ”, pac1→PRONTUARIO)
26 FIM ALGORITMO

36
Programação Estruturada Estruturas heterogêneas: Registros
Se desejarmos obter os valores por interação com o terminal, podemos combinar a função LEIA()
com a referência das propriedades do registro, e fazer a leitura do valor do terminal diretamente para
a propriedade em questão. As regras de leitura de dados são exatamente as mesmas da leitura de
variáveis de tipos primitivos.

código terminal
1 PROGRAMA “03.04 - Leitura de dados para PRONTUÁRIO ELETRÔNICO
o registro”
2 TIPOS CÓDIGO:
3 REGISTRO TIPO_PACIENTE 22517
4 CODIGO: INTEIRO NOME COMPLETO:
5 NOME: TEXTO CLEBER RIBEIRO DA SILVA
6 DATA_NASC: TEXTO DATA DE NASCIMENTO:
7 DATA_ENTRADA: TEXTO 27/09/2000
8 PRONTUARIO: TEXTO DATA DE ENTRADA:
9 FIM REGISTRO 12/09/2022
10 VARIÁVEIS PRONTUÁRIO:
11 pac1: REGISTRO DE TIPO_PACIENTE TRAUMA NA FACE; AFUNDAMENTO CRANIANO;
12 INÍCIO ALGORITMO TRAUMA BUCO-MAXILAR.
13 ESCREVA(“PRONTUÁRIO ELETRÔNICO”)
14 ESCREVA(“”)
15
16 ESCREVA(“CÓDIGO:”)
17 LEIA(pac1→CÓDIGO)
18 ESCREVA(“NOME COMPLETO:”)
19 LEIA(pac1→NOME)
20 ESCREVA(“DATA DE NASCIMENTO:”)
21 LEIA(pac1→DATA_NASC)
22 ESCREVA(“DATA DE ENTRADA:”)
23 LEIA(pac1→DATA_ENTRADA)
24 ESCREVA(“PRONTUÁRIO:”)
25 LEIA(pac1→PRONTUÁRIO)
26 FIM ALGORITMO

Registros de tipos primitivos


Tradicionalmente declaramos as propriedades de registros utilizando tipos primitivos, pois se
retomarmos a analogia entre os registros e um formulário de preenchimento de dados, boa parte
dos campos pode ser compreendida por dados primitivos, como números (inteiros e decimais),
campos do tipo SIM/NÃO (lógicos), opções ordenadas (caracteres ou números) ou textos. É claro
que existem situações atípicas, e não utilizamos os registros somente para representar dados de
formulários, mas podemos utilizá-los para representar estruturas de dados computacionais, como
las, pilhas e outras estruturas mais complexas. Você estudará as aplicações de registros para essas
estruturas mais a frente, em uma disciplina denominada “Estrutura de Dados”.

37
Programação Estruturada Estruturas heterogêneas: Registros

Figura 3.3 - Formulário de ordem de serviço (OS)

código
1 PROGRAMA “03.05 - Representação do formulário de Ordem de Serviço em registro”
2 TIPOS
3 REGISTRO TIPO_ORDEM_SERVICO
4 NUMERO_OS: INTEIRO
5 COD_CLIENTE: INTEIRO
6 CLIENTE: TEXTO
7 DATA_EMISSAO: TEXTO
8 DATA_REALIZACAO: TEXTO
9 DISCRIMINACAO_SERVICOS: TEXTO
10 EXECUTADO: BOOLEANO
11 PERIODO_EXECUCAO: CARACTERE
12 VALOR_SERVICOS: REAL
13 VALOR_IMPOSTOS: REAL
14 VALOR_TOTAL: REAL
15 FIM REGISTRO
16 VARIÁVEIS
17 os: REGISTRO DE TIPO_ORDEM_SERVICO
18 INÍCIO ALGORITMO
19 FIM ALGORITMO

Registros de tipos complexos


Em algumas situações, há necessidade de se estruturar propriedades que não estão relacionadas a
campos simples. Não é incomum encontrarmos tabelas, listas, subformulários e outros tipos de
campos dentro de formulários de informações, e para representarmos essas estruturas dentro de um

38
Programação Estruturada Estruturas heterogêneas: Registros
algoritmo, precisamos relacionar os registros a tipos complexos, como vetores, matrizes e até mesmo
outros tipos de registros que representarão as partes componentes do formulário dentro do
programa.

Registros com vetores


Suponhamos que um formulário de uma faculdade exija os dados do aluno e das disciplinas de
dependência que precisa cursar. Certamente o espaço delimitado no formulário para dependências
estará disposto em uma lista, permitindo que o aluno informe mais de uma, o que é bastante
comum de acontecer. Se optássemos por declarar várias propriedades para preenchimento das
disciplinas, a leitura não seria dinâmica, e poderia ser declarada propriedades demais ou a menos. A
opção mais adequada seria declarar um vetor, para que possa abrigar um número máximo de
disciplinas, mas que são preenchidas de acordo com a necessidade do aluno. A leitura dos dados
para a propriedade do tipo VETOR segue exatamente os mesmos passos da leitura das variáveis do
VETOR.

código terminal
1 PROGRAMA “03.06 - Registro com vetor” FORMULÁRIO: DEPENDÊNCIAS
2 TIPOS
3 REGISTRO TIPO_DEPENDENCIAS RA:
4 RA: INTEIRO 121822
5 ALUNO: TEXTO NOME COMPLETO:
6 CURSO: TEXTO RICARDO MARQUES DE ARAUJO
7 DISCIPLINAS: VETOR[10] DE TEXTO CURSO:
8 FIM REGISTRO ENGENHARIA CIVIL
9 VARIÁVEIS
10 index : INTEIRO ADD DISCIPLINA (S/N)?
11 resposta : CARACTERE S
12 dep : REGISTRO DE TIPO_DEPENDENCIAS
13 INÍCIO ALGORITMO 1ª DISCIPLINA:
14 ESCREVA(“FORMULÁRIO: DEPENDÊNCIAS”) CÁLCULO I
15 ESCREVA(“”)
16 ESCREVA(“RA:”) ADD DISCIPLINA (S/N)?
17 LEIA(dep→RA) S
18 ESCREVA(“NOME COMPLETO:”)
19 LEIA(dep→NOME) 2ª DISCIPLINA:
20 ESCREVA(“CURSO:”) INTRODUÇÃO À ENGENHARIA
21 LEIA(dep→CURSO)
22 PARA index DE 1 ATÉ 10 FAÇA ADD DISCIPLINA (S/N)?
23 ESCREVA(“”) S
24 ESCREVA(“ADD DISCIPLINA (S/N)?”)
25 LEIA(resposta) 3ª DISCIPLINA:
26 SE (resposta <> ‘S’) ENTÃO MECÂNICA DOS FLUIDOS
27 FIM PARA
28 FIM SE ADD DISCIPLINA (S/N)?
29 ESCREVA(“”) N
30 ESCREVA(index, “ª DISCIPLINA:”)
31 LEIA(dep→DISCIPLINAS[index])
32 FIM PARA
33 FIM ALGORITMO

39
Programação Estruturada Estruturas heterogêneas: Registros

Registros de registros
Outro caso muito comum de nos depararmos são os formulários dados que possuem
subformulários. Um subformulário pode ser uma sessão especí ca, com campos referentes a um
grupo de informações que não necessariamente está associado diretamente ao tema do formulário
principal. Pode ser os dados dos pais ou responsáveis em um formulário de matrícula acadêmica; o
histórico da graduação em um formulário de matrícula de um curso de pós-graduação; um
questionário sobre dados da renda em um formulário qualquer, etc. Outra situação é o
compartilhamento dos subformulários entre formulários, já que um formulário de matrícula de
graduação pode solicitar os dados dos pais ou responsáveis tanto quanto um formulário de
matrícula de um curso técnico, por exemplo.

Figura 3.4 - Formulário com subformulário.

Em todos os casos, os subformulários serão representados por outros registros dentro do registro
principal, e seus tipos também devem ser declarados na seção TIPOS do pseudocódigo. Os
subformulários serão representados através de propriedades dentro do registro principal, declarados
com seus respectivos tipos de registros previamente declarados na respectiva seção do código.

40
Programação Estruturada Estruturas heterogêneas: Registros

código
1 PROGRAMA “03.07 - Registro de registro”
2 TIPOS
3 REGISTRO TIPO_MATRICULA
4 NOME: TEXTO
5 CPF: TEXTO
6 DATA_NASC: TEXTO
7 DADOS_PAIS: REGISTRO DE TIPO_DADOS_PAIS
8 FIM REGISTRO
9
10 REGISTRO TIPO_DADOS_PAIS
11 MAE_NOME: TEXTO
12 MAE_DATA_NASC: TEXTO
13 PAI_NOME: TEXTO
14 PAI_DATA_NASC: TEXTO
15 FIM REGISTRO
16 VARIÁVEIS
17 matricula: REGISTRO DE TIPO_MATRICULA
18 INÍCIO ALGORITMO
19 matricula→NOME ← “FRANCISCO DUTRA”
20 matricula→CPF ← “486.156.130-28”
21 matricula→DATA_NASC ← “28/03/1997”
22
23 matricula→DADOS_PAIS→MAE_NOME ← “MARIA ROSA DUTRA”
24 matricula→DADOS_PAIS→MAE_DATA_NASC ← “01/01/1975”
25 matricula→DADOS_PAIS→PAI_NOME ← “ROBERTO JORGE DUTRA”
26 matricula→DADOS_PAIS→PAI_DATA_NASC ← “31/01/1969”
27 FIM ALGORITMO

Vetores de registros
Embora utilizamos arquivos para armazenar os formulários preenchidos, podendo ser armários
físicos ou bancos de dados informatizados, em algum momento precisamos recuperar os
formulários preenchidos para processar a massa de dados. Outra situação corriqueira é a
necessidade de se preencher vários formulários em sequência, pois um dos objetivos de se
informatizar o uso de formulários é a otimizar a velocidade de preenchimento. Em ambos casos,
podemos combinar a utilização dos registros com os vetores, permitindo que o programa possa
armazenar, dinamicamente, uma grande quantidade de registros na memória e também
percorrê-los, através de laços de repetição, para automatizar o preenchimento e a leitura dos dados.

A declaração de um vetor de registros é semelhante à declaração de um vetor de um tipo primitivo


de dados, devendo apenas informar, no lugar do tipo primitivo, a estrutura do tipo do registro. Para
isso, basta utilizar a estrutura “nome_variavel : VETOR[qtde_de_elementos] DE REGISTRO DE
tipo_registro”.

41
Programação Estruturada Estruturas heterogêneas: Registros

código terminal
1 PROGRAMA “03.08 - Vetor de registros” CADASTRAMENTO DE VEÍCULOS
TIPOS
2 REGISTRO TIPO_VEICULO [1º VEíCULO]
3 FABRICANTE: TEXTO FABRICANTE:
4 MODELO: TEXTO VOLKSWAGEN
5 ANO_FABRICACAO: INTEIRO MODELO:
6 ANO_MODELO: INTEIRO FUSCA
7 PLACA: TEXTO ANO FABRICAÇÃO:
8 RENAVAM: TEXTO 1964
9 FIM REGISTRO ANO MODELO:
10 VARIÁVEIS 1964
11 index : INTEIRO PLACA:
12 veiculos: VETOR[5] DE REGISTRO DE ABC-1264
TIPO_VEICULO RENAVAM
13 INÍCIO ALGORITMO 11701866735
14 ESCREVA(“CADASTRAMENTO DE VEÍCULOS”)
15 [2º VEíCULO]
16 PARA index DE 1 ATÉ 5 FAÇA FABRICANTE:
17 ESCREVA(“”) FORD
18 ESCREVA(“[“, index, “º VEÍCULO]”) MODELO:
19 ESCREVA(“FABRICANTE:”) MUSTANG SHELBY GT500 (ELEANOR)
20 LEIA(veiculos[index]→FABRICANTE) ANO FABRICAÇÃO:
21 ESCREVA(“MODELO:”) 1967
22 LEIA(veiculos[index]→MODELO) ANO MODELO:
23 ESCREVA(“ANO FABRICAÇÃO:”) 1967
24 LEIA(veiculos[index]→ANO_FABRICACAO) PLACA:
25 ESCREVA(“ANO MODELO:”) SHE-1967
26 LEIA(veiculos[index]→ANO_MODELO) RENAVAM
27 ESCREVA(“PLACA:”) 01730609632
28 LEIA(veiculos[index]→PLACA)
29 ESCREVA(“RENAVAM:”) [3º VEíCULO]
30 LEIA(veiculos[index]→RENAVAM) FABRICANTE:
31 FIM PARA TOYOTA
32 FIM ALGORITMO MODELO:

Conclusão
Neste capítulo você aprendeu a manipular os registros, importantes estruturas de dados que
permitem associar vários tipos de dados em uma mesma referência de variável, permitindo
representar formulários de dados dentro de programas de computador. Você pôde aprender,
também, a combinar tipos diferentes de registros, permitindo representar formulários e
subformulários, associando tudo através de uma única variável e suas propriedades. Por m,
aprendeu a combinar registros e vetores, visando ampliar a capacidade de armazenamento e
dinamizar o preenchimento e a leitura de dados de registros.

A seguir, no capítulo IV, você será apresentado à programação modular, entendendo o conceito das
subrotinas e como estruturar um programa utilizando procedimentos e funções.

42
Programação Estruturada Programação Modular

Capítulo Programação modular:


IV procedimentos e funções

Introdução
En m, chegamos, de fato, ao principal conceito do paradigma da Programação Estruturada, a
Programação Modular. Utilizando os fundamentos da Programação Modular que um
programador tem a capacidade de estruturar um programa, segmentando-o em partes menores,
visando a facilidade na compreensão e resolução do problema proposto ao programa.

É através da Programação Modular que implementamos as subrotinas; agrupamento de instruções


retiradas do programa principal capazes de resolver um problema menor, parte do problema
principal, garantindo a organização do código do programa e reduzindo a quantidade de instruções
do algoritmo principal, além de ampliar a legibilidade do código. Embora citadas algumas
vantagens, ainda resta a mais importante de todas, o reaproveitamento de código, já que uma
subrotina pode ser chamada inúmeras vezes no decorrer do programa.

Você também conhecerá os conceitos relacionados à declaração de parâmetros, pois é através deles
que um programa consegue trocar informações com as subrotinas. São muitas possibilidades de
declaração e combinações, permitindo ao programador uma maior dinamicidade na declaração e
utilização das subrotinas.

Serão muitos conceitos aprendidos neste capítulo. Através deste que as principais ideias da
Programação Estruturada são apresentadas a você.

Bons estudos!

Subrotinas
Subrotinas são delimitações de instruções; agrupamentos ou simplesmente blocos de códigos
separados estruturalmente do programa principal, cuja nalidade é permitir a modularização da
estrutura do programa. As subrotinas permitem ao desenvolvedor não somente organizar o

43
Programação Estruturada Programação Modular
algoritmo em partes menores, o que já é uma grande vantagem para o entendimento e
manutenibilidade do código, mas, também, a capacidade do reaproveitamento do código na
programação, pois uma mesma subrotina pode ser chamada inúmeras vezes durante a execução do
programa principal.

É possível representar as subrotinas através dos uxogramas, utilizando uma gura retangular
conhecida como Submódulo. Tal elemento é posicionado no local da chamada do bloco da
subrotina, e, da mesma forma que acontece com um algoritmo real, quando o ponteiro da execução
- simulação - é posicionado sobre o submódulo imediatamente é direcionado à primeira instrução
do uxograma representado pelo submódulo.

Figura 4.1 - Utilização do submódulo em uxogramas

Dentro de um algoritmo, as subrotinas podem ser estruturadas de algumas formas diferentes, a


depender da necessidade de retorno de valor, quantidade de informações passadas, e como estas
informações são passadas à subrotina. Dessa forma, podemos estruturar as subrotinas através de
procedimentos e funções, estruturas modulares que precisam ser declaradas antes de serem
utilizadas. Conheceremos cada um dos tipos de subrotinas e como declará-los dentro do
pseudocódigo. Além disso, também falaremos sobre passagem de informações às subrotinas.

44
Programação Estruturada Programação Modular

Procedimentos
Procedimentos são subrotinas cuja principal característica é não possuir retorno de valores. Essas
estruturas delimitam um subalgoritmo6 responsável por resolver um pequeno problema do
algoritmo principal, permitindo que a elaboração de um grande algoritmo possa ser feita
quebrando-o em partes menores, a m de reduzir o número de instruções da estrutura principal do
programa.

Tanto os procedimentos quanto as funções, que veremos mais adiante, obrigam a declaração de um
nome, um identi cador da estrutura que contém o subalgoritmo. Esse identi cador será utilizado
para efetuar a chamada da estrutura, acarretando no empilhamento da função na memória do
computador. A pilha de chamada - mais conhecida por sua designação em inglês "call stack" -
executará sempre o procedimento que foi chamado por último, desempilhando a chamada após o
encerramento da subrotina.

Figura 4.2 - Exemplo do empilhamento de chamadas na memória

A declaração de uma subrotina do tipo procedimento é simples, mas deve ser feita após a seção
"TIPOS" - caso haja - e antes da seção de declaração das variáveis do programa principal. A sintaxe
da estrutura também é simples, e o subalgoritmo deverá car contido entre os delimitadores do
procedimento. A declaração deve seguir a seguinte estrutura:
6
Algoritmo responsável por resolver um problema menor, parte do problema principal proposto ao programa.

45
Programação Estruturada Programação Modular
PROCEDIMENTO nome_do_procedimento([parametro1: tipo], [parâmetro2: tipo], …,
[parametroN : tipo])
[VARIÁVEIS]
variavelA : tip …
INÍCIO PROCEDIMENTO
//programação …
FIM PROCEDIMENTO

A seção VARIÁVEIS está entre colchetes, pois é opcional na declaração do PROCEDIMENTO.


Aliás, é importantíssimo compreender que, agora, o algoritmo controlará o escopo7 de variáveis da
estrutura, isto é, as variáveis declaradas na estrutura principal do programa não são visíveis para as
subrotinas, tampouco as variáveis declaradas nas subrotinas serão visíveis na estrutura principal do
programa. Apesar de algumas linguagens de programação permitirem o escopo compartilhado, por
uma questão didática, não utilizaremos este conceito em nosso pseudocódigo.

Após a declaração do procedimento, resta fazer a chamada no programa principal. Para isso, basta
informar o nome e também a lista de argumentos, entre parênteses, com as informações a serem
passadas para o procedimento. Caso o procedimento não implemente nenhum parâmetro em sua
estrutura, apenas informe os parênteses após o nome, representando uma lista vazia de argumentos.

código terminal
1 PROGRAMA “4.1 - Uso de Procedimento” -----------------------
2 PROCEDIMENTO ExibirMenu() PROGRAMA SMARTSELLER
3 INÍCIO PROCEDIMENTO -----------------------
4 ESCREVA(“Selecione uma opção:”) Selecione uma opção:
5 ESCREVA(“1-Cadastro de Clientes”) 1-Cadastro de Clientes
6 ESCREVA(“2-Cadastro de Produtos”) 2-Cadastro de Produtos
7 ESCREVA(“3-Lançamento de Vendas”) 3-Lançamento de Vendas
8 ESCREVA(“9-Sair”) 9 -Sair
9 ESCREVA(“”)
10 FIM PROCEDIMENTO 3
11
12 VARIÁVEIS
13 opcao : INTEIRO
14 INÍCIO ALGORITMO
15 ESCREVA(“----------------------”)
16 ESCREVA(“ PROGRAMA SMARTSELLER ”)
17 ESCREVA(“----------------------”)
18 ExibirMenu()
19 LEIA(opcao)
20 FIM ALGORITMO

7
Separações virtuais entre recursos utilizados por diferentes partes de um mesmo programa.

46
Programação Estruturada Programação Modular
Outro componente opcional da declaração do procedimento é a lista de parâmetros. Os parâmetros
representam o meio de troca de informações entre a subrotina e o programa que está fazendo a
chamada. Assim que um programa faz a chamada de uma subrotina, seja procedimento ou função,
caso a subrotina implemente a passagem de parâmetros obrigatórios, o programa deverá passar os
argumentos destes parâmetros, de acordo com a ordem e os tipos. Falaremos mais sobre parâmetros
e tipos de parâmetros mais adiante.

código terminal
1 PROGRAMA “4.2 - Operação de Soma” Informe o 1º valor:
2 PROCEDIMENTO CalcularSoma(valor1: REAL, 55
valor2: REAL) Informe o 2º valor:
3 VARIÁVEIS 40
4 resultado : REAL
5 INÍCIO PROCEDIMENTO 55 + 40 = 95
6 resultado ← valor1 + valor2
7 ESCREVA(valor1, “ + ”, valor2, “ = ”,
8 resultado)
9 FIM PROCEDIMENTO
10
11 VARIÁVEIS
12 primeiroVal, segundoVal: REAL
13 INÍCIO ALGORITMO
14 ESCREVA(“Informe o 1º valor:”)
15 LEIA(primeiroVal)
16 ESCREVA(“Informe o 2º valor:”)
17 LEIA(segundoVal)
18 ESCREVA(“”)
19
20 CalcularSoma(primeiroVal, segundoVal)
21 FIM ALGORITMO

Funções
Assim como os procedimentos, as funções também representam uma forma de declaração das
subrotinas. Mas, diferentemente dos procedimentos, as funções retornam valores após a sua
execução, sendo a principal característica desse tipo de estrutura.

O nome desse tipo de subrotina faz referência às funções matemáticas, responsáveis por isolar o
valor de alguma de algum ponto do eixo das abscissas ou das ordenadas, no plano cartesiano, com
base em alguma expressão algébrica. No entanto as funções na programação não são nada
complexas quando comparadas às funções vistas em cálculos, bastando entender somente a
similaridade das estruturas que está no retorno de valores com base em algum procedimento ou
cálculo.

47
Programação Estruturada Programação Modular
A declaração de funções na estrutura do programa segue as mesmas regras de declaração de
procedimentos, ou seja, deve ser declaradas após a seção “TIPOS” - caso haja -, e antes da seção
"VARIÁVEIS”. O bloco de instruções do subalgoritmo também deve ser declarado entre os
delimitadores da estrutura, porém, este, agora, deve implementar obrigatoriamente uma instrução
de retorno de valor, sendo do mesmo tipo de dados indicado no cabeçalho da estrutura. Observe a
estrutura da declaração a seguir:

FUNÇÃO nome_da_funcao([parametro1: tipo], [parâmetro2: tipo], …, [parametroN : tipo]) :


tipo_retorno
[VARIÁVEIS]
variavelA : tipo …
INÍCIO FUNÇÃO
//programação …
RETORNAR valor
FIM FUNÇÃO

Com a declaração da função realizada, resta apenas referenciá-la no corpo do programa principal.
Note que, no exemplo a seguir, a função está sendo utilizada junto ao operador de atribuição,
indicando que o valor de retorno da função, após o encerramento de sua execução, será atribuído à
variável “ nal”. Mas lembre-se, apesar de existir a obrigatoriedade de qualquer função retornar um
valor, a atribuição do retorno a uma variável não é obrigatória, podendo a função ser chamada da
mesma forma que o procedimento. Neste caso, o retorno da função está sendo desprezado pelo
programa.

código terminal
1 PROGRAMA 4.3 - Uso de Função” BOLETIM ESTUDANTIL
2 FUNÇÃO CalcularMedia(valor1 : REAL,
valor2: REAL, valor3: REAL, valor4: Informe a 1ª nota:
REAL) : REAL 8.75
3 VARIÁVEIS Informe a 2ª nota:
4 soma, media : REAL 9.9
5 INÍCIO FUNÇÃO Informe a 3ª nota:
6 soma ← valor1 7.0
7 soma +← valor2 Informe a 4ª nota:
8 soma +← valor3 10
9 soma +← valor4 MÉDIA FINAL = 8.91250000
10 media ← soma / 4
11 RETORNAR media
12 FIM FUNÇÃO
13
14 VARIÁVEIS
nota1, nota2, nota3, nota4,
final: REAL

48
Programação Estruturada Programação Modular

código terminal
15 INÍCIO ALGORITMO
16 ESCREVA(“BOLETIM ESTUDANTIL”)
17 ESCREVA(“”)
18 ESCREVA(“Informe a 1ª nota:”)
19 LEIA(nota1)
20 ESCREVA(“Informe a 2ª nota:”)
21 LEIA(nota2)
22 ESCREVA(“Informe a 3ª nota:”)
23 LEIA(nota3)
24 ESCREVA(“Informe a 4ª nota:”)
25 LEIA(nota4)
26
27 final ← CalcularMedia(nota1,
nota2, nota1, nota1)
28
29 ESCREVA(“MÉDIA FINAL = “, final)
30 FIM ALGORITMO

A instrução “RETORNAR” não somente indica qual valor será retornado, mas também delimita
um ponto de encerramento da execução da função. Tal recurso é muito utilizado para interromper
a execução com base em alguma validação de dados, impedindo que a execução da função após a
entrada de algum valor inválido pelo usuário, ou até algum resultado de cálculo previsto como fora
do limite suportado pelo algoritmo, por exemplo. Por esse motivo, uma função pode implementar
várias vezes a instrução de retorno, sendo que o primeiro a ser executado irá interromper a execução
da subrotina.

49
Programação Estruturada Programação Modular

código terminal
1 PROGRAMA “4.4 - Parâmetros de Vetores” VETORES C/ FUNÇÕES
2 FUNÇÃO PreencherDados() : VETOR[5] DE
INTEIRO Preencha os dados
3 VARIÁVEIS Informe o 1º valor:
4 i : INTEIRO 18
5 dados: VETOR[5] DE INTEIRO Informe o 2º valor:
6 INÍCIO PROCEDIMENTO 35
7 PARA i DE 1 ATÉ 5 FAÇA Informe o 3º valor:
8 ESCREVA(“Informe o ”, i, “º 0
valor:”)
9 LEIA(dados[i])
10
11 SE dados[i] = 0 ENTÃO
12 RETORNAR dados
13 FIM SE
14 FIM PARA
15 RETORNAR dados
16 FIM PROCEDIMENTO
17 VARIÁVEIS
18 dadosPreenchidos : VETOR[5] DE
INTEIRO
19 INÍCIO ALGORITMO
20 ESCREVA(“VETORES C/ FUNÇÕES”)
21 ESCREVA(“”)
22 ESCREVA(“Preencha os dados”)
23 dadosPreenchidos ← PreencherDados()
24 FIM ALGORITMO

Passagem de parâmetros
Como já explicado anteriormente, a passagem de parâmetros representa a troca de informações
entre a subrotina e o programa que realiza sua chamada. A declaração de parâmetros é semelhante à
declaração de variáveis, ou seja, deve-se informar o nome do parâmetro e, logo após os dois pontos
(:), informar seu tipo de dados, podendo ser de tipo primitivo, ou de algum tipo complexo, como
vetor ou registro. As declaração de múltiplos parâmetros deverá ser feita separando cada uma das
declarações por vírgula (,).

Além da estrutura da declaração dos parâmetros, devemos nos atentar, também, às formas e aos
tipos. Existem duas formas de passagem de parâmetros para as subrotinas, sendo a passagem por
valor e a passagem por referência. Em relação aos tipos, existem os parâmetros obrigatórios e os
parâmetros opcionais.

A passagem de parâmetros por valor é a forma implícita de passagem de informações às subrotinas.


Isso quer dizer que as alterações de valores de parâmetros, que acontecem durante a execução de um

50
Programação Estruturada Programação Modular
procedimento ou uma função, não serão re etidas externamente. Diferentemente da passagem por
valor, a passagem por referência permite que as alterações de valores ocorridas nos parâmetros,
durante a execução da subrotina, sejam re etidas externamente após a execução, ou seja, se uma
variável for passada como argumento de um parâmetro de referência, as alterações sobre este será
re etida sobre aquela ao nal da execução da subrotina.

Existem algumas limitações quanto às formas de declaração dos parâmetros em relação aos tipos de
dados. Todos os tipos de dados podem ser utilizados em parâmetros declarados como referência, no
entanto, o tipo de dados não existe passagem de parâmetros por valor para o tipo de dados
VETOR. Isso não signi ca que o tipo VETOR não possa ser utilizado em passagem de parâmetros
por valor, mas sim que todo parâmetro declarado com esse tipo será sempre classi cado como
referência.

Tipo Por valor Por referência

BOOLEANO SIM SIM

INTEIRO SIM SIM

REAL SIM SIM

CARACTERE SIM SIM

TEXTO SIM SIM

VETOR NÃO SIM

REGISTRO SIM SIM

Em relação aos tipos, os parâmetros obrigatórios são declarados de forma implícita, ou seja, todo
parâmetro é obrigatório por padrão. Um parâmetro somente será opcional caso possua um pre xo.
Dessa forma, o argumento referente ao parâmetro opcional poderá ser omitido.

Passagem por valor


A declaração de parâmetros de passagem por valor é a forma mais comum de se utilizar parâmetros.
Não há nenhum pre xo a ser utilizado para declaração desses parâmetros, bastando apenas
informar o nome seguido do tipo de dados. Entretanto, como já informado anteriormente, a única
restrição deste tipo de declaração está associada ao tipo VETOR, pois todo parâmetro declarado
como VETOR funcionará por referência, e todas alterações realizadas no parâmetro, durante a
execução da subrotina, serão re etidas diretamente na estrutura homogênea.

51
Programação Estruturada Programação Modular

código terminal
1 PROGRAMA “4.5 - Passagem por Valor” Texto: PROGRAMAÇÃO ESTRUTURADA
2 FUNÇÃO SubTexto(valor: TEXTO, Parte: ESTRUTURADA
posInicial: INTEIRO, qtdCaracteres:
INTEIRO) : TEXTO
3 VARIÁVEIS
4 i, posFinal: INTEIRO
5 resultado : TEXTO
6 INÍCIO FUNÇÃO
7 posFinal ← posInicial +
qtdCaracteres
8
9 SE (posFinal> TAMANHO(valor)) ENTÃO
10 posFinal ← TAMANHO(valor)
11 FIM SE
12
13 PARA i DE posInicial ATÉ posFinal
FAÇA
14 resultado ← resultado + valor[i]
15 FIM PARA
16
17 RETORNAR dados
18 FIM FUNÇÃO
19
20 VARIÁVEIS
21 palavra, parte : TEXTO
22 INÍCIO ALGORITMO
23 palavra ← “PROGRAMAÇÃO ESTRUTURADA”
24 parte ← SubTexto(palavra, 13, 11)
25 ESCREVA(“Texto: ”, palavra)
26 ESCREVA(“Parte: ”, parte)
27 FIM ALGORITMO

Passagem por referência


Em relação à forma de passagem de parâmetros por referência, os parâmetros devem possuir o
pre xo “REFERÊNCIA”, tanto em sua declaração, quanto na passagem do argumento em sua
chamada. Somente variáveis podem servir como argumento de parâmetros. Valores explícitos,
constantes e dados empilhados não podem servir como argumento de referência.

Uma subrotina pode conter parâmetros de passagem por valor e parâmetros de passagem por
referência. No entanto, existe uma regra geral na declaração de parâmetros de referência, pois
nenhum parâmetro de passagem por valor pode ser declarado após a declaração de um parâmetro
de passagem por referência. Embora exista essa limitação, a regra não impede a declaração de
múltiplos parâmetros de passagem por referência.

52
Programação Estruturada Programação Modular

código terminal
1 PROGRAMA “4.6 - Passagem por Referência” Informe um número:
2 FUNÇÃO TentarTEXTO2INT(valor : TEXTO, 90.65
REFERÊNCIA sucesso : BOOLEANO) : INTEIRO CONVERSÃO BEM SUCEDIDA!
3 VARIÁVEIS 90.65 → 90
4 i, posFinal, resultado : INTEIRO
5 INÍCIO FUNÇÃO
6 posFinal ← TAMANHO(valor)
7
8 PARA i DE 1 ATÉ posFinal FAÇA
9 SE (NÃO (valor[i] >= ‘0’ E
10 valor[i] <= ‘9’)) ENTÃO
11 SE (NÃO (valor[i] = ‘.’)) ENTÃO
12 sucesso ← FALSO
13 RETORNAR 0
14 FIM SE
15 FIM SE
16 FIM PARA
17
18 sucesso ← VERDADEIRO
19 resultado ← TEXTO2INTEIRO(valor)
20 RETORNAR resultado
21 FIM FUNÇÃO
22
23 VARIÁVEIS
24 conteudo: TEXTO
25 numero : INTEIRO
26 convertido : BOOLEANO
27 INÍCIO ALGORITMO
28 ESCREVA(“Informe um número: ”)
29 LEIA(valor)
30 numero ← TentarTEXTO2INT(conteudo,
REFERÊNCIA convertido)
31
32 SE convertido ENTÃO
33 ESCREVA(“CONVERSÃO BEM SUCEDIDA!”)
34 ESCREVA(conteudo, “→”, numero)
35 SENÃO
36 ESCREVA(“CONVERSÃO INVÁLIDA!”)
37 FIM SE
38 FIM ALGORITMO

Passagem de vetores
As subrotinas admitem a declaração de parâmetros de tipos homogêneos, como os vetores, matrizes
e estruturas multidimensionais. A declaração de parâmetros segue uma estrutura exatamente igual à
declaração de parâmetros de tipos primitivos, no entanto, devemos sempre nos atentar que tais
parâmetros do tipo VETOR são de passagem por referência, ou seja, as alterações ocorridas no
parâmetro durante a execução da função ou do procedimento, serão re etidas na estrutura

53
Programação Estruturada Programação Modular
principal. Parâmetros de tipos homogêneos declarados com o pre xo “REFERÊNCIA” são
admitidos, mas o pre xo REFERÊNCIA é redundante.

Existe mais uma regra em relação à declaração de parâmetros de tipos homogêneos, mas que se
aplica somente às estruturas com mais de uma dimensão, ou seja, as matrizes e estruturas
multidimensionais. A regra impõe que somente a última dimensão tenha a quantidade de
elementos declarada de forma explícita, e as demais dimensões podem ter a quantidade de
elementos omitida, podendo ser informada ou não, a critério do desenvolvedor.

código terminal
1 PROGRAMA “4.7 - Parâmetros de Vetores” DADOS VETOR:
2 PROCEDIMENTO PrencheVetor(elementos: 1º=19
VETOR[3] DE INTEIRO) 2º=65
3 INÍCIO PROCEDIMENTO 3º=38
4 elementos[1] ← 19
5 elementos[2] ← 65 DADOS MATRIZ:
6 elementos[3] ← 38 1,1=10
7 FIM PROCEDIMENTO 1,2=100
8 2,1=20
9 PROCEDIMENTO PreencheMatriz(matriz: 2,2=200
VETOR[][2] DE INTEIRO)
10 INÍCIO PROCEDIMENTO
11 matriz[1][1] ← 10
12 matriz[1][2] ← 100
13 matriz[2][1] ← 20
14 matriz[2][2] ← 200
15 FIM PROCEDIMENTO
16
17 VARIÁVEIS
18 i, j : INTEIRO
19 v : VETOR[3] DE INTEIRO
20 m : VETOR[2][2] DE INTEIRO
21 INÍCIO ALGORITMO
22 PrencheVetor(v)
23 PreencheMatriz(m)
24
25 ESCREVA(“DADOS VETOR:”)
26 PARA i DE 1 ATÉ 3 FAÇA
27 ESCREVA(i, “º=”, v[i])
28 FIM PARA
29
30 ESCREVA(“DADOS MATRIZ:”)
31 PARA i DE 1 ATÉ 2 FAÇA
32 PARA j DE 1 ATÉ 2 FAÇA
33 ESCREVA(i, “,”, j, “=”,
m[i][j])
34 FIM PARA
35 FIM PARA
36 FIM ALGORITMO

54
Programação Estruturada Programação Modular

Passagem de registros
Quanto aos parâmetros de tipos heterogêneos, não há segredos. Os parâmetros com esse tipo de
dados podem ser declarados na forma de passagem por valor ou por referência, semelhante ao que
com os parâmetros de tipos de dados primitivos.

A única observação em relação aos parâmetros de tipos heterogêneos ca por conta da


obrigatoriedade da declaração do tipo heterogêneo antes da utilização do tipo em algum parâmetro.
Mas tal observação pode ser considerada desnecessária, já que a declaração das subrotinas somente
pode acontecer após a declaração da seção “TIPOS”.

código terminal
1 PROGRAMA “4.8 - Parâmetros de INFORME DADOS DO MODELO:
Registros” Fabricante:
2 TIPOS CAOA CHERY
3 REGISTRO TIPO_VEICULO Modelo:
4 FABRICANTE: TEXTO TIGGO 8 PRO
5 MODELO: TEXTO Ano:
6 ANO: TEXTO 2022/2023
7 FIM REGISTRO
8 DADOS DO MODELO:
9 FUNÇÃO LerDados(REFERÊNCIA veiculo: Fabricante: CAOA CHERY
TIPO_VEICULO): BOOLEANO Modelo: TIGGO 8 PRO
10 INÍCIO FUNÇÃO Ano: 2022/2023
11 ESCREVA(“INFORME DADOS DO MODELO:”)
12 ESCREVA(“Fabricante:”)
13 LEIA(veiculo→FABRICANTE)
14 ESCREVA(“Modelo: ”)
15 LEIA(veiculo→MODELO)
16 ESCREVA(“Ano: ”)
17 LEIA(veiculo→ANO)
18 RETORNAR VERDADEIRO
19 FIM FUNÇÃO
20 PROCEDIMENTO ApresentarDados(veiculo:
TIPO_VEICULO)
21 INÍCIO PROCEDIMENTO
22 ESCREVA(“”)
23 ESCREVA(“DADOS DO MODELO: ”)
24 ESCREVA(“Fabricante: ”,
veiculo→FABRICANTE)
25 ESCREVA(“Modelo: ”, veiculo→MODELO)
26 ESCREVA(“Ano: ”, veiculo→ANO)
27 FIM PROCEDIMENTO
28 VARIÁVEIS
29 veiculo: REGISTRO DE TIPO_VEICULO
30 INÍCIO ALGORITMO
31 LerDados(REFERÊNCIA veiculo)
32 ApresentarDados(veiculo)
33 FIM ALGORITMO

55
Programação Estruturada Programação Modular

Parâmetros Opcionais
Os parâmetros opcionais permitem a omissão do respectivo argumento do parâmetro durante a
chamada da subrotina pelo programa. Mas, para que isso possa acontecer, o parâmetro deve ser
declarado com o pre xo “OPCIONAL”, podendo ser de qualquer tipo de dados, primitivo ou
estruturado.

O parâmetro opcional pode ser declarado junto a um valor padrão, que é atribuído ao parâmetro
caso o argumento seja omitido na chamada da subrotina. No entanto, somente valores explícitos,
estáticos, podem ser utilizados como valores padrão de parâmetros opcionais, restringindo o uso de
valores padrão somente aos parâmetros de tipos primitivos.

Os parâmetros de passagem por referência também podem ser parâmetros opcionais, e as variáveis
utilizadas como argumentos desses parâmetros podem ser omitidas na chamada da subrotina.
Ainda sim o parâmetro declarado dessa forma poderá ser utilizado e alterado durante a execução da
subrotina, porém as alterações não serão re etidas em nenhum lugar. Para declarar parâmetros de
referência opcionais, pasta utilizar o pre xo “OPCIONAL” antes do pre xo “REFERÊNCIA”.
Exemplo: “[...] OPCIONAL REFERÊNCIA valor : REAL”.

Semelhante ao que acontece com a declaração de parâmetros por referência, a declaração de


parâmetros opcionais também possui uma restrição. Não pode haver nenhuma declaração de
parâmetro obrigatório após a declaração de um parâmetro opcional. A restrição não impede que a
função declare mais de um parâmetro opcional, não havendo um limite para tal.

56
Programação Estruturada Programação Modular

código terminal
1 PROGRAMA “4.9 - Parâmetro opcional” FORMATAÇÃO NUMÉRICA:
2 FUNÇÃO FormatarDecimal(valor : REAL, 3.00
OPCIONAL casasDecimais : INTEIRO = 2): 18.6
TEXTO 10.150
3 VARIÁVEIS
4 parteInteira, parteDecimal,
coeficiente : INTEIRO
5 formatado : TEXTO
6 INÍCIO FUNÇÃO
7 coeficiente ← 10 ^ casasDecimais
8 parteInteira ← valor
9 parteDecimal ← (valor -
parteInteira) * coeficiente
10
11 formatado ← INT2TEXTO(parteInteira)
12 SE parteDecimal > 0 ENTÃO
13 formatado +← ","
14 formatado +←
INT2TEXTO(parteDecimal)
15 FIM SE
16
17 RETORNAR formatado
18 FIM FUNÇÃO
19 INÍCIO ALGORITMO
20 ESCREVA("FORMATAÇÃO NUMÉRICA:")
21 ESCREVA(FormatarDecimal(3.00))
22 ESCREVA(FormatarDecimal(18.6254, 1))
23 ESCREVA(FormatarDecimal(100.15, 3))
24 FIM ALGORITMO

Conclusão
O capítulo IV apresentou a você o conceito mais importante do paradigma da Programação
Estruturada, as subrotinas. Você pôde entender como acontece a modularização do algoritmo,
declarando estruturas do tipo procedimento e também do tipo função. Além disso, pôde conhecer
as formas, tipos e regras de declaração de parâmetros, que permitem a troca de informações entre as
subrotinas e o programa principal.

O próximo e último capítulo apresenta um conceito extremamente importante sobre a


programação estruturada: a recursividade. Tal técnica permite o empilhamento de múltiplas
chamadas de uma mesma subrotina, possibilitando a resolução de um problema com um mesmo
algoritmo, que o divide em partes menores.

57
Programação Estruturada Recursividade

Capítulo Recursividade
V
Introdução
E será com este capítulo que encerraremos os aprendizados relacionados ao paradigma da
Programação Estruturada. A recursividade é importante técnica de programação, e traz uma visão
diferente sobre a problemática de se elaborar e construir um algoritmo.

Até o momento, vimos como armazenar e processar informações, utilizando as estruturas


homogêneas e heterogêneas de dados, e, posteriormente, compreendemos como estruturar um
algoritmo utilizando as subrotinas, seja com funções ou procedimentos. E será com este último que
entenderemos como a técnica da programação recursiva funciona, pois é através de subrotinas que
tal técnica de programação é estudada e aplicada aos problemas a serem resolvidos.

Além de entender o conceito, você compreenderá como analisar e elaborar um algoritmo recursivo,
segregando o problema em duas partes, sendo uma a parte que conhecemos e a outra a parte
recorrente, que precisa ser reprocessada, até atingir a parte conhecida. Além disso, alguns problemas
matemáticos didáticos serão relembrados, e utilizaremos os algoritmos recursivos para solucionar
tais problemas.

Apesar de estarmos no último capítulo, ainda veremos conceitos importantes trazidos por este.
Aproveite os assuntos trazidos aqui para ampliar seu conhecimento e ampliar seu arcabouço de
ferramentas na programação.

Bons estudos!

Conceito
Em algumas ocasiões, sabemos que para resolver um problema, precisamos executar o mesmo
conjunto de passos algumas vezes, de forma repetida. Sempre reaproveitamos o resultado dos passos

58
Programação Estruturada Recursividade
executados anteriormente, e, dessa forma, retornamos ao início do processo as últimas informações
obtidas e os executamos novamente. Fazemos isso até obtermos o resultado alcançado.

Em nosso dia a dia, executamos inúmeras atividades de forma repetida, e a recorrência da atividade
está condicionada a seguinte situação: executamos até chegar ao m. Em um escritório, um analista
analisa uma pilha de relatórios e dados que está sobre sua mesa. É provável que ele não saiba
quantos relatórios há na pilha sobre sua mesa, mas executa a mesma atividade, recursivamente, até
que concluir seu trabalho de análise dos dados.

E é através dos conceitos da recursividade que construímos as soluções para alguns problemas na
computação, levando-se em consideração que, para resolver tal problema, o único ponto de parada
é parte é uma parte do problema que conhecemos. Logo efetuamos inúmeras chamadas de uma
mesma subrotina, de forma recorrente, recursiva, até encontrarmos uma solução.

Laureano (2008) entende que a recursão é o processo de de nir algo em termos de si próprio,
atribuindo o termo “de nição circular” ao conceito da recursividade. Não há um limite de
tentativas ou chamadas recursivas para solucionar um problema, apenas chamamos um
procedimento ou função inúmeras vezes, inde nidamente, até encontrarmos o caso base, ou seja, o
único ponto que conhecemos da solução geral.

Caso base e caso recursivo


Para que a recursividade possa ser melhor compreendida, podemos dividir um algoritmo recursivo
em caso base e caso recursivo. Dessa forma presume-se que o caso recursivo é quando não temos a
solução geral do problema, ou seja, o resultado obtido até um determinado momento não atende à
solução geral. Neste caso, uma nova chamada da subrotina é realizada, passando, como argumento
de parâmetros, o resultado obtido no último processamento.

Já o caso base é a parte da solução que conhecemos. Ela indica o ponto de parada, ou
desempilhamento da subrotina, geralmente se dando através de uma validação, um desvio
condicional constatando o caso base.

Tomemos como exemplo um algoritmo responsável por calcular o número fatorial de número
natural maior que zero. Sabemos que, pela de nição, o resultado do fatorial de um número,
expresso por 𝑛!, é a multiplicação de seu valor por todos seus antecessores naturais maiores que
zero, sendo 𝑛! = 𝑛 · (𝑛 − 1) · (𝑛 − 2) ·... · (𝑛 − (𝑛 − 1)), ou simplesmente
𝑛! = 𝑛 · (𝑛 − 1).

59
Programação Estruturada Recursividade
Exemplo:

6! = 6 · 5 · 4 · 3 · 2 · 1

6! = 720

Não importa qual seja o número natural, para encontrar seu fatorial, basta efetuar a sucessivas
multiplicações de seu valor por seus antecessores naturais. Este seria o caso recursivo, e, nesta
situação, o caso base seria, por exemplo, a multiplicação pelo número natural 1, pois sabemos que
todo número multiplicado por 1 é ele próprio.

Dessa forma, analisando o problema do cálculo do fatorial de um número natural, podemos


elaborar, utilizando os conceitos da programação recursiva, um algoritmo que implemente uma
subrotina responsável por realizar este cálculo. Dentro da subrotina, isolamos o caso base, sendo a
multiplicação por 1. Logo o caso recursivo será a chamada sucessiva da mesma função para
qualquer multiplicando diferente de 1.

código terminal
1 PROGRAMA “5.1 - Fatorial (Recursivo)” Informe um número (N):
2 FUNÇÃO Fatorial(valor: INTEIRO): INTEIRO 5
3 INÍCIO FUNÇÃO 5! = 120
4 SE (valor <= 1) ENTÃO
5 RETORNAR 1
6 SENÃO
7 RETORNAR valor * Fatorial(valor-1)
FIM SE
8 FIM FUNÇÃO
9 VARIÁVEIS
10 numero, resultado : INTEIRO
11 INÍCIO ALGORITMO
12 ESCREVA("Informe um número (N):")
13 LEIA(numero)
14 resultado ← Fatorial(numero)
15 ESCREVA(numero, "! = ", resultado)
16 FIM ALGORITMO

Algoritmos recursivos
Para um melhor aprendizado dos conceitos da programação recursiva, podemos contar com alguns
alguns problemas didáticos, certamente já vistos por você na disciplina de matemática do ensino
médio ou fundamental. Apesar do envolvimento de conceitos e termos técnicos da matemática, essa
é a melhor forma de compreender a aplicabilidade dos algoritmos recursivos, pois você já conhece a
problematização, e deverá ter um raciocínio mais facilitado quando pensar sobre o caso base e o
caso recursivo desses algoritmos.

60
Programação Estruturada Recursividade
No tópico anterior você conheceu um dos problemas matemáticos em que é possível resolver
utilizando recursividade, o Fatorial. Agora você será apresentado a mais dois problemas, sendo o
primeiro a transformação de um número qualquer em notação cientí ca, e, posteriormente,
relembrará a Sequência Fibonacci.

Notação Cientí ca
A notação cientí ca é uma forma reduzida de expressar a grandeza dos números. É muito comum
em cálculos astronômicos, energéticos, nucleares e também cálculos geológicos, pois, nestas áreas de
estudo, sempre falamos em grandes massas dos corpos celestes; distâncias entre planetas e estrelas
(anos-luz); número de elétrons em uma corrente; número de átomos ssionados; e até idade de
rochas. Em quaisquer uma dessas áreas de estudo, certamente você encontrará expressivos e ín mos
valores.

Independentemente do tamanho do valor encontrado, seja de dígitos inteiros ou casas decimais, é


possível reduzi-lo a uma expressão algébrica, permitindo que cientistas, pro ssionais e estudiosos
possam compreender a grandeza do valor. Para isso, reduzimos o número em uma expressão que
multiplica o valor por uma base 10, sendo que a grandeza do número está representada pelo
expoente posicionado nesta base.

Exemplo:

1 Ano-luz = 9. 460. 730. 472. 580. 800 𝑚𝑒𝑡𝑟𝑜𝑠


15
Em notação cientí ca = 9. 46 · 10 𝑚𝑒𝑡𝑟𝑜𝑠

Para solucionar o problema da transformação em notação cientí ca, podemos elaborar um


algoritmo recursivo, em que um valor é dividido ou multiplicado sucessivamente, somando ou
subtraindo o valor do expoente, até encontrarmos um valor maior ou igual a 1 e menor ou igual a
10. Assim que o valor tornar a condição verdadeira, a expressão será retornada, concatenando o
valor transformado e o expoente na base decimal, sendo este o caso base.

61
Programação Estruturada Recursividade

código terminal
1 PROGRAMA “5.2 - Notação Científica” Informe um número:
2 FUNÇÃO Cientifico(valor: REAL, 742.335
OPCIONAL expoente: INTEIRO): TEXTO NOTAÇÃO CIENTÍFICA: 7,42335 x 10 ^ 2
3 VARIÁVEIS
4 proximoValor : REAL
5 proximoExpoente : INTEIRO
6 notacao : TEXTO
7 INÍCIO FUNÇÃO
8 SE (valor => 1 E valor < 10) ENTÃO
9 notacao ← REAL2TEXTO(valor)
10 SE (expoente = 0) ENTÃO
11 notacao +← " x 10^" +
expoente
12 FIM SE
13 RETORNAR notacao
14 SENÃO
15 proximoExpoente +← SE(valor>=0,
1, -1)
16 proximoValor ← SE(valor>=0,
valor / 10, valor * 10)
17 RETORNAR Cientifico(
proximoValor, proximoExpoente)
18 FIM SE
19 FIM FUNÇÃO
20 VARIÁVEIS
21 numero : REAL
22 resultado : TEXTO
23 INÍCIO ALGORITMO
24 ESCREVA("Informe um número: ")
25 LEIA(numero)
26 resultado ← Cientifico(numero)
27 ESCREVA("NOTAÇÃO CIENTÍFICA: ",
28 resultado)
29 FIM ALGORITMO

Sequência de Fibonacci
A Sequência Fibonacci, ou Sucessão de Fibonacci, é uma sequência numérica de naturais (N*), em
que o valor de um termo é resultado da soma de seus dois antecessores.Foi proposta pelo
matemático italiano Leonardo de Pisa, também conhecido como Leonardo Fibonacci.

Essa sequência numérica é in nita, e se inicia com dois termos de valor 1, 𝐹1 = 1, 𝐹2 = 1, sendo
que o termo 𝐹𝑛 = 𝐹𝑛−1 + 𝐹𝑛−2. Dessa forma, temos, como os 10 primeiros termos da sequência,
os valores 𝐹𝑛 ... 𝑛+10 = 1, 1, 2, 3, 5, 8, 13, 21, 34 𝑒 55.

Podemos utilizar os conceitos da recursividade para elaborar um algoritmo, que será responsável
por exibir os números da Sequência Fibonacci no terminal. Dessa vez, ao invés de utilizarmos uma

62
Programação Estruturada Recursividade
função, como zemos com os algoritmos anteriores, utilizaremos um procedimento, pois não
retornaremos nenhum valor ao programa principal. Como a Sequência Fibonacci é in nita,
solicitamos a quantidade de termos ao usuário, que será passado como argumento de parâmetro ao
procedimento. Este será o caso base.

código terminal
1 PROGRAMA “5.3 - Sequência Fibonacci” Quantidade de termos:
2 PROCEDIMENTO GerarFibonacci(termos: 8
INTEIRO, OPCIONAL termoA: INTEIRO= 1,
OPCIONAL termoB: INTEIRO=1) Sequência Fibonacci:
3 INÍCIO PROCEDIMENTO 1
4 ESCREVA(termoA) 1
5 2
6 SE (termos > 0) ENTÃO 3
7 termoA +← termoB 5
8 GerarFibonacci(termos-1,termoB, 8
termoA) 13
9 FIM SE 21
10 FIM PROCEDIMENTO
11 VARIÁVEIS
12 termos : INTEIRO
13 INÍCIO ALGORITMO
14 ESCREVA("Quantidade de termos:")
15 LEIA(termos)
16 ESCREVA(“”)
17 ESCREVA("Sequência Fibonacci:")
19 GerarFibonacci(termos)
20 FIM ALGORITMO

Conclusão
E assim chegamos ao m deste livro. Este último capítulo apresentou a poderosíssima técnica da
programação recursiva; conceito capaz de resolver um um problema dividindo-o em partes
menores, chamando sempre uma mesma subrotina, de forma inde nida, até encontrarmos a
solução nal do problema.

Você também conheceu as técnicas de análise e elaboração de um algoritmo através do caso base e
do caso recursivo. Com esse conceito, é possível elaborar algoritmos complexos, capazes de resolver
grandes problemas com facilidade, pois se temos parte da de nição do problema, basta empregar o
caso base e o caso recursivo, até encontrarmos toda solução.

Por m, você foi apresentado a alguns problemas didáticos, muito utilizados para o ensino da
programação recursiva, como o cálculo fatorial, a notação cientí ca e, não menos importante, a
Sequência Fibonacci.

63
Programação Estruturada Recursividade
E assim chegamos ao m deste livro. Apesar de breve, foram muitos conceitos importantes
ensinados aqui, e, com toda certeza, você poderá a rmar que, com toda certeza, não apenas ouviu
falar do paradigma da Programação Estruturada, mas que conhece e domina o modo de programar
utilizando tal paradigma de programação.

Nós encerramos por aqui, mas espero reencontrá-lo em breve para novos aprendizados. Desejo-lhe
sucesso em sua carreira pro ssional como programador.

Que a força esteja com você e até a próxima!

64
Referências
MANZANO, José Augusto N. G. Estudo Dirigido: ALGORITMOS. São Paulo: Editora Érica,
2000.

LAUREANO, Marcos. Estrutura de dados com Algoritmos e C. Rio de Janeiro: Brasport,


2008.

ASCENCIO, Ana Fernanda G. Fundamentos da programação de computadores. 2. ed. São


Paulo: Pearson Prentice Hall, 2007.

65

Você também pode gostar