Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
Revisão
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.
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.
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.
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
De nição 19
Vetores 20
Matrizes 24
Estruturas multidimensionais 28
Conceito 32
Registros de registros 38
Vetores de registros 39
Subrotinas 41
Procedimentos 43
Funções 45
Passagem de parâmetros 48
Passagem de vetores 51
Passagem de registros 53
Parâmetros Opcionais 54
V. Recursividade 56
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.
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.
Instrução Descrição
10
Programação Estruturada Introdução à Programação Estruturada
Instrução Descrição
11
Programação Estruturada Introdução à Programação Estruturada
Instrução Descrição
12
Programação Estruturada Introdução à Programação Estruturada
Instrução Descrição
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
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.
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.
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
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
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.
20
Programação Estruturada Estruturas homogêneas: 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.
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.
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
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
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.
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.
26
Programação Estruturada Estruturas homogêneas: Vetores e Matrizes
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
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.
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
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.
32
Programação Estruturada Estruturas heterogêneas: 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.
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
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
37
Programação Estruturada Estruturas heterogêneas: Registros
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
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.
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.
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.
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
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.
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.
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.
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
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:
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.
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.
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.
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
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.
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”.
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.
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.
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.
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.
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.
Exemplo:
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.
64
Referências
MANZANO, José Augusto N. G. Estudo Dirigido: ALGORITMOS. São Paulo: Editora Érica,
2000.
65