Beruflich Dokumente
Kultur Dokumente
LICENCIATURA EM
Computação
ALGORITMOS E PROGRAMAÇÃO II
Ivo Mario Mathias
CDD : 005.113
A Coordenação
SUMÁRIO
■■ PALAVRAS DO PROFESSOR7
■■ OBJETIVOS E EMENTA9
SUBALGORITMOS69
■■ SEÇÃO 1- ESTRUTURA E FUNCIONAMENTO 71
■■ SEÇÃO 2- FUNÇÕES74
■■ SEÇÃO 3- PROCEDIMENTOS83
■■ SEÇÃO 4- PASSAGEM DE PARÂMETROS 88
RECURSIVIDADE113
■■ PALAVRAS FINAIS 121
■■ REFERÊNCIAS 123
■■ ANEXOS - Respostas das Atividades 125
■■ NOTAS SOBRE O AUTOR 149
PALAVRAS DO PROFESSOR
Bons Estudos!
OBJETIVOS E EMENTA
Objetivos
Objetivo geral:
Objetivos específicos:
Ementa
Variáveis compostas homogêneas. Pesquisa sequencial e binária. Método de
ordenação. Subalgoritmos. Variáveis compostas heterogêneas. Recursividade.
Aplicações de algoritmos em uma linguagem de programação.
I
Variáveis Compostas
UNIDADE
Homogêneas
Unidade II
OBJETIVOS DE APRENDIZAGEM
Introduzir os conceitos básicos e definições sobre Variáveis Compostas
Homogêneas.
ROTEIRO DE ESTUDOS
SEÇÃO 1 – Variável Indexada
SEÇÃO 1
VARIÁVEL INDEXADA
12
UNIDADE I
Algoritmos e Programação II
(inteiro, real, literal ou lógico) e a quantidade de dados é proporcional
ao valor expresso no(s) índice(s). O valor máximo de índices de uma
variável indexada é proporcional ao valor máximo de números inteiros
que a linguagem de programação comporta. Nessa disciplina e do ponto
de vista algorítmico, os números inteiros serão sempre armazenados em
2 bytes, o que equivale ao limite de 65535.
Quando uma variável indexada possui um único índice é chamada
de vetor (unidimensional), quando possui dois ou mais índices é chamada
de matriz (multidimensional – bidimensional, tridimensional ...).
Possivelmente, os termos vetor e matriz são mais comuns a você e,
possivelmente, facilitarão o entendimento dessa modalidade de estrutura
de dados, no contexto da programação de computadores. Veja a seguir,
como essas variáveis são declaradas.
SEÇÃO 2
DECLARAÇÕES DE VARIÁVEIS INDEXADAS -
VETORES - MATRIZES
Como regra geral, por ser o que ocorre na maioria das linguagens
de programação, as variáveis devem ser declaradas no início do programa
ou das rotinas que as utilizarão, ou seja, antes de serem utilizadas.
Com relação à sintaxe, seguindo os mesmos procedimentos já adotados
em Algoritmos e Programação I, em que, embora as sintaxes para
declaração das variáveis possam diferir entre as diferentes linguagens
de programação e entre os algoritmos, neste livro será adotada a sintaxe
similar à linguagem de programação Pascal.
13
UNIDADE I
Universidade Aberta do Brasil
Var
Onde:
• <tipo_de_dado> – inteiro, real, literal ou lógico.
• <nome_da_variável> – é o nome simbólico pelo qual o conjunto
é identificado;
• dim1.. dim2 – correspondem aos valores mínimos e máximos
dos índices da variável, dimensões.
14
UNIDADE I
Algoritmos e Programação II
Do ponto de vista algorítmico e por padronização, nessa disciplina, assim como já
foi considerado em Algoritmos e Programação I, os tipos de dados serão armazenados
conforme segue:
• números inteiros - 2 bytes;
• números reais - 4 bytes;
• literal - cada caractere em 1 byte;
• lógicos - 1 byte.
15
UNIDADE I
Universidade Aberta do Brasil
SEÇÃO 3
OPERAÇÕES BÁSICAS COM VARIÁVEIS
INDEXADAS - VETORES - MATRIZES
16
UNIDADE I
Algoritmos e Programação II
Analise alguns exemplos a seguir:
17
UNIDADE I
Universidade Aberta do Brasil
ATRIBUIÇÃO
• NOMES[3] := ꞌMariliaꞌ;
• IDADES[3] := 45;
• SALARIOS[3] := 1000,00;
• TABELA[i,j] := 88;
18
UNIDADE I
Algoritmos e Programação II
Analisando os exemplos anteriormente ilustrados, percebe-se
que no caso das três primeiras variáveis indexadas, NOMES, IDADES
e SALARIOS, foram atribuídos valores conforme cada tipo de dado
correspondente, em que os valores foram alocados na posição 3 de cada
conjunto.
No caso do exemplo da variável TABELA, como é uma matriz
bidimensional, foram usadas duas variáveis, < i , j >, para especificar os
índices. Diante dessa situação, é importante salientar que os índices, de
qualquer variável indexada, podem ser representados por variáveis ou
constantes, mas sempre do tipo inteiro.
É oportuno lembrar que, assim como ocorre com variáveis simples,
as variáveis indexadas também podem ser operadores de expressões,
desde que seja especificado, individualmente, o elemento do conjunto
que será utilizado.
LEITURA
Leia (NOMES[i]);
ESCRITA
19
UNIDADE I
Universidade Aberta do Brasil
Escreva (NOMES[i]);
Algoritmo Leitura_escrita_vetor_inteiros;
Var
Numeros : conjunto [1..10] de inteiro;
i : inteiro;
Início
Fim.
20
UNIDADE I
Algoritmos e Programação II
Antes de prosseguir, observe atentamente o algoritmo exibido
anteriormente, procurando entender o funcionamento e mentalizar qual
seria a saída dele se fosse executado. Caso julgue necessário, elabore um
teste de mesa, que foi ensinado em Algoritmos e Programação I.
Uma vez que tenha entendido o funcionamento do algoritmo em
questão, continue com a leitura e analise agora o programa da figura 4,
que é o mesmo algoritmo da figura 3, codificado em Pascal. Do mesmo
modo que fez com o algoritmo, analise atentamente os detalhes do
programa comparando com o pseudocódigo.
A partir de agora, tanto nos algoritmos como nos programas em Pascal, estarão sendo
utilizadas as três estruturas de programação que você já aprendeu: sequenciais, decisão e
repetição. Portanto, parte-se do princípio que você já domina esses assuntos e consegue
analisar os respectivos códigos. Contudo, caso tenha dúvidas recorra ao livro da disciplina
Algoritmos e Programação I.
Program Leitura_escrita_vetor_inteiros;
Var
Numeros : array [1..10] of integer;
i : integer;
Begin
For i:= 1 to 10 do
Begin
write (ꞌEntre com o ꞌ,i,ꞌo. número:ꞌ);
read(Numeros[i]);
End;
writeln (ꞌListagem completa do vetor:ꞌ);
For i:= 1 to 10 do
writeln(Numeros[i]);
readkey;
End.
21
UNIDADE I
Universidade Aberta do Brasil
22
UNIDADE I
Algoritmos e Programação II
Para ampliar os conhecimentos com operações de vetores, estude
e analise os dois próximos exemplos, figuras 5 e 6, seguindo os mesmos
procedimentos em relação aos exemplos anteriores, ou seja, analise
individualmente cada código e compare as diferenças, não se esquecendo
de implementar e executar o programa em Pascalzim.
Algoritmo Leitura_soma_vetor_reais;
Var
Valores : conjunto[1..10] de real;
Soma : real;
i : inteiro;
Início
Soma := 0;
Para i de 1 até 10 incr de 1 faça
Soma := Soma + Valores[i];
Fim_para;
Fim.
23
UNIDADE I
Universidade Aberta do Brasil
Program Leitura_soma_vetor_reais;
Var
Valores : array [1..10] of real;
Soma : real;
i : integer;
Begin
For i:= 1 to 10 do
Begin
write (ꞌEntre com o ꞌ,i,ꞌo. número:ꞌ);
read(Valores[i]);
End;
Soma := 0;
For i:= 1 to 10 do
Soma := Soma + Valores[I];
readkey;
End.
24
UNIDADE I
Algoritmos e Programação II
Reescreva e implemente em Pascalzim o programa da figura 6, de modo tal que
seja utilizada apenas uma vez a estrutura de repetição, Para-passo, e se obtenha o mesmo
resultado como saída do programa, ou seja, o somatório do conteúdo todo do vetor.
Nesta unidade, você teve a oportunidade de aprender o que são variáveis compostas
homogêneas e a importância delas no contexto da programação de computadores. Visto que,
com variáveis simples é possível armazenar apenas um valor de cada vez e, com variáveis
indexadas pode-se armazenar um conjunto de valores de qualquer um dos tipos de dados.
Aprendeu também que as variáveis indexadas podem ser chamadas de vetores e
matrizes e, embora elas possuam apenas uma identificação, nome, o acesso aos dados é
feito por meio dos índices, que possibilitam o acesso individual aos dados.
Na questão de vetores e matrizes foi destacado que o diferencial é com relação à
quantidade de índices, ou seja, quando uma variável indexada possui um único índice é
chamada de vetor (unidimensional), quando possui dois ou mais índices é chamada de matriz
(multidimensional – bidimensional, tridimensional ...).
Com relação às operações básicas, foi visto que seguem as mesmas sintaxes das
instruções primitivas de atribuição, leitura e escrita, apenas com o detalhe de incluir o índice
correspondente ao dado que se quer operar.
Foram ilustrados exemplos práticos, que auxiliam no entendimento de como os
conjuntos podem ser operados e, neste quesito o principal destaque foi com relação ao uso
de estruturas de repetição.
A próxima unidade vai abordar outros exemplos práticos de aplicações utilizando
vetores e matrizes.
25
UNIDADE I
26
Universidade Aberta do Brasil
UNIDADE I
Unidade II II
Aplicações com
UNIDADE
Vetores e Matrizes
OBJETIVOS DE APRENDIZAGEM
Apresentar aplicações comuns com vetores: pesquisa e classificação ou
ordenação.
ROTEIRO DE ESTUDOS
SEÇÃO 1 – Pesquisa Sequencial ou Linear
SEÇÃO 1
PESQUISA SEQUENCIAL OU LINEAR
Var
Nomes : conjunto [1..1000] de literal[30];
Chave : literal[30];
i, Ultimo : inteiro;
Achou : lógico;
Início
Para i de 1 até 1000 incr de 1 faça
escreva (ꞌEntre com o ꞌ,i,ꞌo. nome:ꞌ);
leia(Nomes[i]);
Se (Nomes[i] = ꞌfimꞌ) então
Ultimo := i - 1;
saia;
senão
Ultimo := i;
Fim_se;
29
UNIDADE II
Universidade Aberta do Brasil
Program Pesquisa_Sequencial;
Var
Nomes : array [1..1000] of string[30];
Chave : string[30];
i, Ultimo : integer;
Achou : boolean;
Begin
For i := 1 to 1000 do
Begin
write (ꞌEntre com o ꞌ,i,ꞌo. nome:ꞌ);
read(Nomes[i]);
If (Nomes[i] = ꞌfimꞌ) then
Begin
Ultimo := i - 1;
break;
End
else
Begin
Ultimo := i;
End;
End;
readkey;
End.
31
UNIDADE II
Universidade Aberta do Brasil
32
UNIDADE II
Algoritmos e Programação II
É oportuno relembrar que um determinado problema a ser resolvido
computacionalmente, pode ser resolvido com códigos diferentes, mas é
possível obter o mesmo resultado, como saída. Diante dessa premissa,
resolva a atividade proposta a seguir.
33
UNIDADE II
Universidade Aberta do Brasil
SEÇÃO 2
PESQUISA BINÁRIA
Siga em frente!
34
UNIDADE II
Algoritmos e Programação II
Algoritmo Pesquisa_Binaria_Nomes;
Var
Nomes : conjunto [1..1000] de literal[30];
Chave : literal[30];
i, Primeiro, Medio, Ultimo : inteiro;
Achou : lógico;
Início
i := 1;
Repita
escreva (ꞌEntre com o ꞌ,i,ꞌo. nome:ꞌ);
leia(Nomes[i]);
Se (Nomes[i] = ꞌfimꞌ) então
Ultimo := i - 1
senão
i := i + 1;
Ultimo := i;
Fim_se;
Até_que (Nomes[i] = ꞌfimꞌ);
Fim.
Program Pesquisa_Binaria_Nomes;
Var
Nomes : array [1..1000] of string[30];
Chave : string[30];
i, Primeiro, Medio, Ultimo : integer;
Achou : boolean;
Begin
i := 1;
// Entrada dos nomes
Repeat
write (ꞌEntre com o ꞌ,i,ꞌo. nome:ꞌ);
read(Nomes[i]);
If (Nomes[i] = ꞌfimꞌ) then
Ultimo := i - 1
else
Begin
i := i + 1;
Ultimo := i;
End;
Until (Nomes[i] = ꞌfimꞌ);
readkey;
End.
37
UNIDADE II
Universidade Aberta do Brasil
Nomes[ ]
Dim Conteúdo
1 Amélia
2 Camila
3 Fernanda
4 Ivo
5 Lauro
6 Marilia
7 Tatiana
8 Xandra
9 Zenildo
10 Zilda
38
UNIDADE II
Algoritmos e Programação II
39
UNIDADE II
Universidade Aberta do Brasil
40
UNIDADE II
Algoritmos e Programação II
Apesar do método da pesquisa binária ter a desvantagem de exigir que
o vetor seja previamente classificado, o que não acontece com a pesquisa
sequencial, a pesquisa binária em média é mais rápida que a sequencial.
Para suprir essa necessidade de ordenar um vetor, o próximo assunto
a ser estudado é o método de classificação chamado de Bolha.
SEÇÃO 3
MÉTODO DA BOLHA DE CLASSIFICAÇÃO/ORDENAÇÃO
(BUBBLE SORT)
41
UNIDADE II
Universidade Aberta do Brasil
42
UNIDADE II
Algoritmos e Programação II
Algoritmo Metodo_Bolha_Bubble_Sort_Inteiros;
Var
Numeros: conjunto [1..1000] de inteiro;
i, j, Aux, Ultimo : inteiro;
Início
i := 1;
Repita
escreva (ꞌEntre com o ꞌ,i,ꞌo. número: ꞌ);
leia(Numeros[i]);
Se (Numeros[i] < 0) então
Ultimo := i - 1
senão
i := i + 1;
Ultimo := i;
Fim_se;
Até_que ((Numeros[i] < 0) .OU. (i = 1000));
j := Ultimo;
Enquanto(j > 1) faça
Para i de 1 até j-1 faça
Se Numeros[i] > Numeros[i+1] então
Aux := Numeros[i];
Numeros[i] := Numeros[i+1];
Numeros[i+1] := Aux;
Fim_se;
Fim_para;
j := j - 1;
Fim_enquanto;
End.
43
UNIDADE II
Universidade Aberta do Brasil
Program Metodo_Bolha_Bubble_Sort_Inteiros;
Var
Numeros: array [1..1000] of integer;
i, j, Aux, Ultimo : integer;
Begin
// Entrada dos números
i := 1;
Repeat
write (ꞌEntre com o ꞌ,i,ꞌo. número: ꞌ);
read(Numeros[i]);
If (Numeros[i] < 0) then
Ultimo := i - 1
else
Begin
i := i + 1;
Ultimo := i;
End;
Until ((Numeros[i] < 0) or (i = 1000));
j := Ultimo;
// Rotina do Método Bolha
While(j > 1) do
Begin
For i := 1 to j-1 do
Begin
If Numeros[i] > Numeros[i+1] then
Begin
Aux := Numeros[i];
Numeros[i] := Numeros[i+1];
Numeros[i+1] := Aux;
End;
End;
j := j - 1;
End;
// Saída do programa
For i := 1 to Ultimo do
writeln(i,ꞌo. - ꞌ,Numeros[i]);
readkey;
End.
44
UNIDADE II
Algoritmos e Programação II
Seguindo o mesmo método já adotado em relação aos algoritmos e
programas anteriores, analise cuidadosamente cada um dos códigos, tire
as suas conclusões, para então prosseguir com a leitura.
Os códigos das figuras 11 e 12, além de tratar-se de um assunto novo,
cabem também alguns destaques em relação a assuntos já abordados.
• Tanto nos códigos em referência como nos anteriores, é visível a
importância da indentação, pois sem ela dificulta o entendimento
dos códigos. Principalmente na identificação das diferentes
estruturas de um algoritmo ou programa. Outro fator crucial
é a visualização dos aninhamentos, quando uma estrutura de
programação está dentro do conjunto de comandos (comando
composto) de uma outra construção.
• No quesito aninhamento, a rotina do método bolha possui
um aninhamento triplo, formado por três estruturas, duas de
repetição, que são a Enquanto/While e o Para-passo/For, e na
estrutura mais interna, uma estrutura de decisão, Se/If.
• Outro item importante que a rotina do método bolha possui é a
utilização de uma variável Aux (auxiliar), que tem por finalidade
armazenar temporariamente o valor de um elemento do vetor e
transferir esse conteúdo para outra posição. Observe e analise
que esta técnica é útil em qualquer situação quando se quer
trocar de posição os conteúdos de um conjunto, pois, sem o uso
de uma variável auxiliar (intermediária), fatalmente o valor de
uma das posições seria perdido.
45
UNIDADE II
Universidade Aberta do Brasil
Numeros[ ]
Dim Valores
1 223
2 789
3 768
4 001
5 987
6 345
7 006
8 026
9 121
10 003
46
UNIDADE II
Algoritmos e Programação II
Reescreva o algoritmo/programa das figuras 11 e 12, de modo tal que o conjunto de
dados a serem classificados sejam nomes.
Melhore o programa, para que ao finalizar a entrada dos nomes, o algoritmo/programa
reconheça a palavra fim, tanto minúscula como maiúscula.
47
UNIDADE II
Universidade Aberta do Brasil
SEÇÃO 4
APLICAÇÕES COM MATRIZES
48
UNIDADE II
Algoritmos e Programação II
matrizes. Você vai perceber que as rotinas, as quais serão estudadas,
podem ser aplicadas na resolução de problemas práticos com matrizes.
Os primeiros exemplos, figuras 14 e 15, ilustram um algoritmo e o
respectivo programa em Pascal para leitura e escrita de uma matriz de
números inteiros.
Algoritmo Leitura_Escrita_Matriz;
Var
i,j: inteiro;
Matriz: conjunto [1..3, 1..3] de inteiro;
Início
Para i de 1 até 3 incr de 1 faça
Para j de 1 até 3 incr de 1 faça
escreva(ꞌEntre com o valor da posição [ꞌ,i,ꞌ,ꞌ,j, ꞌ] : ꞌ);
leia(Matriz[i,j]);
Fim_para;
Fim_para;
Fim.
49
UNIDADE II
Universidade Aberta do Brasil
Program Leitura_Escrita_Matriz;
Var
i,j: integer;
Matriz: array [1..3, 1..3] of integer;
Begin
// Leitura dos dados da matriz
For i := 1 to 3 do
For j := 1 to 3 do
Begin
write(ꞌEntre com o valor da posição [ꞌ,i, ꞌ,ꞌ,j, ꞌ] : ꞌ);
readln(Matriz[i,j]);
End;
For i := 1 to 3 do
Begin
For j := 1 to 3 do
write(Matriz[i,j]:3);
writeln;
End;
readkey;
End.
50
UNIDADE II
Algoritmos e Programação II
Os códigos das figuras 14 e 15 possuem alguns detalhes novos e
relembrando, para um melhor entendimento, todos os programas em
Pascal constantes deste livro devem ser implementados e executados no
Pascalzim.
51
UNIDADE II
Universidade Aberta do Brasil
52
UNIDADE II
Algoritmos e Programação II
Agora que você já sabe os procedimentos para a leitura e escrita
de matrizes, a seguir serão apresentadas outras operações comuns em
tratamento de matrizes.
Nas figuras 16 e 17, você encontra um algoritmo e o respectivo
programa para tratamento de uma matriz de números inteiros, com as
seguintes rotinas;
• uso de constantes predefinidas;
• inicialização de matriz.
Algoritmo Uso_constantes_e_Inicializacao_Matriz;
Var
i,j,num: inteiro;
Matriz: conjunto [1..100, 1..100] de inteiro;
Constante
linhas = 10;
colunas = 10;
Início
num := 1;
Para i de 1 até linhas incr de 1 faça
Para j de 1 até colunas incr de 1 faça
Matriz[i,j] := num;
num := num + 1;
Fim_para;
Fim_para;
Fim.
53
UNIDADE II
Universidade Aberta do Brasil
Program Uso_constantes_e_Inicializacao_Matriz;
Var
i,j,num: integer;
Matriz: array [1..100, 1..100] of integer;
Begin
// Inicialização da matriz com números sequenciais
num := 1;
For i := 1 to linhas do
For j := 1 to colunas do
Begin
Matriz[i,j] := num;
num := num + 1;
End;
For i := 1 to linhas do
Begin
For j := 1 to colunas do
write(Matriz[i,j]:5);
writeln;
End;
readkey;
End.
54
UNIDADE II
Algoritmos e Programação II
Novamente, antes de prosseguir, faça um estudo detalhado dos dois
códigos, procure entender o funcionamento do programa. Identifique as
novidades, aí então prossiga com a leitura dos destaques a seguir:
• Primeiro destaque é o uso de constantes, que correspondem a
um valor fixo, atribuído a um identificador, que no decorrer do
algoritmo ou execução de um programa sempre terá o mesmo
valor. Nos exemplos em questão, foram usadas duas constantes
para delimitar a quantidade de linhas e colunas da matriz,
respectivamente. Com relação à sintaxe e em comparação ao
pseudocódigo e o código em Pascal, apenas uma pequena
diferença nas palavras, constante e const.
• O uso de constantes é uma prática útil na programação de
computadores, pois como pode ser observado nos códigos em
referência, as constantes foram utilizadas em dois trechos, sem
a necessidade de usar constantes numéricas.
• Outra vantagem no uso de constantes é o fato de que por meio
delas podem ser alterados valores nas linhas de código dos
algoritmos/programa sem reescrevê-los. Imagine que você tem
um código extenso para diversos tratamentos de matrizes e quer
alterar o tamanho das matrizes. Com o uso de constantes basta
alterar o valor no local da declaração, que automaticamente
esse valor será assimilado em todos os locais do código onde
as constantes aparecem. Por outro lado, se estiver utilizando
constantes numéricas, teria que editar todas as linhas onde
fosse necessário, ainda correndo o risco de esquecer a alteração
de alguma linha de código.
• Outro destaque importante é a rotina que faz a inicialização
da matriz, atribuindo valores a todos os elementos. Esse
procedimento é comum, principalmente nos casos em que os
elementos da matriz são utilizados para cálculos, ou ainda,
quando se quer padronizar com valores iniciais a matriz. Situação
que, na prática, facilita saber quais elementos já foram ou não
utilizados, por exemplo, inicializar uma matriz de números com
zeros, ou valores negativos.
55
UNIDADE II
Universidade Aberta do Brasil
Algoritmo Tratamento_de_Matriz_linhas_colunas;
Var
i,j,num,soma_lin_5,soma_col_10 : inteiro;
Matriz: conjunto [1..100, 1..100] de inteiro;
Constante
linhas = 10;
colunas = 10;
Início
num := 1;
Para i de 1 até linhas incr de 1 faça
Para j de até colunas incr de 1 faça
Matriz[i,j] := num;
num := num + 1;
Fim_para;
Fim_para;
soma_lin_5 := 0;
Para j de 1 até colunas incr de 1 faça
soma_lin_5 := soma_lin_5 + Matriz[5,j];
Fim_para;
soma_col_10 := 0;
Para i de 1 ate linhas incr de 1 faça
soma_col_10 := soma_col_10 + Matriz[i,10];
Fim_para;
Fim.
56
UNIDADE II
Algoritmos e Programação II
Program Tratamento_de_Matriz_linhas_colunas;
Var
i,j,num,soma_lin_5,soma_col_10 : integer;
Matriz: array [1..100, 1..100] of integer;
Begin
// Inicialização da matriz com números sequenciais
num := 1;
For i := 1 to linhas do
For j := 1 to colunas do
Begin
Matriz[i,j] := num;
num := num + 1;
End;
For i := 1 to linhas do
Begin
For j := 1 to colunas do
write(Matriz[i,j]:5);
writeln;
End;
// Saídas do programa
writeln;writeln(ꞌSaídas do programa: ꞌ);
writeln;
writeln(ꞌSomatório dos elementos da linha 5: ꞌ,soma_lin_5);
writeln(ꞌSomatório dos elementos da coluna 10: ꞌ,soma_col_10);
readkey;
End.
57
UNIDADE II
Universidade Aberta do Brasil
58
UNIDADE II
Algoritmos e Programação II
Algoritmo Tratamento_de_Matriz_diagonais;
Var
i,j,num: inteiro;
soma_diag_P,soma_diag_S: inteiro;
Matriz: conjunto [1..100, 1..100] de inteiro;
Constante
linhas = 10;
colunas = 10;
Início
num := 1;
Para i de 1 até linhas incr de 1 faça
Para j de 1 até colunas incr de 1 faça
Matriz[i,j] := num;
num := num + 1;
Fim_para;
Fim_para;
soma_diag_P := 0;
j := 1;
Para i de 1 até colunas incr de 1 faça
soma_diag_P := soma_diag_P + Matriz[i,j];
j := j + 1;
Fim_para;
soma_diag_S := 0;
j := colunas;
Para i de 1 até colunas incr de 1 faça
soma_diag_S := soma_diag_S + Matriz[i,j];
j := j - 1;
Fim_para;
Fim.
Program Tratamento_de_Matriz_diagonais;
Var
i,j,num: integer;
soma_diag_P,soma_diag_S: integer;
Matriz: array [1..100, 1..100] of integer;
Begin
// Inicialização da matriz com números sequenciais
num := 1;
For i := 1 to linhas do
For j := 1 to colunas do
Begin
Matriz[i,j] := num;
num := num + 1;
End;
writeln;
End;
// Saídas do programa
writeln;writeln(ꞌSaídas do programa: ꞌ);
writeln;
writeln(ꞌSomatório dos elementos da diagonal principal : ꞌ,soma_diag_P);
writeln(ꞌSomatório dos elementos da diagonal secundária: ꞌ,soma_diag_S);
readkey;
End.
60
UNIDADE II
Algoritmos e Programação II
Para facilitar o entendimento dos exemplos de códigos exibidos nas
figuras 20 e 21, a figura 22 ilustra onde são representadas as diagonais
principal e secundária de uma matriz.
61
UNIDADE II
Universidade Aberta do Brasil
Algoritmo Somatrio_entre_Matrizes;
Var
i,j,num: inteiro;
Matriz_1: conjunto [1..100, 1..100] de inteiro;
Matriz_2: conjunto [1..100, 1..100] de inteiro;
Matriz_3: conjunto [1..100, 1..100] de inteiro;
Constante
linhas = 10;
colunas = 10;
Início
num := 1;
// Saída do algoritmo---------------------------------
escreva(ꞌConteúdo da Matriz 3: ꞌ);
Para i de 1 até linhas incr de 1 faça
Para j de 1 até colunas incr de 1 faça
escreva(Matriz_3[i,j]);
Fim_para;
Fim_para;
Fim.
62
UNIDADE II
Algoritmos e Programação II
Program Somatorio_entre_Matrizes;
Var
i,j,num: integer;
Matriz_1: array [1..100, 1..100] of integer;
Matriz_2: array [1..100, 1..100] of integer;
Matriz_3: array [1..100, 1..100] of integer;
Begin
// Inicialização das matrizes
// Matriz 1 com números sequenciais
// Matriz 2 com dobro dos valores da Matriz 1
num := 1;
For i := 1 to linhas do
For j := 1 to colunas do
Begin
Matriz_1[i,j] := num;
Matriz_2[i,j] := num*2;
num := num + 1;
End;
// Saída do programa----------------------------------
writeln(ꞌConteúdo da Matriz 3: ꞌ);
For i := 1 to linhas do
Begin
For j := 1 to colunas do
write(Matriz_3[i,j]:5);
writeln;
End;
readkey;
End.
63
UNIDADE II
Universidade Aberta do Brasil
Sem dúvida, você já deve ter percebido que além da análise dos
exemplos ilustrados, outro modo de efetivamente fixar os conteúdos é por
meio de exercícios. Sendo assim, desenvolva as atividades propostas a
seguir, sempre reforçando, inicialmente faça com os conhecimentos que
você adquiriu até onde consta a atividade e com o auxílio dos exemplos.
Após ter resolvido, compare com as soluções apresentadas no final do livro.
64
UNIDADE II
Algoritmos e Programação II
Escreva um algoritmo e o implemente em linguagem Pascal com as seguintes rotinas:
• que inicialize uma matriz 5 x 5 com valores inteiros ímpares, iniciando em 1;
• exiba a matriz lida;
• efetue a troca do conteúdo, elementos, da 2ª linha com o da 5ª linha;
• efetue a troca do conteúdo, elementos, da 3ª coluna com o da 4ª coluna;
• exiba a matriz modificada.
65
UNIDADE II
66
Universidade Aberta do Brasil
UNIDADE II
Algoritmos e Programação II
67
UNIDADE II
Universidade Aberta do Brasil
Nesta unidade, Aplicações com Vetores e Matrizes, como o próprio título expressa,
você aprendeu a resolver várias operações práticas envolvendo variáveis indexadas. Com
vetores estudou de modo prático como efetuar pesquisas sequenciais e binárias.
Nas sequenciais, sendo o método mais objetivo para encontrar um elemento particular
num conjunto, estudou que consiste na verificação de cada componente do conjunto
sequencialmente (um após o outro) até que o elemento desejado seja ou não encontrado.
Com relação à pesquisa binária, foi visto que corresponde a um método que divide
sucessivamente um conjunto ao meio e, se o elemento procurado for menor que o elemento
divisor, repete-se o processo na primeira metade e se for maior, na segunda metade. O
procedimento se repete até que se localize o valor procurado ou até que não haja nenhum
trecho do conjunto a ser pesquisado.
Um requisito da pesquisa binária é que os dados estejam previamente classificados,
segundo algum critério (crescente ou decrescente). Uma das vantagens da pesquisa binária
é o fato de minimizar o esforço computacional na pesquisa de elementos de um conjunto,
conforme a posição do elemento procurado.
Outro assunto estudado nesta unidade foi Método da Bolha de Classificação (Bubble
Sort), que se baseia no princípio de que, em um conjunto de dados há valores menores,
mais leves, e maiores, mais pesados. Diante desse fato, como bolhas, os valores leves
sobem no conjunto um por vez, ao passo que os mais pesados descem em direção ao final
do conjunto. Algoritmicamente falando, o objetivo é percorrer o conjunto comparando os
elementos vizinhos entre si; caso estejam fora de ordem, os mesmos trocam de posição
entre si; repetir os processos anteriores até o final do vetor; na primeira varredura verifica
se o último elemento (maior de todos) do conjunto já está no seu devido lugar, para o caso
de ordenação crescente; a segunda varredura é análoga a primeira e vai até o penúltimo
elemento; o processo é repetido até que seja feito um número de varreduras igual ao
número de elementos a serem ordenados menos um; ao final do processo o conjunto estará
classificado segundo o critério escolhido.
Para finalizar a unidade, o foco da abordagem foi aplicações com matrizes
bidimensionais. Diversos exemplos de algoritmos e programas foram apresentados para o
tratamento de matrizes, envolvendo operações de cálculos entre os elementos da matriz,
manuseio de dados entre linhas, colunas e diagonais da matriz.
Possivelmente, nos exemplos de códigos que você estudou até agora e, principalmente
na última seção dos tratamentos de matrizes, você deve ter percebido várias rotinas,
similares e que se repetiam num mesmo algoritmo/programa, por exemplo, leitura e escrita de
matrizes. O próximo assunto, subalgoritmos, tem como finalidade minimizar as redundâncias
de códigos, buscando gerar rotinas genéricas que podem ser reutilizadas.
68
UNIDADE II
III
Subalgoritmos
UNIDADE
Unidade II
OBJETIVOS DE APRENDIZAGEM
Saber subdividir algoritmos e programas, facilitando o seu
entendimento.
ROTEIRO DE ESTUDOS
SEÇÃO 1 – Estrutura e Funcionamento
SEÇÃO 2 – Funções
SEÇÃO 3 – Procedimentos
Siga em frente!
70
UNIDADE III
Algoritmos e Programação II
SEÇÃO 1
ESTRUTURA E FUNCIONAMENTO
71
UNIDADE III
Universidade Aberta do Brasil
72
UNIDADE III
Algoritmos e Programação II
Algoritmo <nome_do_algoritmo>;
Var
<declaração_de_variáveis_globais>;
<definição_dos_subalgoritmos>;
Início
<corpo_do_algoritmo_principal>;
Fim.
73
UNIDADE III
Universidade Aberta do Brasil
SEÇÃO 2
FUNÇÕES
Var
<declaração_de_variáveis_locais>;
Início
<corpo_do_subalgoritmo>;
Fim.
74
UNIDADE III
Algoritmos e Programação II
-- Parâmetros – são opcionais, mas geralmente as funções
necessitam receber dados para serem executadas, conforme
forem projetadas. Esses dados são transmitidos no momento da
chamada ao subalgoritmo, que corresponde a uma comunicação
bidirecional chamada de passagem de parâmetros.
-- Parâmetros são similares a variáveis, logo estão vinculados
aos tipos de dados básicos, situação que deve ser declarada na
definição do subalgoritmo: inteiro, real, literal ou lógico.
-- Como uma função retorna um valor ao encerrar o processamento,
a ela também é necessário que seja especificado que tipo de
dado retornará.
Algoritmo Funcao_eleva_quadrado;
Var
num, w : real;
//----------------------------------------------
// Definição da função quadrado
//----------------------------------------------
Função quadrado(x : real) : real;
Var
y : real;
Início
y := x * x;
retorne y;
Fim;
//----------------------------------------------
// Algoritmo principal
//----------------------------------------------
Início
escreva(ꞌEntre com um número: ꞌ);
leia(num);
w := quadrado(num);
escreva(ꞌO quadrado de ꞌ, num, ꞌ é = ꞌ, w);
Fim.
Program Funcao_eleva_quadrado;
Var
num, w : real; // variáveis globais
//----------------------------------------------
// Definição da função quadrado
//----------------------------------------------
Function quadrado(x : real) : real;
Var
y : real; // variável local
Begin
y := x * x;
quadrado := y;
End;
//----------------------------------------------
// Programa principal
//----------------------------------------------
Begin
write(ꞌEntre com um número: ꞌ);
read(num);
w := quadrado(num); // chamada a função
quadrado
write(ꞌO quadrado de ꞌ, num, ꞌ é = ꞌ, w);
readkey;
End.
76
UNIDADE III
Algoritmos e Programação II
nome da função. Essa característica do Pascal não é universal,
o padrão da maioria das linguagens, tais como Java e C, é o uso
do comando return.
• Com relação à chamada a função, < w := quadrado(num); >,
é igual em ambos, algoritmo/Pascal. O destaque nesse item é o
fato de que a uma variável está sendo atribuída o nome da função.
• Ainda em relação à chamada a função, deve-se observar o uso
dos parâmetros, nesse caso, a variável num foi utilizada para
a passagem de parâmetros. O uso de parâmetros é amplo,
podendo ser utilizados além de variáveis, constantes e até
mesmo outras funções. Quando forem necessários mais de um
parâmetro, devem ser separados por vírgulas. Com relação ao
tipo de dados dos parâmetros, devem ser compatíveis com os
que forem declarados na definição da função.
• Na questão das declarações de variáveis, do ponto de vista
sintático, é fundamental fixar que tanto as globais como as locais,
além de um local específico, conforme os exemplos necessitam
da palavra-reservada Var.
77
UNIDADE III
Universidade Aberta do Brasil
78
UNIDADE III
Algoritmos e Programação II
Algoritmo Funcao_leitura_maior_valor_vetor_inteiros;
Var
Numeros: conjunto [1..1000] de inteiro;
Ultimo: inteiro;
// --------------------------------------------------
Função Maior_valor(x : inteiro): inteiro;
Var
i, maior : inteiro;
Início
maior := Numeros[1];
retorne maior;
Fim;
// --------------------------------------------------
Função Leitura_Vetor(): inteiro;
Var
i, Ult : inteiro;
Início
i := 1;
Repita
escreva (ꞌEntre com o ꞌ,i,ꞌo. número: ꞌ);
leia(Numeros[i]);
Se (Numeros[i] < 0) então
Ult := i - 1;
retorne Ult;
senão
i := i + 1;
Ult := i;
Fim_se;
Até_que ((Numeros[i] < 0) .ou. (Ult = 1000));
Fim;
// Algoritmo Principal--------------------------------
Início
Ultimo := Leitura_Vetor();
escreva(ꞌMaior valor do vetor é ꞌ,Maior_valor(Ultimo));
Fim.
Program Funcao_leitura_maior_valor_vetor_inteiros;
Var
Numeros: array [1..1000] of integer;
Ultimo: integer;
// --------------------------------------------------
Function Maior_Valor(x : integer): integer;
Var
i, maior : integer;
Begin
maior := Numeros[1];
For i := 2 to x do
If Numeros[i] > maior then
maior := Numeros[i];
Maior_Valor := maior;
End;
// --------------------------------------------------
Function Leitura_Vetor(): integer;
Var
i, Ult : integer;
Begin
i := 1;
Repeat
write (ꞌEntre com o ꞌ,i,ꞌo. número: ꞌ);
read(Numeros[i]);
If (Numeros[i] < 0) then
Begin
Ult := i - 1;
Leitura_Vetor := Ult;
End
else
Begin
i := i + 1;
Ult := i;
End;
Until ((Numeros[i] < 0) or (Ult = 1000));
End;
// Programa Principal--------------------------------
Begin
Ultimo := Leitura_Vetor();
writeln(ꞌMaior valor do vetor é ꞌ,Maior_Valor(Ultimo));
readkey;
End.
Aprimore o programa da figura 30, de modo que tenha mais uma função para determinar
qual é o menor valor e também informe quais as posições, índices, dos respectivos valores,
menor e maior.
81
UNIDADE III
Universidade Aberta do Brasil
82
UNIDADE III
Algoritmos e Programação II
SEÇÃO 3
PROCEDIMENTOS
Var
<declaração_de_variáveis_locais>;
Início
<corpo_do_subalgoritmo>;
Fim.
83
UNIDADE III
Universidade Aberta do Brasil
Algoritmo Pesquisa_Sequencial_Procedimentos;
Var
Nomes : conjunto [1..1000] de literal[30];
Chave : literal[30];
Ultimo, Qtde_nomes : inteiro;
//-----------------------------------------
Procedimento Entrada_Nomes();
Var
i : inteiro;
Início
i := 1;
Qtde_nomes := 0;
Repita
escreva (ꞌEntre com o ꞌ,i,ꞌo. nome:ꞌ);
leia(Nomes[i]);
Se (Nomes[i] = ꞌfimꞌ) então
Ultimo := i - 1
senão
i := i + 1;
Ultimo := i;
Fim_se;
Até_que (Nomes[i] = ꞌfimꞌ);
Fim;
//-----------------------------------------
Procedimento Pesquisa_Sequencial(nome : literal[30]);
Var
i : inteiro;
Início
i := 1;
Enquanto(i <= Ultimo) faça
Se (Nomes[i] = Chave) então
Qtde_nomes := Qtde_nomes + 1;
Fim_se;
i := i + 1;
Fim_enquanto;
Var
Nomes : array [1..1000] of string[30];
Chave : string[30];
Ultimo, Qtde_nomes : integer;
//-----------------------------------------
Procedure Entrada_Nomes();
Var
i : integer;
Begin
i := 1;
Qtde_nomes := 0;
Repeat
write (ꞌEntre com o ꞌ,i,ꞌo. nome:ꞌ);
read(Nomes[i]);
if (Nomes[i] = ꞌfimꞌ) then
Ultimo := i - 1
else
Begin
i := i + 1;
Ultimo := i;
End;
Until (Nomes[i] = ꞌfimꞌ);
End;
//-----------------------------------------
Procedure Pesquisa_Sequencial(nome : string[30]);
Var
i : integer;
Begin
i := 1;
While(i <= Ultimo) do
Begin
if (Nomes[i] = Chave) then
Qtde_nomes := Qtde_nomes + 1;
i := i + 1;
End;
86
UNIDADE III
Algoritmos e Programação II
Siga em frente!
87
UNIDADE III
Universidade Aberta do Brasil
SEÇÃO 4
PASSAGEM DE PARÂMETROS
Algoritmo Funcao_eleva_quadrado;
Var
num, w : real;
//----------------------------------------------
// Definição da função quadrado
//----------------------------------------------
Função quadrado(x : real) : real;
Var
y : real;
Início
y := x * x;
retorne y;
Fim;
//----------------------------------------------
// Algoritmo principal
//----------------------------------------------
Início
escreva(ꞌEntre com um número: ꞌ);
leia(num);
w := quadrado(num);
escreva(ꞌO quadrado de ꞌ, num, ꞌ é = ꞌ, w);
Fim.
88
UNIDADE III
Algoritmos e Programação II
Os parâmetros reais são aqueles que substituem os parâmetros
formais quando da chamada a uma função ou procedimento.
Observando o algoritmo da figura 34, pode-se dizer que quando a
função é chamada para ser executada pelo algoritmo principal, na linha
< w := quadrado(num); >, a variável num, naquele momento é o
parâmetro real, que substitui o parâmetro formal x, variável que consta
da definição da função < Função quadrado(x : real) : real; >.
Um bom modo de fixar essa situação é lembrar que, as variáveis que
são utilizadas na definição, formalização, da função ou procedimento, são
as formais e os valores que são usados para chamar e executar a função
ou procedimento são os reais.
89
UNIDADE III
Universidade Aberta do Brasil
Algoritmo Passagem_parametros_valor ;
Var
X : inteiro;
//---------------------------------------------------------
Procedimento passa_valor(y : inteiro);
Início
Y := Y + 1;
escreva(ꞌValor de Y no procedimento: ꞌ,Y);
Fim;
//---------------------------------------------------------
Início
X := 1;
escreva(ꞌValor de X ANTES da chamada ao procedimento: ꞌ,X);
passa_valor(X);
escreva(ꞌValor de X DEPOIS da chamada ao procedimento: ꞌ,X);
Fim.
Program Passagem_parametros_valor ;
Var
X : integer;
//---------------------------------------------------------
Procedure passa_valor(Y : integer);
Begin
Y := Y + 1;
writeln(ꞌValor de Y no procedimento: ꞌ,Y);
End;
//---------------------------------------------------------
Begin
X := 1;
writeln(ꞌValor de X ANTES da chamada ao procedimento: ꞌ,X);
passa_valor(X);
writeln(ꞌValor de X DEPOIS da chamada ao procedimento: ꞌ,X);
readkey;
End.
91
UNIDADE III
Universidade Aberta do Brasil
Algoritmo Passagem_parametros_referencia ;
Var
X : integer;
//---------------------------------------------------------
Procedimento passa_referencia(Var Y : inteiro);
Início
Y := Y + 1;
escreva(ꞌValor de Y no procedimento: ꞌ,Y);
Fim;
//---------------------------------------------------------
Início
X := 1;
escreva(ꞌValor de X ANTES da chamada ao procedimento: ꞌ,X);
passa_referencia(X);
escreva(ꞌValor de X DEPOIS da chamada ao procedimento: ꞌ,X);
Fim.
92
UNIDADE III
Algoritmos e Programação II
Program Passagem_parametros_referencia ;
Var
X : integer;
//---------------------------------------------------------
Procedure passa_referencia(Var Y : integer);
Begin
Y := Y + 1;
writeln(ꞌValor de Y no procedimento: ꞌ,Y);
End;
//---------------------------------------------------------
Begin
X := 1;
writeln(ꞌValor de X ANTES da chamada ao procedimento: ꞌ,X);
passa_referencia(X);
writeln(ꞌValor de X DEPOIS da chamada ao procedimento: ꞌ,X);
readkey;
End.
Se você executou o programa da figura 38, deve ter tido como saída
a seguinte situação:
93
UNIDADE III
Universidade Aberta do Brasil
Nesta unidade, você deve ter percebido o quanto evoluiu em termos de conhecimentos
técnicos para o desenvolvimento de algoritmos e programas. À medida que a disciplina
vai avançando, torna-se notório que é necessário modularizar os códigos para facilitar a
compreensão lógica, assim como, à manutenção dos códigos.
Neste contexto, você aprendeu a criar subalgoritmos e por sua vez os respectivos
programas em Pascal, o que além de estruturar melhor os algoritmos e programas, facilita a
detecção de erros e a documentação de sistemas.
Nas seções dos estudos sobre funções e procedimentos além de aprender a construir
essas estruturas, teve a oportunidade de implementar em Pascal e a desenvolver diversas
atividades que o ajudaram a consolidar os conhecimentos.
Na questão da passagem de parâmetros por valor e referência, aprendeu como em
termos de código a diferença é sutil, bastando apenas colocar a palavra-reserva Var antes
da declaração dos parâmetros formais, que serão utilizados por referência. Por outro lado,
na execução a diferença é significativa, pois as mudanças nos parâmetros formais também
afetam os valores dos parâmetros reais.
Enfim, foi uma unidade de estudos que mostrou a você a flexibilidade que existe na
construção de algoritmos e programas.
94
UNIDADE III
Algoritmos e Programação II
95
UNIDADE III
IV
Variáveis Compostas
UNIDADE
Heterogêneas
Unidade II
OBJETIVOS DE APRENDIZAGEM
Entender como as estruturas de dados heterogêneas funcionam.
ROTEIRO DE ESTUDOS
SEÇÃO 1 – Introdução
SEÇÃO 2 – Registros
SEÇÃO 1
INTRODUÇÃO
98
UNIDADE IV
Algoritmos e Programação II
alunos e, com variáveis isoladas torna-se impraticável manipular tantas
informações. Trabalhar com vetores ou matrizes seria uma opção, mas não
tão interessante, pois como vetores e matrizes são variáveis homogêneas,
de um tipo de dado básico apenas, precisaria um vetor ou matriz para
cada informação especificamente.
Diante desse contexto, sem dúvida, a melhor opção é trabalhar
com variáveis compostas heterogêneas do tipo registro, o qual permite
a manipulação de um conjunto de informações de tipos primitivos
diferentes, campos. Por exemplo, na figura 39 está ilustrado um
formulário hipotético, de informações cadastrais de alunos, em que cada
campo é composto por dados de tipos e tamanhos diferentes, mas que
são inter-relacionados, pois em cada formulário preenchido os dados são
específicos a uma pessoa apenas.
Registro Acadêmico:
Nome:
Cidade: Estado:
CPF: Idade:
Curso:
99
UNIDADE IV
Universidade Aberta do Brasil
SEÇÃO 2
REGISTROS
Var
<Nome_do_registro> : Registro
<campo_1>:<tipo_de_dado>;
<campo_2>:<tipo_de_dado>;
: :
<campo_n>:<tipo_de_dado>;
Fim_registro;
Onde:
• <Nome_do_registro> – nome simbólico pelo qual o registro
será identificado.
• <campo_n> – nome simbólico pelo qual os campos serão
identificados.
• <tipo_de_dado> – inteiro, real, literal ou lógico, ou outro tipo
definido pelo programador, desde que tenha sido declarado
anteriormente.
Tomando por base o exemplo do formulário da figura 39, a seguir nas
figuras 40 e 41, como os dados poderiam ser declarados em um registro,
em algoritmo e Pascal respectivamente.
100
UNIDADE IV
Algoritmos e Programação II
Var
Cadastro_alunos : Registro
RA : literal[10];
Nome, Rua : literal[30];
Numero : literal[5];
CEP : literal[8];
Cidade : literal[20];
Estado : literal[2];
CPF : literal[11];
Idade : inteiro;
Curso : literal[20];
Fim_registro;
Var
Cadastro_alunos : Record
RA : string[10];
Nome, Rua : string[30];
Numero : string[5];
CEP : string[8];
Cidade : string[20];
Estado : string[2];
CPF : string[11];
Idade : integer;
Curso : string[20];
End;
101
UNIDADE IV
Universidade Aberta do Brasil
SEÇÃO 3
TIPO DEFINIDO PELO PROGRAMADOR
Tipo
Cadastro_alunos = Registro
RA : literal[10];
Nome, Rua : literal[30];
Numero : literal[5];
CEP : literal[8];
Cidade : literal[20];
Estado : literal[2];
CPF : literal[11];
Idade : inteiro;
Curso : literal[20];
Fim_registro;
Var
Aluno_graduacao : Cadastro_alunos;
Aluno_pos_graduacao : Cadastro_alunos;
102
UNIDADE IV
Algoritmos e Programação II
Type
Cadastro_alunos = Record
RA : string[10];
Nome, Rua : string[30];
Numero : string[5];
CEP : string[8];
Cidade : string[20];
Estado : string[2];
CPF : string[11];
Idade : integer;
Curso : string[20];
End;
Var
Aluno_graduacao : Cadastro_alunos;
Aluno_pos_graduacao : Cadastro_alunos;
103
UNIDADE IV
Universidade Aberta do Brasil
Algoritmo Definicao_Manipulacao_Registros;
Tipo
Cadastro_alunos = Registro
RA : literal[10];
Nome, Rua : literal[30];
Numero : literal[5];
CEP : literal[8];
Cidade : literal[20];
Estado : literal[2];
CPF : literal[11];
Idade : integer;
Curso : literal[20];
Fim_registro;
//---------------------------------------------------
Var
Aluno_graduacao : Cadastro_alunos;
Aluno_pos_graduacao : Cadastro_alunos;
//---------------------------------------------------
Função Le_formulario() : Cadastro_alunos;
Var
Aluno : Cadastro_alunos;
Início
escreva(ꞌCadastro de aluno:ꞌ);
escreva(ꞌRegistro Acadêmico: ꞌ); leia(Aluno.RA);
escreva(ꞌNome: ꞌ); leia(Aluno.Nome);
escreva(ꞌRua: ꞌ); leia(Aluno.Rua);
escreva(ꞌNúmero: ꞌ); leia(Aluno.Numero);
escreva(ꞌCEP: ꞌ); leia(Aluno.CEP);
escreva(ꞌCidade: ꞌ); leia(Aluno.Cidade);
escreva(ꞌEstado: ꞌ); leia(Aluno.Estado);
escreva(ꞌCPF: ꞌ); leia(Aluno.CPF);
escreva(ꞌIdade: ꞌ); leia(Aluno.Idade);
escreva(ꞌCurso: ꞌ); leia(Aluno.Curso);
retorne Aluno;
Fim;
//---------------------------------------------------
Procedimento Exibe_formulario(Aluno : Cadastro_alunos);
Início
escreva(ꞌDados do aluno:ꞌ);
escreva(ꞌRA: ꞌ, Aluno.RA, ꞌ - Nome: ꞌ, Aluno.Nome);
escreva(ꞌRua ꞌ, Aluno.Rua, ꞌ, ꞌ, Aluno.Numero);
escreva( Aluno.CEP, ꞌ - ꞌ, Aluno.Cidade, ꞌ - ꞌ, Aluno.Estado);
escreva(ꞌCPF: ꞌ, Aluno.CPF);
escreva(ꞌIdade: ꞌ, Aluno.Idade);
escreva(ꞌCurso: ꞌ, Aluno.Curso);
Fim;
//---------------------------------------------------
Início
Aluno_graduacao := Le_formulario();
Exibe_formulario(Aluno_graduacao);
escreva(ꞌPressione qualquer tecla para continuar...ꞌ);
Aluno_pos_graduacao := Le_formulario();
Exibe_formulario(Aluno_pos_graduacao);
escreva(ꞌPressione qualquer tecla para encerrar...ꞌ);
Fim.
Type
Cadastro_alunos = Record
RA : string[10];
Nome, Rua : string[30];
Numero : string[5];
CEP : string[8];
Cidade : string[20];
Estado : string[2];
CPF : string[11];
Idade : integer;
Curso : string[20];
End;
//---------------------------------------------------
Var
Aluno_graduacao : Cadastro_alunos;
Aluno_pos_graduacao : Cadastro_alunos;
//---------------------------------------------------
Function Le_formulario() : Cadastro_alunos;
Var
Aluno : Cadastro_alunos;
Begin
writeln(ꞌCadastro de aluno:ꞌ);
writeln;
write(ꞌRegistro Acadêmico: ꞌ); readln(Aluno.RA);
write(ꞌNome: ꞌ); readln(Aluno.Nome);
write(ꞌRua: ꞌ); readln(Aluno.Rua);
write(ꞌNúmero: ꞌ); readln(Aluno.Numero);
write(ꞌCEP: ꞌ); readln(Aluno.CEP);
write(ꞌCidade: ꞌ); readln(Aluno.Cidade);
write(ꞌEstado: ꞌ); readln(Aluno.Estado);
write(ꞌCPF: ꞌ); readln(Aluno.CPF);
write(ꞌIdade: ꞌ); readln(Aluno.Idade);
write(ꞌCurso: ꞌ); readln(Aluno.Curso);
writeln;
Le_formulario := Aluno;
End;
//---------------------------------------------------
Procedure Exibe_formulario(Aluno : Cadastro_alunos);
Begin
writeln(ꞌDados do aluno:ꞌ);
writeln;
writeln(ꞌRA: ꞌ, Aluno.RA, ꞌ - Nome: ꞌ, Aluno.Nome);
writeln(ꞌRua ꞌ, Aluno.Rua, ꞌ, ꞌ, Aluno.Numero);
writeln( Aluno.CEP, ꞌ - ꞌ, Aluno.Cidade, ꞌ - ꞌ, Aluno.Estado);
writeln(ꞌCPF: ꞌ, Aluno.CPF);
writeln(ꞌIdade: ꞌ, Aluno.Idade);
writeln(ꞌCurso: ꞌ, Aluno.Curso);
writeln;
End;
//---------------------------------------------------
Begin
Aluno_graduacao := Le_formulario();
Exibe_formulario(Aluno_graduacao);
write(ꞌPressione qualquer tecla para continuar...ꞌ);
readkey; clrscr;
Aluno_pos_graduacao := Le_formulario();
Exibe_formulario(Aluno_pos_graduacao);
write(ꞌPressione qualquer tecla para encerrar...ꞌ);
readkey;
End.
106
UNIDADE IV
Algoritmos e Programação II
Outra flexibilização do uso de registros ocorre no fato de poder
utilizar registros como campos de registros, o que torna alguns registros
mais objetivos e também podem ser criados registros genéricos, que
podem servir para diversas situações. Um caso são os endereços postais,
que são comuns nos mais diversos tipos de cadastros e possuem um
padrão de informações.
Na figura 46, o tipo Cadastro_aluno, das figuras 44 e 45, com uma
alternativa de usar o endereço como um outro registro, com adaptações.
Tipo
Endereco = Registro
Logradouro : literal[30];
Numero : literal[5];
CEP : literal[8];
Cidade : literal[20];
Estado : literal[2];
Fim_registro;
Tipo
Cadastro_alunos = Registro
RA : literal[10];
Nome : literal[30];
Ender : Endereco;
CPF : literal[11];
Idade : integer;
Curso : literal[20];
Fim_registro;
Var
Aluno_graduacao : Cadastro_alunos;
Aluno_pos_graduacao : Cadastro_alunos;
107
UNIDADE IV
Universidade Aberta do Brasil
leia(Aluno_graduacao.Ender.Logradouro);
escreva(Aluno_graduacao.Ender.Logradouro);
Aluno_graduacao.Ender.Logradouro := ꞌAvenida Gal. Carlos Cavalcantiꞌ;
Registro Acadêmico:
Nome:
Cidade: Estado:
CPF: Idade:
Curso:
108
UNIDADE IV
Algoritmos e Programação II
Na figura 48, estão trechos das definições do tipo vetor, baseados
no exemplo Cadastro_alunos.
Tipo
Dias_semana = conjunto[1..6] de inteiro ;
Tipo
Cadastro_alunos = Registro
RA : literal[10];
Nome : literal[30];
..
..
..
Carga_horaria : Dias_semana;
Fim_registro;
109
UNIDADE IV
Universidade Aberta do Brasil
Registro Acadêmico:
Nome:
Cidade: Estado:
CPF: Idade:
Curso:
e-mail:
110
UNIDADE IV
Algoritmos e Programação II
111
UNIDADE IV
Universidade Aberta do Brasil
112
UNIDADE IV
V
Recursividade
UNIDADE
Unidade II
OBJETIVOS DE APRENDIZAGEM
Entender como funciona a recursividade.
Siga em frente!
114
UNIDADE V
Algoritmos e Programação II
Partindo do princípio que um algoritmo cuja solução pode ser
dividida em subproblemas mais simples e, estas soluções requerem a
aplicação dele mesmo é chamado recursivo. Nesse contexto, isso significa
que quando uma rotina, função ou procedimento, chama a si mesmo, de
forma direta ou indireta, é recursiva.
Uma chamada recursiva direta é quando a rotina chama a si mesma
e, indireta se a rotina possui uma chamada a outra rotina, que por sua vez
contém uma chamada direta ou indireta à rotina que iniciou o processo
de recursão. Em chamadas indiretas, nem sempre a recursão é explícita
e às vezes pode ser difícil percebê-la por meio de uma simples leitura da
rotina.
Conforme visto, o processo de recursão ocorre em chamadas que
uma rotina faz a si mesma, porém todo programa de computador deve
ser finito. Diante disto, para garantir que uma chamada recursiva não
criará um looping infinito é necessário que ela esteja condicionada a uma
expressão lógica que, em algum instante tornar-se-á falsa ou verdadeira
(conforme o caso) e forçará que o processo de recursão encerre.
Quando se planeja um processo recursivo, deve-se dividir o
problema do seguinte modo:
• Solução trivial – dada por definição, não necessita de recursão
para ser obtida. Esta parte do problema é resolvida pelo conjunto
de comandos da rotina.
• Solução geral – parte do problema que em essência é igual ao
problema original, sendo, porém menor. A solução pode ser
obtida por uma chamada recursiva.
Exemplo: fatorial;
• solução trivial : 0! = 1 implica na condição de parada da
recursão.
• solução geral : n! = n*(n-1)!
115
UNIDADE V
Universidade Aberta do Brasil
Var Início
i, fat : inteiro; Se n = 0 então
Retorne 1;
Início senão
fat := 1; Retorne (n * Fatorial(n-1));
Para i de 1 até n incr 1 faça Fim_se;
fat := fat * i; Fim.
Fim_para;
Retorne fat;
Fim.
116
UNIDADE V
Algoritmos e Programação II
vez que uma rotina recursiva é chamada todas as variáveis locais são
recriadas. Isso significa que tantas vezes quantas chamadas ocorrerem
é o número de vezes que aquela função ou procedimento, com toda a
estrutura de dados nela existente, ocuparão espaço na memória do
computador.
Diante do que foi exposto, pode-se generalizar que o processo
recursivo é um processo de iteração, em que uma função é executada
tantas vezes quanto for necessário, até que uma estrutura condicional
interrompa o processo. Sendo assim, para tornar não recursiva uma
rotina que é recursiva, em seu código deve estar implementada alguma
estrutura de repetição.
Para testar e consolidar os seus conhecimentos sobre recursividade,
elabore as atividades a seguir.
117
UNIDADE V
118
Universidade Aberta do Brasil
UNIDADE V
Algoritmos e Programação II
Nesta unidade, você aprendeu que um processo recursivo é um processo de iteração,
em que uma função chama a si mesma e é executada tantas vezes quanto for necessário
até que uma estrutura condicional interrompa o processo. Diante disso, pode-se afirmar que
para tornar recursiva uma rotina que não é, em seu código deve estar implementada alguma
estrutura de repetição.
Foi visto também que a decisão de quando aplicar a recursão nem sempre é um
procedimento simples. Há problemas que têm solução imediata com o uso de recursão, por
outro lado, há casos que praticamente é impossível a solução de forma recursiva, mesmo
que seja um processo de iteração. É fundamental analisar o problema e verificar se realmente
vale a pena tentar encontrar uma solução recursiva.
119
UNIDADE V
Algoritmos e Programação II
PALAVRAS FINAIS
Parabéns!
121
PALAVRAS FINAIS
Universidade Aberta do Brasil
A recompensa, tanto minha como sua, será vê-lo (a) formado (a).
122
PALAVRAS FINAIS
Algoritmos e Programação II
REFERÊNCIAS
123
REFERÊNCIAS
Algoritmos e Programação II
ANEXOS
125
ANEXOS
Universidade Aberta do Brasil
UNIDADE I
Seção 3
Program Leitura_soma_vetor_reais;
Var
VALORES : array [1..10] of real;
SOMA : real;
i : integer;
Begin
SOMA := 0;
For i:= 1 to 10 do
Begin
write (ꞌEntre com o ꞌ,i,ꞌo. número:ꞌ);
read(VALORES[i]);
SOMA := SOMA + VALORES[I];
End;
readkey;
End.
126
ANEXOS
Algoritmos e Programação II
UNIDADE II
Seção 1
Program Pesquisa_Sequencial_nomes;
Var
Nomes : array [1..1000] of string[30];
Chave : string[30];
i, Ultimo, Qtde_nomes : integer;
Begin
i := 1;
Qtde_nomes := 0;
Repeat
write (ꞌEntre com o ꞌ,i,ꞌo. nome:ꞌ);
read(Nomes[i]);
If (Nomes[i] = ꞌfimꞌ) then
Ultimo := i - 1
else
Begin
i := i + 1;
Ultimo := i;
End;
Until (Nomes[i] = ꞌfimꞌ);
i := i + 1;
End;
readkey;
End.
127
ANEXOS
Universidade Aberta do Brasil
Algoritmo Pesquisa_Sequencial_nomes;
Var
Nomes : conjunto [1..1000] de literal[30];
Chave : literal[30];
i, Ultimo, Qtde_nomes : inteiro;
Inicio
i := 1;
Qtde_nomes := 0;
Repita
escreva (ꞌEntre com o ꞌ,i,ꞌo. nome:ꞌ);
leia(Nomes[i]);
Se (Nomes[i] = ꞌfimꞌ) então
Ultimo := i - 1
senão
i := i + 1;
Ultimo := i;
Fim_se;
Até que (Nomes[i] = ꞌfimꞌ);
Fim.
128
ANEXOS
Algoritmos e Programação II
Observações relativas a solução apresentada:
129
ANEXOS
Universidade Aberta do Brasil
Unidade II
Seção 2
Zenildo 10 1 .F.
Lauro 5
Xandra 8
Zenildo 9 9 .V.
Amélia 10 1 .F.
Lauro 5
Camila 2 4
Amélia 1 1 .V.
130
ANEXOS
Algoritmos e Programação II
Atividade pesquisa binária com números inteiros:
Program Pesquisa_Binaria_Numeros;
Var
Numeros : array[1..1000] of integer;
i, Primeiro, Medio, Ultimo, Chave : integer;
Achou : boolean;
Begin
i := 1;
// Entrada dos numeros
Repeat
write (ꞌEntre com o ꞌ,i,ꞌo. número: ꞌ);
read(Numeros[i]);
If (Numeros[i] < 0) then
Ultimo := i - 1
else
Begin
i := i + 1;
Ultimo := i;
End;
Until (Numeros[i] < 0);
// Saída do programa
If (Achou = TRUE) then
writeln(ꞌNúmero: ꞌ, Chave, ꞌ - encontrado ꞌ)
else
writeln(ꞌNúmero: ꞌ, Chave, ꞌ - NÃO encontradoꞌ);
readkey;
End.
131
ANEXOS
Universidade Aberta do Brasil
Seção 3
10 10
223 789 1
789 768 2
789 001 3
789 987 4
987 345 5
987 006 6
987 026 7
987 121 8
987 003 9
1 9
132
ANEXOS
Algoritmos e Programação II
Atividade método bolha com nomes:
Program Metodo_Bolha_Bubble_Sort_Nomes;
Var
Nomes: array [1..1000] of string[30];
Aux : string[30];
i, j, Ultimo : integer;
Begin
j := Ultimo;
// Rotina do Método Bolha
While(j > 1) do
Begin
For i := 1 to j-1 do
Begin
If Nomes[i] > Nomes[i+1] then
Begin
Aux := Nomes[i];
Nomes[i] := Nomes[i+1];
Nomes[i+1] := Aux;
End;
End;
j := j - 1;
End;
// Saída do programa
For i := 1 to Ultimo do
writeln(i,ꞌo. - ꞌ,Nomes[i]);
readkey;
End.
133
ANEXOS
Universidade Aberta do Brasil
Seção 4
Program Leitura_Escrita_Matriz_Nomes;
Var
linha,coluna,ult_linha,ult_coluna,flag: integer;
Matriz_Nomes: array [1..300, 1..50] of string[30];
Begin
// Leitura dos dados da matriz
flag := 0; // inicialização da variável que controla a interrupção dos laços
For linha := 1 to 300 do
Begin
If (linha > ult_linha) then
ult_linha := linha; // memoriza a ultima, maior linha já utilizada
For coluna := 1 to 50 do
Begin
write(ꞌEntre com o nome da posição [ꞌ,linha, ꞌ,ꞌ,coluna, ꞌ] : ꞌ);
readln(Matriz_Nomes[linha,coluna]);
If (coluna > ult_coluna) then
ult_coluna := coluna; // memoriza a última, maior coluna já utilizada
If ((Matriz_Nomes[linha,coluna] = ꞌfimꞌ) or
(Matriz_Nomes[linha,coluna] = ꞌFIMꞌ)) then
Begin
flag := 1; // variável marcada para a saída do laço externo;
break; // saída do laço do for interno colunas
End;
End;
If (flag = 1) then
break; // saída do laço do for externo linhas
End;
// Escrita dos dados da matriz
writeln(ꞌConteúdo da Matriz: ꞌ);
writeln;
End;
readkey;
End.
134
ANEXOS
Algoritmos e Programação II
Observações:
uso adicional de comentários explicativos em relação a outros
códigos já apresentados;
utilização de uma variável auxiliar flag.
Seção 4
135
ANEXOS
Universidade Aberta do Brasil
Program Tratamento_Matriz_trocas_linhas_colunas;
Var
i,j,aux : integer;
Matriz : array [1..5, 1..5] of integer;
Begin
// Inicialização da matriz com números ímpares
aux := 1;
For i := 1 to linhas do
For j := 1 to colunas do
Begin
Matriz[i,j] := aux;
aux := aux + 2;
End;
For i := 1 to linhas do
Begin
For j := 1 to colunas do
write(Matriz[i,j]:5);
writeln;
End;
For i := 1 to linhas do
Begin
For j := 1 to colunas do
write(Matriz[i,j]:5);
writeln;
End;
readkey;
End.
136
ANEXOS
Algoritmos e Programação II
Observação:
uso de uma variável auxiliar, aux, para inicializar a matriz e
também na troca de conteúdos entre os elementos das linhas e
colunas.
Seção 4
137
ANEXOS
Universidade Aberta do Brasil
Program Tratamento_Matriz_trocas_diagonais;
Var
i,j,k,aux : integer;
Matriz : array [1..10, 1..10] of integer;
Begin
For i := 1 to linhas do
Begin
For j := 1 to colunas do
write(Matriz[i,j]:5);
writeln;
End;
For i := 1 to linhas do
Begin
For j := 1 to colunas do
write(Matriz[i,j]:5);
writeln;
End;
readkey;
End.
138
ANEXOS
Algoritmos e Programação II
Seção 4
Program Tratamento_Matriz_trocas_linhas_colunas;
Var
i,j,aux : integer;
Matriz : array [1..10, 1..10] of integer;
Begin
For i := 1 to linhas do
Begin
For j := 1 to colunas do
write(Matriz[i,j]:5);
writeln;
End;
For i := 1 to linhas do
Begin
For j := 1 to colunas do
write(Matriz[i,j]:5);
writeln;
End;
readkey;
End.
139
ANEXOS
Universidade Aberta do Brasil
UNIDADE III
Seção 2
Program Triangulo_area_perimetro;
Var
lado_1, lado_2, lado_3, base, altura : real;
140
ANEXOS
Algoritmos e Programação II
Observação: como destaque principal dessa atividade, uso de mais
de um parâmetro em cada função.
141
ANEXOS
Universidade Aberta do Brasil
Program Funcao_leitura_menor_maior_valor_posicao_vetor_inteiros;
Var
Numeros: array [1..1000] of integer;
Ultimo, pos_menor, pos_maior: integer;
// --------------------------------------------------
Function Maior_valor(x : integer): integer;
Var
i, maior : integer;
Begin
maior := Numeros[1];
pos_maior := 1;
For i := 2 to x do
If Numeros[i] > maior then
Begin
maior := Numeros[i];
pos_maior := i;
End;
Maior_valor := maior;
End;
// --------------------------------------------------
Function Menor_valor(x : integer): integer;
Var
i, menor : integer;
Begin
menor := Numeros[1];
pos_menor := 1;
For i := 2 to x do
If Numeros[i] < menor then
Begin
menor := Numeros[i];
pos_menor := i;
End;
Menor_valor := menor;
End;
// --------------------------------------------------
Function Leitura_Vetor(): integer;
Var
i, Ult : integer;
Begin
i := 1;
Repeat
write (ꞌEntre com o ꞌ,i,ꞌo. número: ꞌ);
read(Numeros[i]);
If (Numeros[i] < 0) then
Begin
Ult := i - 1;
Leitura_Vetor := Ult;
End
else
Begin
i := i + 1;
Ult := i;
End;
Until ((Numeros[i] < 0) or (Ult = 1000));
End;
// Programa Principal--------------------------------
Begin
Ultimo := Leitura_Vetor();
writeln(ꞌMenor valor do vetor é ꞌ,Menor_valor(Ultimo),ꞌ posição ꞌ,pos_menor);
writeln(ꞌMaior valor do vetor é ꞌ,Maior_valor(Ultimo),ꞌ posição ꞌ,pos_maior);
readkey;
End.
142
ANEXOS
Algoritmos e Programação II
Observações:
Seção 3
143
ANEXOS
Universidade Aberta do Brasil
Program Leitura_menor_maior_repeticoes_vetor_inteiros;
Var
Numeros: array [1..1000] of integer;
// --------------------------------------------------
Procedure Pesquisa_valores(x : integer);
Var
i, maior, menor : integer;
rep_maior, rep_menor: integer;
Begin
maior := Numeros[1];
menor := Numeros[1];
rep_maior := 0;
rep_menor := 0;
For i := 2 to x do
Begin
If Numeros[i] > maior then
maior := Numeros[i];
If Numeros[i] < menor then
menor := Numeros[i];
End;
For i := 1 to x do
Begin
If Numeros[i] = maior then
rep_maior := rep_maior+1;
If Numeros[i] = menor then
rep_menor := rep_menor+1;;
End;
Begin
i := 1;
Repeat
write (ꞌEntre com o ꞌ,i,ꞌo. número: ꞌ);
read(Numeros[i]);
If (Numeros[i] < 0) then
Begin
Ult := i - 1;
Leitura_Vetor := Ult;
End
else
Begin
i := i + 1;
Ult := i;
End;
Until ((Numeros[i] < 0) or (Ult = 1000));
End;
// Programa Principal--------------------------------
Begin
Pesquisa_valores(Leitura_Vetor);
readkey;
End.
144
ANEXOS
Algoritmos e Programação II
Observações:
UNIDADE IV
Seção 3
145
ANEXOS
Universidade Aberta do Brasil
Program Definicao_Manipulacao_Registros;
Type
Endereco = Record
Rua : string[30];
Numero : string[5];
CEP : string[8];
Cidade : string[20];
Estado : string[2];
End;
Telefones = Record
Residencial : string[15];
Celular: string[15];
End;
Dias_semana = array[1..6] of integer ;
Cadastro_alunos = Record
RA : string[10];
Nome : string[30];
Ender : Endereco;
CPF : string[11];
Idade : integer;
Curso : string[20];
Fones : Telefones;
E_mail : string[50];
Carga_horaria : Dias_semana;
End;
Var
Aluno_graduacao, Aluno_pos_graduacao : Cadastro_alunos;
//---------------------------------------------------
Function Le_formulario() : Cadastro_alunos;
Var
Aluno : Cadastro_alunos;
i : integer;
Begin
writeln(ꞌCadastro de aluno:ꞌ);
writeln; write(ꞌRegistro Acadêmico: ꞌ); readln(Aluno.RA);
write(ꞌNome: ꞌ); readln(Aluno.Nome);
write(ꞌEndereço: ꞌ); readln(Aluno.Ender.Rua);
write(ꞌNúmero: ꞌ); readln(Aluno.Ender.Numero);
write(ꞌCEP: ꞌ); readln(Aluno.Ender.CEP);
write(ꞌCidade: ꞌ); readln(Aluno.Ender.Cidade);
write(ꞌEstado: ꞌ); readln(Aluno.Ender.Estado);
write(ꞌCPF: ꞌ); readln(Aluno.CPF);
write(ꞌIdade: ꞌ); readln(Aluno.Idade);
write(ꞌCurso: ꞌ); readln(Aluno.Curso);
write(ꞌTelefone celular: ꞌ); readln(Aluno.Fones.Celular);
write(ꞌTelefone residencial: ꞌ); readln(Aluno.Fones.Residencial);
write(ꞌe-mail: ꞌ); readln(Aluno.E_mail);
For i := 1 to 6 do
Begin
write(ꞌCarga horaria - dia : ꞌ,i,ꞌ :ꞌ); readln(Aluno.Carga_horaria[i]);
End;
writeln; Le_formulario := Aluno;
End;
//---------------------------------------------------
Procedure Exibe_formulario(Aluno : Cadastro_alunos);
Var
i : integer;
Begin
writeln(ꞌDados do aluno:ꞌ);
writeln;
writeln(ꞌRA: ꞌ, Aluno.RA, ꞌ - Nome: ꞌ, Aluno.Nome);
writeln(ꞌEndereço ꞌ, Aluno.Ender.Rua, ꞌ, ꞌ, Aluno.Ender.Numero);
writeln( Aluno.Ender.CEP, ꞌ - ꞌ, Aluno.Ender.Cidade, ꞌ - ꞌ, Aluno.Ender.Estado);
writeln(ꞌCPF: ꞌ, Aluno.CPF);
writeln(ꞌIdade: ꞌ, Aluno.Idade);
writeln(ꞌCurso: ꞌ, Aluno.Curso);
writeln(ꞌTelefone celular: ꞌ, Aluno.Fones.Celular, ꞌ - ꞌ, ꞌTelefone residencial: ꞌ,
Aluno.Fones.Residencial);
writeln(ꞌe-mail: ꞌ,Aluno.E_mail);
For i := 1 to 6 do
writeln(ꞌCarga horaria - dia : ꞌ,i,ꞌ :ꞌ,Aluno.Carga_horaria[i]);
writeln;
End;
//---------------------------------------------------
Begin
Aluno_graduacao := Le_formulario();
Exibe_formulario(Aluno_graduacao);
write(ꞌPressione qualquer tecla para continuar...ꞌ);
readkey; clrscr;
Aluno_pos_graduacao := Le_formulario();
Exibe_formulario(Aluno_pos_graduacao);
write(ꞌPressione qualquer tecla para encerrar...ꞌ);
readkey;
End.
146
ANEXOS
Algoritmos e Programação II
UNIDADE V
Program Fatorial_funcao_nao_recursiva;
Var
n : integer;
//----------------------------------------------
Function Fatorial(n:integer): integer ;
Var
i, fat : integer;
Begin
fat := 1;
For i:=1 to n do
fat := fat * i;
Fatorial := fat
End;
//----------------------------------------------
Begin
write(ꞌCálculo do fatorial, entre com o valor: ꞌ);
readln(n);
writeln(ꞌFatorial de ꞌ, n, ꞌ => ꞌ, Fatorial(n));
readkey;
End.
Program Fatorial_funcao_recursiva;
Var
n : integer;
//----------------------------------------------
Function Fatorial(n:integer): integer ;
Begin
If n = 0 then
Fatorial:= 1
else
Fatorial := (n * Fatorial(n-1));
End;
//----------------------------------------------
Begin
write(ꞌCálculo do fatorial, entre com o valor: ꞌ);
readln(n);
writeln(ꞌFatorial de ꞌ, n, ꞌ => ꞌ, Fatorial(n));
readkey;
End.
147
ANEXOS
Algoritmos e Programação II
NOTAS SOBRE O AUTOR
149
AUTOR