You are on page 1of 56

Silvoney Fernandes da Silva

Silvoneyfernandes@yahoo.com.br

ndice
1.

Variveis Compostas Homogneas......................................................................................................................3


1.1
Variveis Indexadas Uni Dimensionais(Vetores)...........................................................................................3
1.1.1
Exerccios 10:.........................................................................................................................................5
1.2
Variveis Indexadas Bidimensionais(Matrizes).............................................................................................8
1.2.1
Exerccios 11:.........................................................................................................................................9

2.

Tipo Record.........................................................................................................................................................11
2.1.1

3.

Exerccios 1 :........................................................................................................................................12

Tipos Definidos Pelo Usurio e Constantes......................................................................................................13


3.1
Tipos Definidos Pelo Usurio......................................................................................................................13
3.1.1
Exerccios 2 :........................................................................................................................................13
3.2
Constantes....................................................................................................................................................14
3.2.1
Exerccios 3 :........................................................................................................................................15

4.

Sub-Rotinas.........................................................................................................................................................17
4.1
Procedure.....................................................................................................................................................17
4.1.1
Exerccios 4 :........................................................................................................................................18
4.2
Variveis Globais e Locais...........................................................................................................................18
4.2.1
Exerccios 5 :........................................................................................................................................20

5.

Passagem de Parmetros...................................................................................................................................22
5.1.1
5.1.2

6.

Exerccios 6 :........................................................................................................................................24
Exerccios 7 :........................................................................................................................................26

Function...............................................................................................................................................................28
6.1.1

7.

Exerccios 8 :........................................................................................................................................29

Recursividade......................................................................................................................................................30
7.1.1

8.

Exerccios 8 :........................................................................................................................................31

Unit.......................................................................................................................................................................33
8.1.1

9.

Exerccios 9 :........................................................................................................................................34

Arquivos...............................................................................................................................................................35
9.1
Arquivos FILE..............................................................................................................................................35
9.1.1
Exerccios 10 :......................................................................................................................................41
9.2

Arquivos TEXT.............................................................................................................................................42

9.3
Sub-Rotinas para Tratamento de Arquivos TEXT........................................................................................42
9.3.1
Exerccios 11 :......................................................................................................................................45
10.

Alocao Dinmica.........................................................................................................................................46

10.1

Introduo....................................................................................................................................................46

10.2

Definio de Pointers..................................................................................................................................46

10.3

Rotinas para Alocao de Memria:...........................................................................................................47

10.4 Atribuio de Valores...................................................................................................................................48


10.4.1 Exerccios:............................................................................................................................................49
1

11.

Lista Simplesmente Encadeada.....................................................................................................................50

11.1

Definio......................................................................................................................................................50

11.2 Criando Listas na Memria.........................................................................................................................50


11.2.1
Exerccios:............................................................................................................................................54
12.

Lista Duplamente Encadeada........................................................................................................................56


12.1.1

Exerccios:............................................................................................................................................58

1.

Variveis Compostas Homogneas

Vimos, no incio deste curso, ser possvel dar um Nome para uma posio de memria , sendo que a esta
ser associado um valor qualquer . Pois bem, acontece que, muitas vezes, esta forma de definio, ou melhor
dizendo, de alocao de memria , no suficiente para resolver certos problemas computacionais. Imagine por
Exemplo, como faramos para construir um algoritmo, para ler o Nome de N Pessoas e que imprimisse um
relatrio destes mesmos nomes, mas ordenados alfabeticamente? No seria uma tarefa simples, haja visto no ser
possvel determinar quantos nomes seriam lidos, mesmo que soubssemos o nmero de pessoas, digamos 1.000
pessoas, teramos que definir 1.000 variveis do tipo STRING, como mostrado abaixo:
ALGORITMO Loucura;
VARIVEIS
Nome1,
Nome2,
Nome3,

.
.
.
Nome999,
Nome1000: CADEIA
INICIO

<Comandos>
FIM
Considere o tamanho do algoritmo, e o trabalho braal necessrio para construi -lo. Isto s com 1.000
Nome, imagine agora 1.000.000 de pessoas. A construo deste algoritmo comearia a ficar invivel na pratica .
Para resolver problemas como este, e outros, foi criado um novo conceito para alocao de memria sendo, desta
forma, tambm criado uma nova maneira de definir variveis, a qual foi denominada de varivel indexada .
Uma varivel indexada corresponde a uma seqncia de posies de memria , a qual daremos nico
Nome, sendo que cada uma destas pode ser acessada atravs do que conhecemos por ndice. O ndice corresponde
a um valor numrico ( exceto REAL ), ou a um valor caracter ( exceto STRING ). Cada uma das posies de
memria de uma varivel indexada pode receber valores no decorrer do algoritmo como se fosse uma varivel
comum, a nica diferena reside na Sintaxe de utilizao desta varivel.

1.1

Variveis Indexadas Uni Dimensionais(Vetores)

Tambm conhecida por Vetor. Uma varivel uni -dimencional , como o prprio Nome j indica, possui
apenas uma dimenso, sendo ser possvel definir variveis com quaisquer tipo de dados validos do Pascal.
a) Definio:

ALGORITMO Define
VARIVEIS
<Nome>: VETOR [INICIOV : FIMV] DE <tipo>
INICIO
<Comandos>
FIM

Em pascal:
PROGRAM Define;
VAR
<Nome>: ARRAY [INICIO ..FIM] OF <tipo>;
BEGIN
<Comandos>;
END.
3

Obs.:
a) ARRAY uma palavra reservada do Pascal
b) Os valores INICIOV e FIMV correspondem aos ndices inicial e final
c) Uma varivel indexada pode ser apenas de um tipo de dado
Exemplo Definir uma varivel indexada como sendo do tipo REAL, sendo que a mesma dever corresponder a 10
posies de memria .
ALGORITMO Exemplo
VARIVEIS
Vet : VETOR [1 : 10] OF REAL
INICIO
<Comandos>
FIM

Em pascal:
PROGRAM Exemplo;
VAR
Vet: ARRAY [1..10] OF REAL;
BEGIN
<Comandos>;
END.
No Exemplo acima, aps a definio da varivel, a memria estar como mostrado no esquema abaixo:
Vet
1

Os Valores numricos apresentados acima correspondem aos ndices da varivel.


B) Atribuio
<Nome>[<ndice>] Valor;
LEIA (<Nome>[<ndice>]);

Em pascal:
<Nome>[<ndice>]: =Valor;
READ (<Nome>[<ndice>]);
Exemplo:

ALGORITMO Atribui
VARIVEIS
Nomes : VETOR [1 : 20] DE CADEIA
i
: INTEIRO
BEGIN
Nomes[1] Joo da Silva
PARA i 2 ATE 20, PASSO 1, FACA
LEIA(Nomes[i])

FIM PARA
FIM

Em pascal:
PROGRAM Atribui;
VAR
Nomes : ARRAY[1..20]OF STRING;
i
: INTEGER;
BEGIN
Nomes[1]: =Joo da Silva;
FOR i: = 2 TO 20 DO
READ(Nomes[i]);
END.

10

1.1.1 Exerccios 10:


1) Faa um algoritmo que leia, via teclado, 200 valores do tipo inteiro e os guarde na memria.
2) Amplie o exerccio anterior emitindo um relatrio com todos os nmeros pares que voc leu.
3) Faa um algoritmo que determine qual o menor valor existente no vetor do exerccio nmero 1.
4) Faa um algoritmo que determine qual o maior valor existente no vetor do exerccio nmero 1.
5) Faa um algoritmo que imprima quantos dos valores do exerccio nmero 1 so maiores que a mdia desses
valores.
6) Faa um algoritmo que leia 10 nomes e os guarde na memria.
7) Amplie o exerccio 6 imprimindo o menor Nome do vetor
8) Amplie o exerccio 6 imprimindo o maior Nome do vetor
9) Faa um algoritmo que leia 20 palavras, e aps a leitura, realiza um processo qualquer que inverta os caracteres
de cada uma das palavras.
10) Faa um algoritmo que leia 10 nomes e os guarde na memria. Aps a leitura, emita um relatrio com todos os
nomes que so palindromes. Uma palavra palindrome aquela que a sua leitura a mesma da esquerda para a
direita e vice versa. Exemplo: ARARA, ANA, etc.
11) Faa um algoritmo que leia, Nome idade e sexo de N pessoas. Aps a leitura faa:
a) Imprima o Nome, idade e sexo das pessoas cuja idade seja maior que a idade da primeira pessoa.
b) Imprima o Nome e idade de todas as mulheres.
c) Imprima o Nome dos homens menores de 21 anos.
12) Faa uma algoritmo para ler 20 valores e que imprima os que so maiores que a mdia dos valores.
13) Faa um algoritmo que leia Nome e notas ( total de 12 ) de um conjunto indeterminado de alunos de um
colgio. Aps a leitura faa:
a) Imprima o Nome e a mdia dos alunos aprovados ( Mdia >= 7.0 ).
b) Imprima o Nome e a mdia dos alunos em Recuperao ( 5.0 >= Mdia < 7.0 ).
c) Imprima o Nome e a mdia dos alunos reprovados ( Mdia < 5.0 ).
d) Imprima o percentual de alunos aprovados.
e) Imprima o percentual de alunos reprovados.
14) Dado Nome e salrio de 10 funcionrios faa:
a) Imprima o Nome e o salrio dos funcionrios que ganham mais de R$ 500,00
b) Para os funcionrios que ganham menos de R$ 200,00 conceda um aumento de 20%. Imprima Nome e o novo
salrio destes funcionrios aumentados
15) Um teste composto por 10 questes foi proposto numa classe de n alunos. Cada
questo admite as alternativas identificadas pelas letras A, B, C, D e E. Para cada aluno tem-se o registro contendo
o seu nome e as suas respostas. Sendo dado o gabarito das questes faa um algoritmo que:
a) Escreva uma relao contendo o nome e o nmero de acertos de cada aluno;
b) Determine quantos alunos acertaram as questes 1 e 2 e tiveram 7 acertos;
c) Escreva o nome do aluno, que obteve a melhor nota e pior nota;
16) Faa um algoritmo para ler 50 valores inteiros. Aps imprima tais valores ordenados crescentemente.
17) Continuando o exerccio anterior, emita um relatrio com os valores ordenados decrescentemente.
18) Faa um algoritmo que leia 10 valores numricos inteiros. Aps a leitura emita um relatrio com cada valor
diferente e o nmero de vezes que o mesmo apareceu no vetor.
19) Dado uma ralao de N nomes, faa um algoritmo que verifique se uma determinada pessoa est neste vetor. O
Nome da pessoa a ser pesquisada dever ser lido, bem como os nomes a serem colocados no vetor.
20 Dado uma frase, faa um algoritmo que determine qual a consoante mais utilizada.

21) Faa um algoritmo que leia N letras e armazene cada uma em uma posio de memria. Coloque no vetor,
aps a ltima letra lida, o caracter $, indicando final dos caracteres
22) Faa um algoritmo que:
a) Leia um vetor com N elementos formado por valores do tipo inteiro.
b) Aps a leitura, modifique o vetor de forma que o mesmo contenha na parte superior somente valores
pares, e na parte inferior os valores impares.
c) Ordene crescentemente os nmeros pares, e decrescentemente os nmeros impares.
23) Dado um conjunto de n registros, cada registro contendo o nome e a idade dessa pessoa faa um algoritmo que:
a) Guarde todos os dados na memria;
b) Escreva o nome das pessoas que tem idade maior que a idade da primeira;
c) Listar os nomes das pessoas que tem a idade maior que a mdia;
d) Listar o nome da pessoa de maior e menor idade
24) Dado que para cada aluno de uma turma de N alunos se tenha, o seu nome, e as notas das 8 avaliaes. Faa
um algoritmo que:
Imprima o nome a mdia de cada aluno;
a) Calcule a Percentagem de alunos cujo o nome comece com a letra A;
b) Para cada aluno imprima uma mensagem dizendo se o aluno tem ou no notas repetidas;
c) Determine quantos alunos tem pelo menos duas notas acima de 7;
25) Dado um verto X de n elementos faa um algoritmo que:
a) Crie outro vetor Y contendo os elementos de x que esto na faixa entre 10 e 40;
b) Crie outro vetor W contendo os nmeros que esto nas posies pares;
c) Pesquise a existncia de um determinado elemento Z no vetor X;
d) Escreva o menor e maior elemento do vetor X;
26) Em uma cidade do interior, sabe-se que, de janeiro a abril de 1976 (121 dias), no ocorreu temperatura
inferior a 15o C nem superior a 40 o C. As temperatura verificadas em cada dia esto disponveis em uma unidade
de entrada de dados.
Fazer um algoritmo que calcule e escreva:
a) a menor temperatura ocorrida;
b) a maior temperatura ocorrida;
c) a temperatura mdia
d) o nmero de dias nos quais a temperatura foi inferior a mdia temperatura mdia.
27) Fazer um algoritmo que:
a) leia o valor de n (n <= 1000) e os n valores de um varivel indexada A de valores inteiros ordenados de
forma crescente;
b) determine e escreva, para cada nmero que se repete no conjunto, a quantidade de vezes em que ele
aparece repetido;
c) elimine os elementos repetidos, formando um novo conjunto;
d) escreva o conjunto obtido no item c;
28) Um armazm trabalha com 100 mercadorias diferentes identificadas pelos nmeros inteiros de 1 a 100. O dono
do armazm anota a quantidade de cada mercadoria vendida durante o ms. Ele tem uma tabela que indica, para
cada mercadoria, o preo de venda. Escreva um algoritmo para calcular o faturamento mensal do armazm. A
tabela de preos fornecida seguida pelos nmeros das mercadorias e as quantidades vendidas. Quando uma
mercadoria no tiver nenhuma venda, informado o valor zero no lugar da quantidade.
29) Uma grande firma deseja saber quais os trs empregados mais recentes. Fazer um algoritmo para ler um
nmero indeterminado de informaes (mximo de 300) contendo o nmero do empregado e o nmero de meses
de trabalho deste empregado e escrever os trs mais recentes.
Observaes: A ltima informao contm os dois nmeros iguais a zero. No existem dois empregados
admitidos no mesmo ms.
Exemplo:
EMPREGADOS
224
1731
2210
4631

526
1
2
3
4
300
MESES
17
1

3
2

9
3

2
4
6

10
300

Empregado mais recente: 4631.


30) Fazer um algoritmo que:
a) leia uma varivel indexada A com 30 valores reais;
b) leia uma outra varivel indexada B com 30 valores reais;
c) leia o valor de uma varivel X;
d) verifique qual o elemento de A igual a X;
e) escreva o elemento de B de posio correspondente do elemento A igual a X;
31) Fazer um programa que:
a) leia o valor de M (M<=30) e os valores de uma varivel indexada A;
b) leia o valor de N (N<=20) e os valores de uma varivel indexada B;
c) determine o conjunto C = A B (unio de A com B), onde C no dever conter elementos repetidos (A
e B no contm elementos repetidos);
d) escreva os elementos contidos em A, B e C;
32) Intercalao o processo utilizado para construir uma tabela ordenada, de tamanho n +m, a partir de duas
tabelas j ordenadas de tamanhos n e m. Por exemplo, a partir das tabelas:
A=

B=

e
construmos a tabela
C=

Fazer um algoritmo que:


a) leia NA, nmero de elementos do conjunto A (NA<=100);
b) leia, em seguida, os elementos do conjunto A;
c) leia, logo aps o valor de NB, nmero de elementos do conjunto B (NB<=100);
d) leia, finalmente, os elementos do conjunto B;
e) crie e imprima um conjunto C, ordenado, de tamanho NA+NB, a partir dos conjuntos originais A e B.
Observao:
1. Considerar os elementos de A e B como inteiros.
33) Para cada nota de compra , tem-se o Nome do produto comprado, o valor e o imposto. Faa um algoritmo que
escreva Nome, valor e imposto de cada produto. Bem como o valor total bruto, o imposto total cobrado e o valor
total lquido de todas as notas. Considere 500 notas
34) Uma empresa deseja fazer um levantamento do seu estoque. Para isto possui para cada tipo de produto, o seu
Nome, o valor unitrio e a sua quantidade em estoque. A empresa deseja emitir um relatrio contendo, o Nome,
quantidade, valor, unitrio e o saldo ( valor total ) em estoque de cada tipo de produto. Ao final deseja-se saber
quantos tipos de produtos existem em estoque e o saldo de todos os produtos.
38) Faa um algoritmo para ler um vetor X de tamanho N de nmeros inteiro. Aps a leitura classifique os
nmeros, colocando em um vetor P somente os nmeros pares e em um vetor I os impares. Aps isso liste os trs
vetores.

1.2

Variveis Indexadas Bidimensionais(Matrizes)

Tambm conhecida por Matriz. Uma varivel Bidimencional , como o prprio Nome j indica, possui
duas dimenses, sendo ser possvel definir variveis com quaisquer tipo de dados validos do Pascal.

A=

a11
a21
a31

a12
a22
a33

Matriz A 3x2 (Linha x Coluna)


7

a) Definio:
ALGORITMO Define
VARIVEIS
<Nome>: MATRIZ [I : J, L:M] DE <tipo>
INICIO
<Comandos>
FIM

Em pascal:
PROGRAM Define;
VAR
<Nome>: ARRAY [I..J, L..M] OF <tipo>;
BEGIN
<Comandos>;
END.
Exemplo Definir uma varivel indexada bidemensional para armazenar os dados de uma matriz 4 por 4 de
nmeros do tipo REAL, sendo que a mesma dever corresponder no total a 16 posies de memria.

Em pascal:

ALGORITMO Exemplo;
VARIVEIS
MAT : MATRIZ [1:4,1:4] DE REAL
INICIO
<Comandos>
FIM
PROGRAM Exemplo;
VAR
MAT: ARRAY [1..4,1..4] OF REAL;
BEGIN
<Comandos>;
END.

No Exemplo acima, aps a definio da varivel, a memria estar como mostrado no esquema abaixo:
MAT

1,1
2,1
3,1
4,1

1,2
2,2
3,2
4,2

1,3
2,3
3,3
4,3

1,4
2,4
3,4
4,4

Os Valores numricos apresentados acima correspondem aos ndices da varivel.


B) Atribuio
<Nome>[<ndice>,<ndice>] Valor;
LEIA (<Nome>[<ndice>,<ndice>]);

Em pascal:
<Nome>[<ndice>,<ndice>]: =Valor;
READ (<Nome>[<ndice>,<ndice>]);
Exemplo:

ALGORITMO Atribui
VARIVEIS
Nomes : VETOR [1:4,1:4] DE CADEIA
I,J
: INTEIRO
BEGIN
PARA I 1 ATE 4, PASSO 1, FACA
PARA J 1 ATE 4, PASSO 1, FACA
8

LEIA (Nomes [ I , J] )
FIM PARA
FIM PARA
FIM

Em pascal:

PROGRAM Atribui;
VAR
Nomes : ARRAY[1..4,1..4] OF STRING;
I,J
: INTEGER;
BEGIN
FOR I: = 1 TO 4 DO
FOR := J := 1 TO 4 DO
READ (Nomes[ I,J] );
END.

1.2.1 Exerccios 11:


1) Faa um algoritmo para ler e imprimir uma matriz 2x4 de nmeros inteiros.
2) Dado uma matriz de ordem 3x3 faa um algoritmo que:
a) Calcule a soma dos elementos da primeira coluna;
b) Calcule o produto dos elementos da primeira linha;
c) Calcule a soma de todos os elementos da matriz;
d) Calcule a soma do diagonal principal;
e) Soma da diagonal secundria;
3) Dado uma matriz de ordem NxN faa um algoritmo que verifique se a matriz simtrica (aij=aji).
4) Dado uma matriz NxM de valores reais faa um algoritmo que faa a leitura destes valores e ao final da leitura
de todos, imprimir o seguintes relatrio:
a) Qual a Soma dos valores de cada coluna da matriz;
b) Listar os valores que so menores que a mdia dos valores;
c) Qual a soma dos elementos da diagonal secundria;
5) Dado uma matriz NxM de valores inteiros faca um algoritmo que faa a leitura destes valores e ao final coloque
os elementos ordenados primeiro pela linha e depois pela coluna.
6) Dado duas matrizes A e B de ordem NxN faca um algoritmo que some as duas e gere a matriz C. Os elementos
da matriz C so a soma dos respectivos elementos de A e B.
7) Dado uma matriz NxM de valores inteiros determine a sua matriz transposta e imprima.
8) Fazer um algoritmo que efetue um produto matricial. Seja A(m x n) e B (n x m) as matrizes fatores, sendo
m<=40 e n<=70. Devero ser impressas as matrizes A, B e a matriz-produto obtida.
9) Escrever um algoritmo que leia uma matrix N x N multiplique os elementos da diagonal principal por uma
varivel K, tambm linda, e escreva a matriz resultante.
10) Dado uma matriz N x M elementos, calcular a soma de cada linha e a soma de todos os elementos.
A fim de ilustrar este problema, pode-se considerar o seguinte esquema:
Mat
1
4

2
5

Somalinha
6
15

3
6
Total

21

2.
I, so :

Tipo Record
Os tipos de dados que so mais comumente usados, e que foram vistos com maior nfase em programao
1.
2.
3.
4.
5.
6.
7.
8.

WORD
INTEGER
REAL
BYTE
STRING
CHAR
ARRAY
BOOLEAN

Uma outra forma de definir uma varivel em Pascal, atravs do tipo RECORD. Esse tipo diferente das
demais formas de definir variveis, porque permite que uma varivel armazene valores de diversos tipos
diferentes.
Exemplo: Imagine que fosse desejado armazenar informaes de uma pessoa, tais como: Nome, Idade,
Altura, Sexo, Nmero de Dependentes, Profisso.
Na forma tradicional, seria necessrio definir uma varivel para cada tipo de informao, ou seja:
VAR
Nome
Idade
Altura
Sexo
NumDep
Profisso

: STRING;
: BYTE;
: REAL;
: CHAR;
: BYTE;
: STRING;

Utilizando o tipo RECORD, a definio seria a seguinte:


VAR
Pessoa

: RECORD
Nome
Idade
Altura
Sexo
NumDep
Profisso
END;

: STRING;
: BYTE;
: REAL;
: CHAR;
: BYTE;
: STRING;

Ao definir uma varivel como sendo do tipo RECORD, devemos definir, tambm quais sero as partes
componentes desta varivel(Nome, Idade, Altura , Sexo, NumDep e Profisso), junto com o seu tipo. Quando
estamos trabalhando com RECORD, as partes componentes do mesmo recebem um Nome prprio, o qual
conhecido como campo . Desta forma, uma varivel RECORD pode ter campos de qualquer tipo vlido do
Pascal, sendo permitido inclusive que um RECORD seja definido dentro do outro, ou como parte de um ARRAY.
Continuando o Exemplo, caso desejarmos atribuir um valor a varivel
seguinte forma:
Algoritmo

Pessoa, devemos faz-lo da

Pessoa.idade 45

Pascal
Pessoa.idade : = 45
O uso do . indica que esta varivel possui campos, e que Idade um deles. importante lembrar que
as operaes realizadas sobre uma varivel RECORD, so as mesmas de uma varivel comum, a nica diferena
que devemos indicar o Nome da varivel, seguido de um ponto(.), seguido do Nome do campo.
10

possvel atribuir o contedo de uma varivel RECORD para outra varivel, de mesmo tipo, da mesma
forma que feito como as outras variveis do Pascal.
Exemplo: Caso duas variveis, digamos A e B sejam definidas como sendo RECORDs, e caso seja desejado passar
o contedo, isto os valores existentes nos campos, a varivel A para a varivel B, bastar realizar a seguinte
atribuio:
Algoritmo
AB
Pascal
A: =B

2.1.1 Exerccios 1 :
1. Definir um RECORD tendo os seguintes campos: Nome, Semestre, Sala, Curso, Notas(total de seis)
2. Faa um algoritmo para ler as informaes, descritas acima
3. Ampliar a definio anterior, acrescentando a definio de um outro campo(Endereo) que ser tambm um
RECORD, o qual ter os seguintes campos: Rua, Bairro, Cidade, Estado, CEP
4. Faa um algoritmo para ler as informaes de um aluno, junto com o endereo descrito acima
5. Defina um ARRAY de alunos, os campos sero os mesmos descritos nos itens anteriores
6. Faa um algoritmo para ler as informaes de n alunos
7. Ordene crescentemente pelo Nome, os alunos

11

3.

Tipos Definidos Pelo Usurio e Constantes

3.1

Tipos Definidos Pelo Usurio

O Pascal possui vrios tipos pr-definidos, como INTEGER, WORD, REAL etc, mas alm destes tipos
bsicos, existe a possibilidade de o usurio definir seus prprios tipos de dados. Para isto, necessrio o uso da
palavra reservada TYPE, a qual indica que um novo tipo ser criado.
Exemplo: Imagine que seja desejado criar um tipo matriz 4X4, sendo que logo em seguida este novo tipo
ser usado para definir uma varivel como sendo deste tipo. P ara isto dever ser usada a seguinte definio:
TYPE
VAR

Matriz = ARRAY[1..4,1..4] OF INTEGER


Mat

: Matriz

O Pascal permite a definio de tipos usando qualquer um dos tipos pr-definidos, ou at mesmo
utilizando tipos definidos pelo usurio

3.1.1 Exerccios 2 :
1. Usando a definio para aluno apresentada no exerccio da seco anterior, crie um tipo de dado para alunos e
em seguida defina uma varivel como sendo um ARRAY deste tipo. A ttulo de ilustrao, defina o RECORD do
campo endereo, como sendo tambm um tipo
2. Defina um tipo de dado chamado funcionrio, o qual dever ter o seguinte layout:
Nome
Endereo:
Rua
Nmero
Bairro
Cidade
Estado
CEP
Profisso:
Cargo:
Salrio:

Departamento
Funo
Bruto
Desconto(percentual)
Salrio Famlia(Somente para filhos de 18 anos)

Dependentes:
Nmero
Descrio(Uma para cada dependente):
Nome
Idade
Se filho ou no

3. Dado a definio acima, faa um algoritmo para:


Ler as informaes de n funcionrios
Ordenar crescentemente os nomes dos Funcionrios
Emitir um relatrio com o salrio lquido de cada funcionrio, onde dever ser impresso somente o
Nome do funcionrio e seu salrio.
Emitir um relatrio dos funcionrios que trabalhem na contabilidade e que tenham mais de dois filhos
menores de 18 anos
12

Emitir um relatrio com o Nome do funcionrio e o seu salrio bruto


4. Uma empresa compra uma srie de produtos de diversos fabricantes, e precisa que sejam emitidos os seguintes
relatrios:
Qual o produto que possui a maior quantidade em estoque, e qual o que tem a menor quantidade
Qual o produto mais caro e o mais barato
Quais so os produtos pertencentes ao fabricante XYZ
Quais os produtos que so de cor Azul
Listagens de todos os produtos em estoque com todas as informaes existentes sobre cada um dos
produtos.

3.2

Constantes

Uma constante uma posio de memria que possui um valor fixo, constante, durante toda a existncia
do programa. A sua utilizao possibilita uma maior clareza do cdigo, tornando a tarefa de manuteno ou
entendimento do programa muito mais simples.
Exemplo:
Algoritmo

SE Tecla = CHR(24) ENTAO


<executa comandos>
FIM SE

Pascal
IF Tecla = CHR(24) THEN
BEGIN
<executa comandos>;
END;
O pedao de cdigo mostrado acima seria mais legvel se , ao invs da utilizao da Funo CHR(24),
fosse utilizado uma constante. Desta forma , o programa alterado ficaria como mostrado abaixo:
Algoritmo
SE Tecla = SetaParaBaixo ENTAO
<executa comandos>
FIMSE
Pascal

IF Tecla = SetaParaBaixo THEN


BEGIN
<executa comandos>;
END;
A forma de se declarar uma constante atravs do uso da palavra reservada CONST.
Exemplo: Declarar uma constante que representa o valor da seta para baixo, do teclado do PC.

Algoritmo

Pascal

CONSTANTE
SetaParaBaixo=CHR(24)
INICIO
<Comandos>
FIM

CONST
BEGIN
END

SetaParaBaixo=CHR(24)
<Comandos>;

13

Um outro uso muito til de constantes o de definir o tamanho de um ARRAY (VETOR) e o escopo dos
laos de repetio, como FOR DO (PARA FAA0 , WHILE DO (ENQUANTO FAA) e REPEAT UNTIL
(REPITA AT).
Algoritmo

Pascal

ALGORITMO Teste
CONSTATE
TotalLinhas = 10
TotalColunas = 20
TIPO
matriz = VETOR[ 1..totallinhas, 1..totalcolunas] DE INTEIRO
VARIAVEIS
Mat
: matriz;
lin,col : BYTE;
INICIO
PARA lin DE 1 ATE totallinhas FAA
PARA col DE 1 ATE totalcolunas FAA
LEIA(Mat[lin,col])
FIM PARA
FIM PARA
FIM
PROGRAM Teste;
CONST
TotalLinhas = 10;
TotalColunas = 20;
TYPE
matriz = ARRAY[ 1..totallinhas, 1 ..totalcolunas] OF INTEGER;
VAR
BEGIN

END.

Mat
: matriz;
lin,col : BYTE;
FOR lin : = 1 TO totallinhas DO
BEGIN
FOR col: = 1 TO totalcolunas DO
BEGIN
READ(mat[lin,col]);
END;
END;

3.2.1 Exerccios 3 :
1. Faa um algoritmo para definir constantes representando os cdigos das teclas como HOME, END, ESC etc do
teclado do PC.
2. Faa um algoritmo para declarar constantes que representem as seqncias de caracteres necessrios para
programar uma impressora de modo a imprimir diversas qualidades como expandido, qualidade carta ,
condensado, etc. Para isto ser necessrio o uso do manual de sua impressora , na parte relacionada a
programao de impressora.
3. Faa um programa para definir constantes que representem as diversas cores/tonalidades que o vdeo do PC
possa operar em modo texto, tanto para cor de fundo(bakcground) , como para cor das letras(foreground).
4. Faa um algoritmo que defina constantes para construo de molduras. Uma moldura uma rea retangular
cercada por caracteres especficos da tabela ASCII. As molduras podem ser por Exemplo, simples , duplas,
sombreadas, etc. A tabela ASCII tem uma boa variedade de caracteres especficos para este fim, s depende da
imaginao de cada um.

14

4.

Sub-Rotinas

Um matemtico uma vez disse que um grande problema se resolve dividindo-o em pequenas partes e
resolvendo tais partes em separado. Estes dizeres servem tambm para a construo de programas. Os
profissionais de informtica quando necessitam construir um grande sistema, o fazem, dividindo tal programa em
partes, sendo ento desenvolvido cada parte em separado, mais tarde, tais partes sero acopladas para formar o
sistema. Estas partes so conhecidas por vrios nomes. Ns adotaremos uma destas nomenclaturas: sub-Rotinas.
Podemos dar um conceito simples de sub-Rotina dizendo ser um pedao de cdigo computacional que
executa uma Funo bem definida, sendo que esta sub-Rotina pode ser utilizadas vrias vezes no algoritmo.
Neste curso iremos tratar de dois tipos de sub-Rotinas: PROCEDURE e FUNCTION.

4.1

Procedure

Sintaxe:
Algoritmo
PROCEDURE <Nome> [(parmetros)]
<definies>
INICIO
<comandos>
FIM
Pascal

PROCEDURE <Nome> [(parmetros)]


<definies>
BEGIN
<comandos>;
END;

Uma PROCEDURE, um tipo de sub-Rotina que ativada atravs da colocao de seu Nome em
alguma parte do programa. Desta forma, assim que o Nome de uma PROCEDURE encontrado, ocorre um
desvio no programa, para que os comandos da sub-Rotina sejam executados. Ao trmino da sub-Rotina, a execuo
retornar ao ponto subsequente a chamada da Pocedure.
Exemplo:
Algoritmo

ALGORITMO Teste
VARIAVEIS
Nmero, N : BYTE
PROCEDURE EscreveNoVideo
INICIO
PARA Nmero DE 1 ATE N FACA
ESCREVA (Nmero)
FIM PARA
FIM
INICIO

LEIA(N)
EscreveNoVideo
ESCREVA (fim)

FIM
Pascal
PROGRAM Teste;
VAR
15

Nmero, N : BYTE;
PROCEDURE EscreveNoVideo;
BEGIN
FOR Nmero : = 1 TO n DO
BEGIN
WRITE(Nmero);
END;
END;
BEGIN

READ(N);
EscreveNoVideo;
WRITE(fim);

END.

4.1.1 Exerccios 4 :
1. Construa uma sub-Rotina para ler uma matriz NXM DO tipo INTEGER. Os valores N e M devero ser lidos.
2. Faa uma sub-Rotina para ler um vetor A de N elementos, e um vetor B de M elementos. Os valores M e N
devero ser lidos.
3. Faa um algoritmo para ler as informaes de N alunos, tais como: Nome, idade e sexo. Aps construa subRotina para: a - Emitir um relatrio ordenado crescentemente pelo Nome; b - Emitir um relatrio ordenado
decrescentemente pela idade; c - Informar qual o percentual de alunos do sexo feminino.
4. Faa uma PROCEDURE para desenhar uma moldura no vdeo.

4.2

Variveis Globais e Locais

Damos o Nome de variveis globais para aquelas variveis que so definidas logo aps o comando VAR
do programa principal, sendo desta forma visveis em qualquer parte do programa.
Exemplo:
Algoritmo

ALGORITMO Teste
VARIAVEIS
Nome : STRING[80]

{varivel global}

PROCEDURE Setanome
INICIO
LEIA (Nome)
FIM
INICIO
FIM

Setanome
ESCREVA (Nome)

Pascal
PROGRAM Teste;
VAR
Nome : STRING[80];
PROCEDURE Setanome;
BEGIN
READ(Nome);
END;
BEGIN
END

(varivel global)

Setanome;
WRITE(Nome);

No Exemplo acima, a varivel Nome , por ser definida como global, pode ser manipulada dentro de
qualquer ponto do programa, sendo que qualquer mudana no seu contedo, ser visvel nas demais partes da
Rotina.
16

Damos o Nome de variveis locais s variveis que so declaradas dentro de uma sub-Rotina, sendo que
as mesmas s podem ser manipuladas dentro da sub-Rotina que as declarou, no sendo visveis em nenhuma
outra parte do programa.
Exemplo:
Algoritmo

ALGORITMO Teste
PROCEDURE EscreveNoVdeo
VARIAVEIS
Nmero, N : INTEIRO
INICIO
LEIA (N)
PARA nmero DE 1 ATE N FACA
ESCREVA (Nmero)
FIM PARA
FIM
INICIO

EscreveNoVdeo

FIM
Pascal

PROGRAM Teste;
PROCEDURE EscreveNoVdeo;
VAR
Nmero, N : INTEGER;
BEGIN
READ(N);
FOR nmero : = 1 TO N DO
BEGIN
WRITE(Nmero);
END;
END;
BEGIN
END;

EscreveNoVdeo;

Obs: possvel definir variveis globais e locais com o mesmo Nome, sendo qualquer mudana no contedo da
varivel local no afetar o contedo da varivel global.
Exemplo:
Algoritmo
ALGORITMO Teste
VARIAVEL
Nome : STRING
PROCEDURE Setanome
INICIO
LEIA (Nome)
FIM
PROCEDURE Mudana
VARIAVEIS
Nome : STRING
INICIO
LEIA (Nome)
FIM
INICIO

FIM

Setanome
ESCREVA (Nome)
mudana
ESCREVA (Nome)
17

Pascal

PROGRAM Teste;
VAR
Nome : STRING;
PROCEDURE Setanome;
BEGIN
READ(Nome);
END;
PROCEDURE Mudana;
VAR
Nome : STRING;
BEGIN
READ(Nome);
END;
BEGIN
Setanome;
WRITE(Nome);
mudana;
WRITE(Nome);
END;

No Exemplo acima, a varivel global Nome e a varivel local Nome representam posies de
memria totalmente diferentes, logo, qualquer mudana no contedo da varivel local, no afetar o contedo da
varivel global.

4.2.1 Exerccios 5 :
1 - Faa uma PROCEDURE para calcular A elevado a um expoente B.
2 - Faa uma PROCEDURE para calcular o fatorial de um nmero X qualquer.
3 - Faa um algoritmo para calcular a seguinte expresso matemtica:

Y 1

X 2 2 X 3 3X 4 4 X 5 5X 6
nX ( n 1)

...
2!
3!
4!
5!
6!
(n 1)!

4 - Faa uma PROCEDURE que informe se uma STRING qualquer palndrome.


5 - Faa um algoritmo que leia um vetor de nmeros inteiros. Aps, emita um relatrio com cada nmero
diferente, e o nmero de vezes que o mesmo apareceu repetido no vetor.
6 - Faa um algoritmo para:
Ler as informaes de n pessoas : Nome, Idade, sexo, altura, peso e endereo(Rua, Nmero, Bairro,
Cidade, Estado), armazenando-as em um vetor. O valor n dever ser lido.
Alterar o vetor de tal forma que na parte superior, sejam colocados, em ordem crescente, as pessoas
cujas idades sejam pares e na parte inferior, sejam colocadas, em ordem decrescente, as pessoas cujas
idades sejam mpares.
Obs: O algoritmo deve prever a possibilidade de no vetor , no existirem nmeros pares ou ento, no existirem
nmeros mpares.

18

5.

Passagem de Parmetros

At agora vimos que para ativar uma sub-Rotina bastaria colocar o seu Nome em alguma parte do
programa. Mas isto nem sempre significa que o trabalho de escrever o programa ir diminuir. Com o que vimos at
agora , dependendo da tarefa a ser realizada pela sub-Rotina, o trabalho de um programador pode at ser bem
complicado. Por Exemplo, como faramos para ler 5 vetores, todos com tamanhos diferentes? Poderamos , por
Exemplo, criar 5 sub-Rotinas, uma para cada vetor a ser lido. Isto sem dvida resolveria esta situao, mas, e se
fossem 100 vetores?, ou 1000? Seria realmente uma tarefa muito trabalhosa ter de escrever 100, ou 1000 subRotinas, isto s para ler os vetores, imagine se tivssemos tambm que orden-los, ou realizar outro processo
qualquer. Com toda esta dificuldade, o uso das sub-Rotinas deveria ser considerado. Como j foi dito, as subRotinas foram criadas para serem genricas o bastante para se adaptarem a qualquer situao, visando justamente
a possibilidade de reutilizao do cdigo. Para realizar esta mgica, foi criado o conceito de passagem de
parmetros, ou seja, passar informaes para serem tratadas dentro da Sub-Rotina.
Sintaxe:
Algoritmo
PROCEDURE <Nome> (<Varivel> : <Tipo>)
<Definies>
INICIO
<comandos>
FIM
Pascal
PROCEDURE <Nome> (<Varivel> : <Tipo>);
<Definies>;
BEGIN
<comandos>;
END;
Obs: Varivel do mesmo tipo so separadas por vrgulas (,). Variveis de tipos diferentes, so separadas por ponto e
vrgula (;).
Exemplo:
Algoritmo
ALGORITMO Teste
VARIAVEIS
Nmero
Funcionrio

: INTEIRO
: STRING

PROCEDURE EscreveNome(N : INTEGER; Nome : STRING)


VARIAVEIS
I : INTEIRO
INICIO
PARA i DE 1 ATE n FACA
ESCREVA (Nome)
FIM PARA
FIM
INICIO
FIM

LEIA (Nmero, Funcionrio)


EscreveNome (Nmero, Funcionrio)

Pascal
PROGRAM Teste;
VAR
Nmero
Funcionrio

: INTEGER;
: STRING;

PROCEDURE EscreveNome(N : INTEGER; Nome : STRING);


19

VAR
BEGIN

I : INTEGER;
FOR i : = 1 TO n DO
BEGIN
WRITE(Nome);
END;

END;
BEGIN
END.

READ(Nmero, Funcionrio);
EscreveNome(Nmero, Funcionrio);

Obs: Os nmeros dados aos parmetros no necessitam serem iguais as variveis passadas para subRotina. No Exemplo acima, o valor contida em Nmero ser passado para o parmetro N, da mesma forma
que o valor contido na varivel Funcionrio ser passada para o parmetro Nome. Note que os nomes so
diferentes.

20

5.1.1 Exerccios 6 :
1 - Faa um algoritmo para calcular N!
2 - Faa um algoritmo para calcular Ab
3 - Faa um algoritmo para calcular a seguinte expresso at o n-simo:

Y X X 2 X 3 X 4 X 5 ...
a) Passagem de Parmetros por Valor
Qualquer alterao no contedo de um parmetro, dentro de uma sub-Rotina, no ser refletido no
programa chamado.
Exemplo:
Algoritmo
ALGORITMO Teste
VARIAVEIS
X
: INTEIRO
PROCEDURE PorValor(A : INTEIRO)
INICIO
A5
FIM
INICIO

X 10
PorValor (X)
ESCREVA (X)

FIM
Pascal

PROGRAM Teste;
VAR
X
: INTEGER;
PROCEDURE PorValor(A : INTEGER);
BEGIN
A : = 5;
END;
BEGIN

END.

X : = 10;
PorValor(X);
WRITE(X);

No Exemplo acima, o contedo da varivel X no ser alterado aps o retorno ao programa principal.
b) Passagem do Parmetros por Referncia
Quando a alterao no contedo de um parmetro, dentro de uma sub-Rotina, se reflete no programa
chamador. Os parmetros a serem passados por referncia devero ter, na definio da sub-Rotina, colocado na
frente do Nome do parmetro, a palavra VAR.
Exemplo:
Algoritmo

ALGORITMO Teste
VARIAVEIS
X : INTEIRO
PROCEDURE PorReferncia(VARIAVEL A: INTEIRO)
INICIO
A5
FIM
INICIO
21

X 10
PorReferncia(X)
ESCREVA (X)
FIM
Pascal

PROGRAM Teste;
VAR
X : INTEGER;
PROCEDURE PorReferncia(VAR A: INTEGER);
BEGIN
A : = 5;
END;
BEGIN

END.

X : = 10;
PorReferncia(X);
WRITE(X);

No Exemplo acima , o contedo da varivel X ser alterado aps o retorno ao programa principal
c) O problema dos tipos na definio de parmetros
O Pascal, a princpio, aceita somente que sejam definidos parmetros com os seguintes tipos : INTEGER,
REAL, BYTE, WORD, BOOLEAN, CHAR, STRING e os outros tipos ditos simples . Desta forma, tipos como
ARRAY, RECORD e STRING com tamanho definido pelo usurio, no so aceitos. Acontece que existe uma
forma de fazer o Pascal aceitar qualquer tipo de dados na definio de parmetros, atravs da definio de tipos
pelo usurio, ou seja, criar tipos atravs do comando TYPE.
Exemplo:
Algoritmo
ALGORITMO Teste
CONSTANTE
Mximo = 50
TIPO
Vetor = VETOR[1..Mximo] DE INTEIRO
Registro =RECORD
descrio
: STRING
cor
: STRING
Quant
: BYTE
FIM
VARIAVEL
Vet : vetor
Reg : registro
PROCEDURE LeInfo(VARIAVEL V: Vetor; VARIAVEL R : Registro)
VARIAVEL
i : INTEIRO
INICIO
ESCREVA (Digite os elementos DO vetor: )
PARA i DE 1 ATE mximo FACA
LEIA (v[i])
FIM PARA
ESCREVA (Digite os elementos DO Registro)
LEIA (r.descrio, r.cor, r.quant)
FIM
INICIO

LeInfo(Vetor, Reg)

FIM
Pascal

PROGRAM Teste;
CONST
Mximo = 50
22

TYPE
Vetor = ARRAY[1..Mximo] OF INTEGER;
Registro =RECORD
descrio
: STRING;
cor
: STRING;
Quant
: BYTE;
END;
VAR

Vet : vetor;
Reg : registro;

PROCEDURE LeInfo(VAR V: Vetor; VAR R : Registro);


VAR
i : INTEGER;
BEGIN
WRITE(Digite os elementos DO vetor: );
FOR i : = 1 TO mximo DO
READ(v[i]);
WRITE(Digite os elementos DO Registro);
READ(r.descrio, r.cor, r.quant);
END;
BEGIN
END.

LeInfo(Vetor, Reg);

5.1.2 Exerccios 7 :
1. Faa um algoritmo para ler 5 vetores do tipo REAL, todos com tamanhos diferentes.
2. Faa um algoritmo para :
Ler um vetor A com N elementos e um vetor B com M elementos( os valores N e M podem ou no
serem iguais).
Formar um terceiro vetor ( C ) com os elementos dos vetores A e B intercalados.
Exemplo:
C[1] : = A[1];
C[2] : = B[1];
C[3] : = A[2];
C[4] : = B[2];
Obs.: Nenhum tipo de ARRAY poder ser utilizado alm dos ARRAYs A, B e C.
3. Faa um algoritmo para :
Ler um vetor A com N elementos e um vetor B com M elementos(os valores M e N podem ou no
serem iguais).
Ordenar crescentemente estes vetores
Formar um terceiro vetor ( C ) , com os elementos dos vetores A e B intercalados, de forma que ao
final do processamento ( intercalao ), o vetor C continue ordenado. A ordenao ser obtida somente
atravs do processo de intercalao.
Obs: Nenhum outro tipo de ARRAY poder ser utilizados alm dos tipos A, B e C. Caso os elementos de um dos
vetores(A ou B) termine um antes do outro, as posies restantes do vetor C, devero ser preenchidas com os
elementos restantes do Vetor ( A ou B ) que ainda possui elementos.
4. Simule um arquivo de clientes na memria e crie um pequeno sistema para envio de mala direta. O sistema
dever ter as seguintes funes:
Incluso, alterao e excluso dos clientes
Listagem dos clientes em ordem alfabticas, dentro de um intervalo de letras especificado (A..Z)
Listagem dos Clientes por cdigo, dentro de um intervalo especificado ( cdigo inicial..cdigo final)

23

6.
Sintaxe:

Function
Algoritmo
FUNCTION <Nome> [(Parmetros)] : < Tipo do valor retornado>
<Definies>
INICIO
<Comandos>
FIM
Pascal

FUNCTION <Nome> [(Parmetros)] : < Tipo do valor retornado>;


<Definies>;
BEGIN
<Comandos>;
END;

Uma sub-Rotina do tipo FUNCTION possui as mesmas caractersticas de uma PROCEDURE no que
se refere a passagem de parmetros, variveis globais e locais, mas possui uma importante diferena, que o
retorno de um valor ao trmino de sua execuo, ou seja, uma FUNCTION sempre dever retornar um valor ao
chamador.
Na definio de uma FUNCTION , dever ser informado qual o tipo do valor retornado, sendo que
poder ser usado, nesta definio, tanto tipos pr-definidos da linguagem, como tipos definidos pelo usurio.
Somente no podero ser retornados tipos ARRAY e RECORD, justamente por serem tipos que definem variveis
que armazenam mais de um valor.
Para informar qual o valor deve ser retornado deve ser colocado, em algum ponto do cdigo da
FUNCTION uma linha com a seguinte Sintaxe:
Algoritmo
<Nome da FUNCTION > : = < o valor a ser retornado>;
Pascal
<Nome da FUNCTION > < o valor a ser retornado>
Exemplo:
Pascal
ALGORITMO Teste
VARIAVEL
K
: BYTE
FUNCTION Soma(V1, V2 : BYTE) : BYTE
INICIO
Soma V1 + V2
FIM
INICIO
FIM

K Soma(2,3)
ESCREVA (K)

Pascal
PROGRAM Teste;
VAR
K
: BYTE;
FUNCTION Soma(V1, V2 : BYTE) : BYTE;
BEGIN
Soma : = V1 + V2;
END;
24

BEGIN
K : = Soma(2,3);
WRITE(K);
END.

6.1.1 Exerccios 8 :
1. Construa Functions para :
a) Calcular N!
b) Calcular AB
c) Calcular:
50

n0

1
n!

d) Calcular:
50

n0

1
2n

f) Retornar TRUE caso um nmero seja par, FALSE caso contrrio


g) Retornar TRUE caso um nmero seja mpar, FALSE caso contrrio
2. Faa uma FUNCTION que codifique uma mensagem, da seguinte forma:
A por Z
B por Y
C por X
.
.
X por C
Y por B
Z por A
Obs.: a Rotina dever fazer o mesmo para letras minsculas.
3. Faa uma FUNCTION para transformar as letras de uma STRING de minsculas para maisculas
4. Faa uma FUNCTION para transformar as letras de uma STRING de maisculas para minsculas
5. Dado um vetor com n elementos numricos, faa uma FUNCTION que verifique se um dado valor existe
neste vetor
6. Faa uma FUNCTION para acrescentar N espaos em branco a esquerda de uma STRING qualquer
7. Faa uma FUNCTION para acrescentar N espaos em branco a direita de uma STRING qualquer
8. Dado uma STRING qualquer e um valor N , faa uma FUNCTION para gerar uma nova STRING que tenha
este tamanho N . Caso a STRING original possua um tamanho menor que o valor N informado, devero ser
acrescentados espaos em branco a esquerda da STRING, at que o tamanho N seja alcanado.
9. Dado uma STRING qualquer e um valor N , faa uma FUNCTION para gerar uma nova STRING que tenha
este tamanho N. Caso a STRING original possua um tamanho menor que o valor N informado, devero ser
acrescentados espaos em branco a direita da STRING, at que o tamanho N seja alcanado.

25

7.

Recursividade

Diz-se que uma FUNCTION ou uma PROCEDURE recursiva, quando ela chama a si prpria, esta
caracterstica pode , a princpio parecer estranha, ou at mesmo desnecessria devido ao nvel de programas o qual
estamos trabalhando, mas o uso da recursividade muitas vezes , a nica forma de resolver problemas complexos.
No nvel que ser dado este curso, bastar saber o conceito e o funcionamento de uma sub-Rotina recursiva.
Abaixo seguem exemplos de sub-Rotinas recursivas:
a)

PROCEDURE Recurso(A : BYTE);


BEGIN
IF a > 0 THEN
BEGIN
WRITE(A);
Recurso (A - 1);
END;
END;

b)

PROCEDURE Recurso( A : BYTE);


BEGIN
IF a > 0 THEN
BEGIN
Recurso ( A -1 );
WRITE( A ); { Esta linha ser executada ao final de cada execuo da
Rotina recursiva }
END;
END;

No primeiro Exemplo, a sada gerada ser a seguinte seqncia de nmeros: 5 4 3 2 1.


No segundo Exemplo, a sada gerada ser a seguinte seqncia de nmeros: 1 2 3 4 5 .
c)

PROCEDURE Recurso(A : BYTE) ;


VAR
Valor : BYTE;
BEGIN
Valor : = A DIV 2;
IF valor > 0 THEN
BEGIN
Recurso(Valor);
END;
WRITE(valor);
END;

Para um valor inicial igual a 80, a seqncia gerada ser a seguinte: 0 1 2 5 10 20 40


No Exemplo acima ser criado, a chamada da Rotina Recurso, uma varivel diferente de Nome Valor,
a qual assumir valores diferentes, dependendo do valor do parmetro A.
Uma caracterstica importante das Rotinas recursivas diz respeito a forma de tratamento das variveis e
parmetros. Usando como Exemplo o item acima, vemos que existe um parmetro chamado A e uma varivel
local a sub-Rotina, chamado Valor. importante notar que a cada ativao da Rotina recursiva, todos os
parmetros e variveis locais, so tratados como sendo posies de memria totalmente diferentes e independentes,
apesar de terem o mesmo Nome.

26

Segue abaixo uma representao das variveis e seus contedos em cada uma das chamadas:
a

A=80

Valor=40

A=40

Valor=20

A=20

Valor=10

A=10

Valor=5

A=5

Valor=2

A=2

Valor=1

A=1

Valor=0

1 Chamada
2 Chamada
3 Chamada
4 Chamada
5 Chamada
6 Chamada
7 Chamada

7.1.1 Exerccios 8 :
Explique qual ser o resultado e o funcionamento dos seguintes programas:
a)

PROGRAM Teste;
FUNCTION XXX(A : WORD) : WORD;
BEGIN
IF a = 0 THEN
BEGIN
XXX : = 1;
ELSE
XXX : =A * XXX(A - 1);
END;
END;
BEGIN
WRITE(XXX(5));
END.

b)

PROGRAM Teste;
PROCEDURE Recurso(a : BYTE);
BEGIN
a : = a - 1;
IF a > 0 THEN
BEGIN
Recurso(a);
END;
WRITE(a);
END;
BEGIN
Recurso(5);
END.

27

c)

PROGRAM Teste;
PROCEDURE Recurso(VAR a: BYTE);
BEGIN
a : = a - 1;
IF a > 0 THEN
BEGIN
Recurso(a);
END;
WRITE(a);
END;
BEGIN
Recurso(5);
END.

28

8.

Unit

As sub-Rotinas foram criadas para facilitar a construo de programas pois eliminam a necessidade de
duplicao de cdigo, uma vez que blocos de comandos usados repetidas vezes podem ser transformados em subRotinas. Este conceito se aplica muito bem para apenas um algoritmo / Programa, mas imagine que voc
necessite elaborar dois sistemas: Um para cadastro de clientes de uma loja qualquer e outro para o cadastro de
alunos de um colgio. Os dois sistemas sero totalmente diferentes na Funo que realizam, mas podero ter subRotinas idnticas (genricas) , por Exemplo sub-Rotina que manipulem a tela, sub-Rotinas para programar a
impressora, sub-Rotinas para armazenar/ recuperar informaes no disco, sub-Rotinas para gerenciar memria do
computador etc. Pelo conhecimento visto at agora, quando da construo destes sistemas, ou outros no futuro,
seria necessrio repetir a digitao destas mesmas sub-Rotinas tantas vezes quantos forem os sistemas a serem
construdos.
Dentro de um programa atravs do uso de sub-Rotinas podemos compartilhar blocos de comandos, o que
facilitou muito a construo de um sistema, mas quando se trata de elaborar vrios sistemas o uso de sub-Rotinas
no o bastante, pois precisam tambm compartilhar sub-Rotinas genricas entre sistemas diferentes. Pensando
nisto, foi criado um novo conceito de programao, onde podemos construir um tipo especial de programa onde
so definidos no apenas sub-Rotinas, mas tambm variveis, constantes e tipos de dados que podem ser usados
no apenas por um programa, mas sim por diversos programas diferentes. A este Exemplo de programao deu-se
o Nome de programao modular e a este programa especial deu-se o Nome de mdulo.
O Pascal d a este modo o Nome de UNIT e a Sintaxe para a sua construo a seguinte:
UNIT <Nome da Unit>;
INTERFACE
USES <lista de UNITs importadas>
< definio de variveis, constantes e tipos exportados>
<cabealho das sub-Rotinas exportadas>
IMPLEMENTATION
USES <lista de UNITs importadas privativas ao mdulo>
<definio de variveis, constantes e tipos internos a UNIT>
<sub-Rotinas internas a UNITs>
<corpo das sub-Rotinas exportadas>
BEGIN
<Comandos a serem executados na ativao da Unit>
END.
Obs :
A seo conhecida por INTERFACE define todas as sub-Rotinas, variveis, constantes e tipos de dados
que so exportados, ou sejam, so visveis em outros programas.
Os tipos de dados, variveis e constantes definidos n seo de IMPLEMENTATION sero visveis
somente dentro da UNIT , no sendo portanto exportados.
As sub-Rotinas definidas na seo de IMPLEMENTATION e que no tenham o seu cabealho
definido na seo de INTERFACE sero internas a UNIT, no sendo desta forma exportadas.
Para usar as sub-Rotinas, variveis, constantes e tipos de dados definidos em outras UNITs basta
utilizar a palavra reservada USES seguido da relao de nomes de UNITs desejada.

29

Exemplo: Construir uma UNIT que contenha uma sub-Rotina para escrever uma STRING qualquer em uma
determinada linha e coluna na tela do computador.
UNIT tela;
INTERFACE
PROCEDURE Escreve_Str( linha, coluna : BYTE; Texto : STRING);
IMPLEMENTATION
USES CRT;
PROCEDURE Escreve_Str( linha, coluna : BYTE; texto : STRING);
BEGIN
GOTOXY(coluna, linha);
WRITE(texto);
END;
END.
acima:

Como complementao do Exemplo vamos construir um pequeno programa que use a sub-Rotina definida
PROGRAM Testa_Unit;
USES Tela;
BEGIN
Escreve_Str(10, 10, Teste de Unit);
END;

8.1.1 Exerccios 9 :
1 - Construi UNITs para:
Definir constantes com os cdigos das cores/tonalidades possveis em uma tela tipo texto
Definir constantes com os cdigos das teclas especiais como PgUp, PgDn, Setas, Esc etc.
Definir constantes com os cdigos de programao dos caracteres de uma impressora
Definir constantes com os caracteres da tabela ASCII necessrios para criao de moldura
2 - Monte uma UNIT que contenha Rotinas para gerenciamento de tela tipo texto com montagens de molduras,
efeitos de sombreamento de janelas, subRotinas que permitam salvar/restaurar a tela tipo texto, sub-Rotinas para
pintar uma regio da tela (X1, Y1, X2, Y2) com uma determinada cor/tonalidade etc.
3 - Monte uma UNIT que contenha sub-Rotinas para montagem de menus de barra horizontais, verticais e
matriciais, sub-Rotinas que permitam realizar a edio de campos, podendo ser definido o tamanho do campo a ser
editado, usando teclas tipo setas, Esc, Backspace, Insert/ OverWrite, sub-Rotinas que faam a centralizao de
STRINGs dentro de determinadas coordenadas(X1,X2,Y1,Y2) do vdeo etc.

30

9.

Arquivos

Um arquivo de suma importncia nos programas computacionais, desde o tempo em que o primeiro
computador surgiu, pois, para que um programa faa algum tipo de operao , o mesmo precisa ser alimentado
com informaes: estas , ou so fornecidas pelo teclado, o que atualmente torna-se invivel, ou so fornecidos
atravs de um arquivo.
O PASCAL, possui dois tipos de arquivos, os quais so:
1. Arquivos FILE
2. Arquivos TEXT

9.1

Arquivos FILE

Um arquivo do tipo FILE , tambm conhecido por arquivo randmico, ou de acesso aleatrio, o arquivo
mais importante do Pascal, sendo desta forma tambm o mais utilizado. Um arquivo randmico caracterizado
pelo fato de ser possvel buscar uma determinada informao em qualquer posio que a mesma se encontre, sem
haver a necessidade de se percorrer todo o arquivo at se alcanar a informao desejada. O acesso a informao
direto.
Sintaxe :
<Nome da varivel> : FILE OF<tipo>
Observao: Um arquivo FILE deve ser apenas um tipo de dado, ou seja : INTEGER, REAL, RECORD,
STRING, BYTE, etc.
Exemplo: Crie um programa que defina uma varivel como sendo um arquivo FILE de STRINGs, crie tambm
neste mesmo programa um tipo Arquivo de INTEGERs.
PROGRAM Exemplo;
TYPE
Meu_tipo = FILE OF INTEGER;
VAR
Minha_Varivel = FILE OF STRING;
BEGIN
END.
Estrutura Interna do Arquivo:
Quando um arquivo FILE criado, o mesmo possui a seguinte estrutura:
Posio Fsica
0
1
2

Informao

A posio fsica corresponde a um nmero que gerado automaticamente no instante que uma
informao qualquer includa no arquivo. Este nmero, corresponde ao Endereo da informao no arquivo,
sendo que atravs deste Endereo que possvel recuperar qualquer informao, sem precisar percorrer todo o
arquivo em busca da mesma, ao invs disto basta fornecer o nmero da posio fsica da informao no arquivo.
Observao: Passaremos daqui por diante a chamar as informaes armazenadas em um arquivo de
Registros.
Sub-Rotinas para Tratamento de Arquivos FILES
Existem uma grande quantidade de sub-Rotinas construdas especialmente para manipular arquivos FILE.
Iremos neste curso mostrar as principais.
Rotina : ASSIGN()
31

Funo : Serve para associar um determinado Nome de arquivo, no disco ou disquete com o arquivo definido pelo
programador.
Sintaxe : ASSIGN(Meu_Arquivo, STRING_Com_Nome_Arquivo_DOS).
Exemplo:
PROGRAM TESTE
TYPE
Registro = RECORD
Nome : STRING;
Idade : BYTE;
END;
VAR
Arquivo : FILE OF Registro;
BEGIN
ASSIGN (Arquivo, dados.dat);
END.
Rotina : REWRITE()
Funo : Cria e abre para E\S um arquivo. Caso o arquivo no exista, o mesmo ser criado. Caso o arquivo j
exista, todos os dados existentes nele sero apagados.
Sintaxe : REWRITE(Meu_Arquivo);
Exemplo:
PROGRAM Teste;
TYPE
Registro = RECORD
Nome : STRING;
Idade : BYTE;
END;
VAR
Arquivo : FILE OF Registro;
BEGIN
ASSIGN (Arquivo, Dados.Dat);
REWRITE (Arquivo);
END.

32

Rotina : RESET()
Funo : Abre para E/S um arquivo que j exista. Caso o arquivo no exista ocorrer um erro de execuo e o
programa ser abortado.
Sintaxe : RESET(Meu_Arquivo)
Exemplo:
PROGRAM Teste;
TYPE
Registro = RECORD
Nome : STRING;
Idade : BYTE;
END;
VAR
Arquivo : FILE OF Registro;
BEGIN
ASSIGN (Arquivo, Dados.Dat);
RESET (Arquivo);
END.
Rotina : CLOSE()
Funo : Fecha um arquivo que tenha sido aberto com RESET\REWRITE.
Sintaxe : CLOSE(Meu_Arquivo)
Exemplo:
PROGRAM Teste;
TYPE
Registro = RECORD
Nome : STRING;
Idade : BYTE;
END;
VAR
Arquivo : FILE OF Registro;
BEGIN
ASSIGN (Arquivo, Dados.Dat);
REWRITE (Arquivo);
CLOSE (Arquivo);
END.

33

Rotina : WRITE()
Funo : A Rotina WRITE tem a mesma Funo de sada de informaes como at agora j tnhamos trabalhado,
somente que ao invs da informao ser apresentada no vdeo, a mesma ser armazenada em um arquivo.
Sintaxe : WRITE (Meu_Arquivo, Registro)
Exemplo:
PROGRAM Teste;
TYPE
Registro = RECORD
Nome : STRING;
Idade : BYTE;
END;
VAR
Arquivo : FILE OF Registro;
Reg
: Registro;
BEGIN
ASSIGN (Arquivo, Dados.Dat);
REWRITE (Arquivo);
WRITE (Digite o Nome: );
READ (Reg.Nome);
WRITE (Digite a Idade: );
READ (Reg.Idade);
WRITE (Arquivo, Reg);
CLOSE (Arquivo);
END.
Rotina : READ()
Funo : A Rotina READ tem a mesma Funo de entrada de informaes como at agora j tnhamos trabalhado,
somente que ao invs da leitura ser feita pelo teclado, a mesma ser feita de um arquivo.
Sintaxe : READ (Meu_Arquivo, Registro)
Exemplo:
PROGRAM Teste;
TYPE
Registro = RECORD
Nome : STRING;
Idade : BYTE;
END;
VAR
Arquivo : FILE OF Registro;
Reg
: Registro;
BEGIN
ASSIGN (Arquivo, Dados.Dat);
RESET (Arquivo);
READ (Arquivo);
WRITE (Nome = , Reg.Nome);
WRITE (Idade = , Reg.Idade);
CLOSE (Arquivo);
END.
Observao: Aps cada operao READ/WRITE no arquivo, o endereo do registro corrente no arquivo
incrementado em uma unidade. Assim por Exemplo, se o endereo do registro corrente igual a 10, aps uma
operao de READ/WRITE, o registro corrente passar a ser o nmero 11.

34

Rotina : FILEPOS()
Funo : Retorna um nmero inteiro indicando qual o registro corrente em um arquivo.
Sintaxe : Registro_Corrente : = FILEPOS (Meu_Arquivo)
Exemplo:
PROGRAM Teste;
TYPE
Registro = RECORD
Nome : STRING;
Idade : BYTE;
END;
VAR
Arquivo : FILE OF Registro;
Corrente: INTEGER;
BEGIN
ASSIGN (Arquivo, Dados.Dat);
RESET (Arquivo);
corrente : = FILEPOS(Arquivo);
WRITE (corrente);
CLOSE (Arquivo);
END.
Rotina : FILESIZE()
Funo : Retorna quantos registro existem armazenados no arquivo.
Sintaxe : Tamanho_Arquivo : = FILESIZE (Meu_Arquivo)
Exemplo:
PROGRAM Teste;
TYPE
Registro = RECORD
Nome : STRING;
Idade : BYTE;
END;
VAR
Arquivo : FILE OF Registro;
Total
: INTEGER;
BEGIN
ASSIGN (Arquivo, Dados.Dat);
RESET (Arquivo);
Total : = FILESIZE (Arquivo);
WRITE (Total);
CLOSE (Arquivo);
END.

35

Rotina : SEEK ()
Funo : Posiciona o ponteiro do arquivo em um registro determinado, para que o mesmo possa ser processado.
Sintaxe : SEEK(Meu_Arquivo, Endereo_Registro)
Exemplo:
PROGRAM Teste;
TYPE
Registro = RECORD
Nome : STRING;
Idade : BYTE;
END;
VAR
Arquivo : FILE OF Registro;
Reg
: Registro;
BEGIN
ASSIGN (Arquivo, Dados.Dat);
RESET (Arquivo);
SEEK (Arquivo, 10);
READ (Arquivo, Reg);
WRITE (Nome = , Reg.Nome);
WRITE (Idade = , Reg.Idade);
CLOSE (Arquivo);
END.
Rotina : EOF()
Funo : Retorna TRUE caso se alcance o final do arquivo, FALSE caso contrrio.
Sintaxe : Chegou_Final : = EOF (Meu_Arquivo)
Exemplo:
PROGRAM Teste;
TYPE
Registro = RECORD
Nome : STRING;
Idade : BYTE;
END;
VAR
Arquivo : FILE OF Registro;
Reg
: Registro;
BEGIN
ASSIGN (Arquivo, Dados.Dat);
RESET (Arquivo);
WHILE NOT EOF(Arquivo) DO
BEGIN
READ (Arquivo, Reg);
WRITE (Nome = , Reg.Nome);
WRITE (Idade = , Reg.Idade);
END;
CLOSE (Arquivo);
END.

36

Rotina : ERASE ()
Funo : Elimina o arquivo do disco. importante notar que o arquivo a ser eliminado no pode estar aberto.
Sintaxe : ERASE (Meu_Arquivo)
Exemplo:
PROGRAM Teste;
TYPE
Registro = RECORD
Nome : STRING;
Idade : BYTE;
END;
VAR
Arquivo : FILE OF Registro;
BEGIN
ASSIGN (Arquivo, Dados.Dat);
ERASE(Arquivo);
END.

9.1.1 Exerccios 10 :
1.
2.
3.
4.

Crie um arquivo FILE formado somente por nmeros inteiro de 1 10.000.


Faa a leitura do arquivo e escreva no vdeo somente os nmero mpares.
Crie um arquivo com Nome e salrio de n funcionrios e armazene estas informaes em um arquivo FILE.
Faa a leitura do arquivo anterior e escreva no vdeo o Nome e o salrio dos funcionrios que ganham mais de
US$ 1.000,00.
5. Abra o arquivo anterior e escreva o seu contedo de trs para frente, ou seja, do ltimo registro at o primeiro.
Utilize os comandos SEEK, FILEPOS e FILESIZE.
6. Abra o arquivo anterior e altere o salrio de10 funcionrios para US$ 1.050,00.
7. Abra o arquivo anterior e aumente em 15% o salrio de todos os funcionrios que ganham menos de
US$1.000,00.
8. Crie um arquivo FILE com a seguinte informao: Nome do produto. O cdigo do produto ser o prprio
nmero fsico do registro. Aps a criao cadastre n produtos.
9. Crie um arquivo FILE com a seguinte informao: Nome do Fornecedor. O cdigo do fornecedor ser o prprio
endereo fsico do registro. Aps a criao cadastre n fornecedores.
10. Crie um arquivo FILE com a seguintes informaes: Cdigo do Fornecedor, Cdigo do Produto. Cadastre as
informaes.
11. Usando os arquivos criados nos itens 8, 9 e 10 imprima um relatrio com o Nome dos Fornecedores e os
nomes dos produtos que cada um fornece.
12. Imprima um relatrio, usando os arquivos dos itens 8,9 e 10 com o seguinte layout.
FORNECEDOR
PRODUTOS
Joo da Silva
Geladeira
Fogo
Televiso
MicroOndas
Vdeo Cassete
Pedro de Alcntara
Sabo em P
Detergente
Sabo em barra
Etc
13. Construa uma Rotina que ordene alfabeticamente pelo Nome, o arquivo de fornecedores criado no item 9.
14. Apague todas as informaes do arquivo criado no item 10. O arquivo dever continuar existindo no disco.
15. Apague do disco o arquivo criado no item 10.
16 - Usando o arquivo de fornecedores, elimine(apague) os registros cujas posies fsicas so de nmero par.
17 - Crie um arquivo de peas, com o seguinte Lay-Out: Nome de Pea, cor , quantidade, tamanho e deletado. O
campo Deletado ser um campo Boolean, setado inicialmente para FALSE , informando se o registro est ou
no deletado do arquivo.
18 - Faa a uma Rotina para deletar um, ou mais, registros do arquivo de peas. A deleo consiste em setar o
campo deletado do arquivo para TRUE.
19 - Percorrer o arquivo de peas imprimindo somente as peas que no foram deletadas
20 - Faa uma Rotina que elimine fisicamente os registros do arquivo de peas que foram marcadas para deleo,
isto , onde o campo deletado est setado para TRUE.

37

9.2

Arquivos TEXT

Um arquivo do tipo TEXT, tambm conhecido por arquivo seqencial, um tipo especial de arquivo que,
ao contrrio do arquivo FILE, pode ser editado normalmente atravs de um editor de textos qualquer. Ele dito
seqencial porque a leitura tem que ser feita seqencialmente do incio ao fim do arquivo, no podendo desta
forma, como feito no arquivo FILE atravs do comando SEEK, posicionar de forma direta, o ponteira o ponteiro
de arquivo em um registro em particular.
Sintaxe:

<Nome da varivel> : TEXT

Exemplo: Crie um programa que defina uma varivel como sendo um arquivo TEXT e um tipo de dado que
represente um arquivo do tipo TEXT.
PROGRAM Exemplo;
TYPE
Menu_Tipo : TEXT;
VAR
Minha_Varivel : TEXT;
BEGIN
End.
Nos arquivos do tipo TEXT, todas as informaes l armazenadas so texto (STRINGs), mesmo assim,
possvel escrever no arquivo informaes de qualquer tipo de dado simples (INTEGER, REAL, STRING, BYTE,
etc) as quais , ao serem fisicamente armazenadas no arquivo, sero automaticamente convertidas do seu tipo
original para o tipo STRING. A leitura se processa de forma inversa, ou seja, quando lida uma informao em
um arquivo TEXT, a mesma ser automaticamente convertida para o tipo da varivel que ir armazenar a
informao, isto , do tipo STRING para o tipo da varivel receptora da informao lida.

9.3

Sub-Rotinas para Tratamento de Arquivos TEXT.

Existem uma grande quantidades de Sub-Rotinas construdas especialmente para manipular arquivos
TEXT, algumas das quais j foram vistas. Iremos neste curso mostrar as principais.
Rotina : ASSIGN()
Funo : Serve para associar um determinado Nome de arquivo, no disco ou disquete com o arquivo definido pelo
programador.
Sintaxe : ASSIGN( Meu_Arquivo, STRING_Com_Nome_do_Arquivo_DOS)
Exemplo:
PROGRAM Teste;
VAR
Arquivo : TEXT;
BEGIN
ASSIGN(Arquivo, Dados.Dat);
END.

38

Rotina : REWRITE()
Funo : Crie e Abra um arquivo no formato Write-Only(somente para escrita). Caso o arquivo no exista, este
ser criado. Caso j exista, todos os dados existentes nele sero apagados.
Sintaxe : REWRITE(Meu_Arquivo)
Exemplo:
PROGRAM Teste;
VAR
Arquivo : TEXT;
BEGIN
ASSIGN(Arquivo , Dados.Dat);
REWRITE(Arquivo);
END;
Rotina : RESET()
Funo : Abre um arquivo que j exista, mas no formato Read-Only( somente para leitura). Caso o arquivo no
exista ocorrer um erro de execuo e o programa ser abortado.
Sintaxe : RESET(Meu_Arquivo)
Exemplo:
PROGRAM Teste;
VAR
Arquivo : TEXT;
INICIO
ASSIGN(Arquivo, Dados.Dat);
RESET( Arquivo);
END;
Rotina : APPEND()
Funo : Abre um arquivo para incluso de novas informaes do tipo Write-Only ( somente para escrita). Caso o
arquivo no exista ocorrer um erro de execuo e o programa ser abortado. importante notar que as incluses
se processam sempre no final do arquivo.
Sintaxe : APPEND(Meu_Arquivo);
Exemplo:
PROGRAM Teste;
VAR
Arquivo : Text;
BEGIN
ASSIGN(Arquivo, Dados.Dat);
APPEND(Arquivo);
END.
Rotina : CLOSE()
Funo : Fecha um arquivo que tenha sido aberto com Reset\Rewrite\Append
Sintaxe : CLOSE(Meu_Arquivo)
Exemplo:
PROGRAM Teste;
VAR
Arquivo : TEXT;
BEGIN
ASSIGN(Arquivo, Dados.Dat);
REWRITE(Arquivo);
CLOSE(Arquivo);
END;
Rotina : WRITE() ou WRITELN()
Funo : A Rotina WRITE ou WRITELN tem a mesma Funo de sada de informaes como at agora j
tnhamos trabalhado, somente que ao invs da informao ser apresentada no vdeo, a mesma ser armazenada no
arquivo. Ao ser usado o comando WRITE, todas as informaes sero escritas no arquivo na mesma linha, como
acontece quando se usa este comando para escrever no vdeo. Por outro lado, ao ser usado o comando WRITELN,
todas as informaes sero colocadas uma em cada linha, como acontece quando se usa este comando para
escrever informaes no vdeo.
Sintaxe : WRITE(Meu_Arquivo, informao) ou WRITELN(Meu_Arquivo, Informao)
Exemplo:
39

PROGRAM Teste;
TYPE
Registro = RECORD
Nome : STRING;
Idade : BYTE;
END;
VAR
Arquivo : TEXT;
Reg
: Registro;
BEGIN
ASSIGN(Arquivo, Dados.Dat);
REWRITE(Arquivo);
WRITE(Digite o Nome);
READ(Reg.Nome);
WRITE(Digite a Idade:);
READ( Reg. Idade);
WRITELN(Arquivo, Reg.Nome);
WRITELN(Arquivo, Reg. Idade);
CLOSE(Arquivo);
END.
Rotina :READ() ou READLN()
Funo :A Rotina READ ou READLN tem a mesma Funo de entrada de informaes como at agora j
havamos trabalhado, somente que ao invs da leitura ser feita pelo teclado, a mesma ser feita de um arquivo. Ao
ser usado o comando READ, a leitura ser feita sempre na mesma linha , como acontece quando se usa este
comando para ler informaes pelo teclado. Por outro lado, ao ser usado o comando READLN, as leituras sero
feitas linha a linha, como acontece quando se usa este comando para leitura pelo teclado.
Sintaxe : READ(Meu_Arquivo, Informao) ou READLN(Meu_Arquivo, Informao)
Exemplo:
PROGRAM Testes;
TYPE
Registro = RECORD
Nome : STRING;
Idade : BYTE;
END;
VAR
Arquivo : TEXT;
Reg :Registro;
BEGIN
ASSIGN(Arquivo, Dados.Dat);
RESET(Arquivo);
READLN(Arquivo, Reg.Nome);
READLN(Arquivo, Reg.Nome);
READLN(Arquivo, Reg.Idade);
WRITE(Nome = , Reg. Nome);
WRITE(Idade = , Reg. Idade);
CLOSE(Arquivo);
END.
Rotina : EOF()
Funo : Retorna TRUE caso se alcance o final do arquivo, FALSE caso contrrio.
Sintaxe : Chegou_Final := EOF(Meu_Arquivo);
Exemplo:
PROGRAM Teste;
TYPE
Registro = RECORD
Nome : STRING;
Idade : BYTE;
END;
VAR
Arquivo : TEXT;
Reg
: registro;
BEGIN
ASSIGN(Arquivo, Dados.Dat);
40

RESET(Arquivo);
WHILE NOT EOF(Arquivo) DO
BEGIN
READLN(Arquivo, Reg.Nome);
READLN(Arquivo, Reg.Idade);
WRITE(Nome = ,Reg.Nome);
WRITE(Nome = , Reg.Idade);
END;
CLOSE(arquivo);
END.
Rotina : ERASE()
Funo : Elimina o arquivo do disco. importante notar que o arquivo a ser eliminado no pode estar aberto .
Sintaxe : ERASE(Meu_Arquivo);
Exemplo:
PROGRAM Teste;
VAR
Arquivo : TEXT;
BEGIN
END.

ASSIGN(Arquivo, Dados.Dat);
ERASE(Arquivo);

9.3.1 Exerccios 11 :
1.
2.
3.
4.

Crie um arquivo TEXT formado somente por nmeros inteiros de 1 a 10.000.


Faa a leitura do arquivo anterior e escreva no vdeo somente os nmeros mpares.
Crie um arquivo com Nome e salrio de n funcionrios e armazene estas informaes em um arquivo TEXT.
Faa a leitura do arquivo anterior e escreva no vdeo o Nome e salrio dos funcionrios que ganham mais que
US$1.000,00.
5. Abra o arquivo anterior e altere o salrio de 100 funcionrios para US$3.050,00.
6. Abra o arquivo anterior e aumente em 15% o salrio de todos os funcionrios que ganham menos de
US$1.000,00.
7. Abra o arquivo anterior e mais 10 funcionrios.
8. Ordene crescentemente pelo Nome do funcionrio o arquivo anterior.
9. Envie os dados do arquivo anterior para a impressora. Para isso , use USES PRINTER e o comando
WRITE(LST, informao); ou WRITELN(LST, Informao).
10. Faa um programa que imprima os arquivos, caso existam, AUTOEXEC.BAT e CONFIG.SYS na impressora.
Adicionalmente faa com que a impressora seja em negrito . Para isso consulte o manual da impressora para
determinar os cdigos de programao da mesma.
11. Faa um programa que permita ao usurio imprimir um arquivo texto qualquer dando a possibilidade de
selecionar qual o tipo de formato de impresso o usurio deseja , isto : negrito, sublinhado, itlico,
comprimido, expandido, etc.
12. Faa uma sub-Rotina para posicionar a cabea da impressora um uma determinada linha e coluna . Considere o
topo da folha de papel como sendo a posio (1 , 1).

41

10.

Alocao Dinmica

10.1

Introduo

At agora temos definido variveis de forma esttica, ou seja, reservamos o espao na memria necessria
para as variveis que iremos utilizar no programa. Isto funciona bem quando sabemos o quanto de memria iremos
utilizar, mas e quando no sabemos? Tome por Exemplo as definies dos ARRAYs. Ser que sempre temos
certeza do tamanho de um ARRAY poder ter por toda a vida de um programa? Ser que o meu sistema de
cadastro de clientes, o qual usa um ARRAY com 10.000 posies o suficiente? Ser que nunca ir acontecer de se
tentar cadastrar o cliente de nmero 10.001? E o que acontece quando os clientes cadastrados nunca passarem de
100? As posies de memria restantes (9.900) no podero ser utilizadas por outras variveis, pois j esto
reservadas. O uso de ARRAYs sem dvida de grande ajuda para a construo de um programa, mas quando
temos que super dimensionar uma varivel ARRAY, por no sabermos qual o tamanho que esta mesma varivel ir
ter, ento comea a ser questionvel a sua utilizao. Pensando neste tipo de problema, foi desenvolvido um novo
conceito para alocao de memria, onde poderemos reservar espao da memria disponvel (HEAP) a medida que
for necessrio, da mesma forma que poderemos liberar posies de memria quando no mais precisarmos delas. A
este conceito deu-se o Nome de alocao dinmica, uma vez que a memria alocada no no incio do programa,
mas sim no decorrer de sua utilizao do sistema. De uma forma mais simples de falar, como se pudssemos
definir um ARRAY com o seu tamanho sendo alterado a medida que fosse necessrio.

10.2

Definio de Pointers

At agora ao definirmos uma varivel, estvamos na verdade alocando um espao na memria com um
tamanho definido pelo tipo da varivel (INTEGER, STRING, CHAR, etc...), sendo que ao invs de trabalharmos
com o endereo fsico de memria temos a facilidade de dar a este espao alocado um Nome simblico qualquer.
Exemplo: Alocar na memria para uma varivel do tipo INTEGER e atribuir a esta posio de memria um valor
qualquer
PROGRAM ESTATICO;
VAR
Nmero : INTEGER;
BEGIN
Nmero := 10;
END.
No Exemplo acima ocorre as seguintes situaes:
a) Reservamos espao na memria suficiente para armazenar dois (2) BYTEs, ou seja, um INTEGER, e demos a
esta posio de memria um Nome simblico: Nmero
b) Atribumos a varivel Numero o valor dez (10), o que far com que a memria ocorra a seguinte situao:

Numero

10
Bem, o que foi mostrado acima o nosso modo habitual de trabalhar com variveis, mas a partir de
agora iremos trabalhar de uma maneira um pouco diferente, ou seja, ao invs de definirmos uma varivel como
sendo de um tipo qualquer e a esta varivel atribuirmos uma informao propriamente dita, mas sim o endereo
fsico da memria onde a informao est armazenada. A este tipo de varivel passaremos a chamar, a partir de
agora, de variveis pointer (apontadores ou ponteiro), pelo simples fato dela (a varivel) apontar, indicar, a
localizao de uma informao na memria.
Sintaxe para definio:
<Nome da varivel> : ^<tipo>
42

Exemplo 1: Definir variveis pointer para os tipos STRING, INTEGER, REAL, CHAR, BOOLEAN.
PROGRAM DEFINE_POINTER;
VAR
Ap_STRING
: ^STRING;
Ap_INTEGER : ^INTEGER;
Ap_REAL
: ^REAL;
Ap_BYTE
: ^BYTE;
Ap_CHAR
: ^CHAR;
Ap_BOOLEAN : ^BOOLEAN;
BEGIN
<comandos>;
END.
Caso seja necessrio definir variveis pointers para RECORDs e ARRAYs ser preciso antes criar tipos
de dados que representem estes mesmos RECORDs e ARRAYs.
Exemplo 2: Definir uma varivel pointer para um ARRAY[1..2] OF STRING.
PROGRAM DEFINE_ARRAY_POINTER;
TYPE
Vetor = ARRAY [1..2] OF STRING;
VAR
Ap_vetor : ^Vetor;
BEGIN
<comandos>;
END.

10.3

Rotinas para Alocao de Memria:

Rotina : NEW()
Funo : Aloca espao na memria para uma informao, com o tamanho definido pelo tipo da varivel pointer.
Sintaxe : NEW(Varivel Pointer)
Exemplo:
PROGRAM ALOCA;
VAR
Ap_WORD : ^WORD;
BEGIN
NEW(Ap_WORD);
END.

43

Obs.: No Exemplo acima, aps o comando NEW, ser alocado na memria HEAP, dois BYTEs (uma WORD),
sendo que poderemos representar a memria como mostrado abaixo:

Ap_WORD

4000:3D07

Rotina : DISPOSE()
Funo : Libera espao na memria, o nmero de BYTEs liberados depender do tipo da varivel pointer
utilizada. Uma vez liberada memria, o valor l armazenado estar perdido.
Sintaxe : DIPOSE(Varivel Pointer)
Exemplo:
PROGRAM LIBERA;
VAR
Ap_WORD : ^WORD;
BEGIN
NEW(Ap_WORD);
DISPOSE (Ap_WORD);
END.
Obs.: No Exemplo anterior, aps o comando DISPOSE, sero liberado dois (2) BYTEs devido ao fato de uma
WORD ocupar este espao de memria.

10.4

Atribuio de Valores

A Sintaxe para atribuio de valores a mesma utilizada em variveis simples, a nica diferena que
devemos colocar aps o Nome da varivel apontadora o smbolo ^
Exemplo:
PROGRAM ATRIBUI;
VAR
Ap_Nmero : ^INTEGER;
BEGIN
NEW(Ap_Nmero);
Ap_Nmero ^:= 10;
DISPOSE (Ap_Nmero);
END.
No Exemplo acima ocorre o seguinte:
a) Criamos uma varivel que ir apontar ara dois (2) BYTEs (um INTEGER) na memria.
b) Alocamos espao suficiente para armazenar um valor do tipo INTEGER e fazemos com que a varivel
Ap_Nmero aponte para a posio de memria alocada.

Ap_Numero

3000:004A

c) Colocamos na posio de memria apontada por Ap_Nmero o valor dez (10).


d) Liberamos os dois (2) BYTEs apontados por Ap_Nmero. A informao no mais poder ser acessada.

10.4.1 Exerccios:
1. Crie um vetor com n elementos, sendo que cada posio do vetor corresponder a um pointer para um valor do
tipo REAL. Faa a leitura de n valores e armazene-os na memria.
2. Crie uma varivel pointer do tipo ARRAY[1..20] OF CHAR, faa a leitura de 20 caracteres e os armazene na
memria.
3. Percorra o ARRAY definido acima e escreva quantos caracteres A, E, I, O e U existem no mesmo.
44

4. Defina um tipo (TYPE) de dado que represente um pointer para um RECORD com os seguintes campos: Nome
e Idade.
5. Usando a definio de tipo anterior, crie uma sub-Rotina para ler as informaes de uma nica pessoa.
6. Defina uma varivel como sendo um ARRAY com 10 posies, sendo que cada posio corresponder aos dados
de uma pessoa, conforme definido no item 5.
7. Use a sub-Rotina definida no item 5, para ler o vetor definido no exerccio acima.
8. Defina uma varivel pointer do tipo matriz N x N, sendo que cada posio desta matriz tambm ser um pointer
mas para um valor do tipo WORD.
9. Faa a leitura da matriz definida no item acima.
10. Percorra a matriz acima e escreva os valores existente na diagonal principal.
11. Faa as definies necessrias para obter a seguinte representao de pointer.
PAS

BR

ESTADO

CIDADE

CLIENTE

SC

FLO

CRI

ARA

PR

JAG

BNO

TUB

12. Preencha a estrutura acima com as informaes de 12 pessoas.


13. Liste no vdeo o Nome e idade das pessoas que tem idade mpar.

45

NOME

ENDEREC
O

IDADE

11.

Lista Simplesmente Encadeada

At agora vimos que possvel alocar espao para uma informao na memria e liberar este mesmo
espao quando no for mais necessrio. O problema que no mundo computacional necessitamos trabalhar no
apenas com uma informao mas com vrias. Da mesma forma como vnhamos trabalhando at agora, quando era
necessrio guardar vrias informaes na memria ns utilizvamos o ARRAY. J foi explicado todos os problemas
inerentes ao uso de um ARRAY, por isso necessrio definir um a outra estrutura que permita armazenar
informaes na memria independente da quantidade. Esta estrutura ser a partir de agora chamada de lista
encadeada.

11.1

Definio

Uma lista encadeada uma seqncia de informao armazenadas em algum lugar da memria, sendo que
as mesmas esto ligadas entre si por um endereo (pointer).
Exemplo: abaixo colocarei um desenho representando uma lista encadeada na memria.

Incio

11.2

Criando Listas na Memria

Para criarmos uma lista, para colocarmos na memria uma seqncia de valores sendo que os mesmos
estejam ligados entre si por um endereo, ou pointer, vamos utilizar a estrutura RECORD. Esta RECORD ser
usada basicamente para definir dois tipos de campos: O primeiro tipo corresponde aos campos de informaes,
aquelas quereremos armazenar na memria, e o segundo tipo corresponde ao campo apontador (pointer), cuja
Funo ser armazenar o endereo da prxima informao existente na memria.
Exemplo: Definir um tipo de dado que permita armazenar na memria as informaes de um cliente: Nome, Idade
e Sexo.
PROGRAM T_FALTANDO_ALGO;
TYPE
REGISTRO = RECORD
Nome : STRING;
Idade : BYTE;
Sexo
: CHAR;
Ender : <tipo apontador>;
END;
BEGIN
<comandos>;
END.
O programa acima no est completo quanto a definio do RECORD, pois um campo chamado Ender que no
tem o seu tipo definido. Mas ento, qual ser este tipo? O campo Ender dever ser usado para armazenar o
endereo de um a informao na memria que seja do tipo Registro, pois ela que contm a definio dos dados
dos clientes. Desta forma, o campo Ender dever ser um tipo apontador de registros. S que temos um pequeno
problema de Sintaxe. Caso faamos a seguinte definio do tipo Registro:
PROGRAM AINDA_T_ERRADO;
46

TYPE
REGISTRO = RECORD

END;
BEGIN

Nome
Idade
Sexo
Ender

: STRING;
: BYTE;
: CHAR;
: ^Registro;

<comandos>;

END.
O PASCAL ir acusar um erro de compilao, pois ele precisa que um apontador de estruturas complexas como
RECORDs, tenham que ter definidos um tipo (TYPE) especfico para ele, por isso eu necessito definir antes, um
tipo que seja um apontador de Registro. Abaixo mostrado como isto ser feito:
PROGRAM OK;
TYPE
Ap_Registro = ^REGISTRO;
REGISTRO = RECORD
Nome : STRING;
Idade : BYTE;
Sexo
: CHAR;
Ender : Ap_Registro;
END;
BEGIN
<comandos>;
END.
Pode parecer estranho, definir o tipo Ap_Registro como sendo um apontador de registro sendo que o tipo
Registro ainda no tinha sido definido. No se assuste, assim mesmo. Com o tempo voc se acostuma.
No futuro, quando j tivermos a lista definida criada, a mesma poder ter a seguinte representao:

Nome

Idade

Sexo

Ender

Nome

Idade

Sexo

Ender

Incio
Nome

Idade

Sexo

Ender

Obs.: Um apontador no pode ficar sem um valor, por isso o apontador do ltimo elemento da lista dever receber
um valor especial do PASCAL, que indica que aquele apontador no aponta para ningum. Este valor uma
varivel pr-definida do PASCAL chamada NIL.

47

Desta forma, a estrutura acima com o uso da varivel NIL, ter a seguinte representao:

Nome

Idade

Sexo

Ender

Nome

Idade

Sexo

Ender

Incio
Nome

Idade

Sexo

Ender

Obs.: O termo lista simplesmente encadeada significa que a lista possui somente um apontador para apontar as
informaes na memria.
Exemplo1: Faa um PROGRAMA que armazene o Nome, idade, e sexo de uma pessoa em uma estrutura
simplesmente encadeada na memria.
PROGRAM LISTA_ENCADEADA;
USES CRT;
TYPE
Ap_Nodo = ^Nodo
Nodo = RECORD
Nome : STRING;
Idade : BYTE;
Sexo
: CHAR;
Prox
: Ap_Nodo;
END;
VAR
Raiz : Ap_Nodo;
BEGIN
NEW(RAIZ)
WRITE (Digite o Nome : );
READLN (RAIZ^.Nome);
WRITE (Digite o Idade : );
READLN (RAIZ^.Idade);
WRITE (Digite o Sexo : );
READLN (RAIZ^.Sexo);
RAIZ^.Prox := NIL;
END.

48

Exemplo 2: Aproveitando a lista criada no Exemplo anterior, crie uma sub-Rotina que recebendo como parmetro
as informaes de uma pessoa, acrescente esta pessoa no incio da lista.
PROCEDURE Inclui_Inicio_da_Lista (Var Raiz : Ap_Nodo; Reg: Nodo);
VAR
Novo_Nodo : Ap_Nodo;
BEGIN
NEW ( Novo_Nodo);
Novo_Nodo^:= Reg;
Novo_Nodo^.Prox := Raiz;
Raiz := Novo_Nodo;
END.
Exemplo 3: Aproveitando a lista criada no Exemplo anterior, crie uma sub-Rotina que recebendo como parmetro
as informaes de uma pessoa, acrescente esta pessoa na lista, de forma que a mesma seja a segunda da lista.
PROCEDURE Segunda_Posio_da_Lista (Var Raiz : Ap_Nodo; Reg: Nodo);
VAR
Novo_Nodo : Ap_Nodo;
BEGIN
NEW ( Novo_Nodo);
Novo_Nodo^:= Reg;
Novo_Nodo^.Prox := Raiz^.Prox;
Raiz^.Prox := Novo_Nodo;
END.
Exemplo 4: Faa uma sub-Rotina genrica que recebendo como parmetro as informaes de
acrescente a mesma no final da lista.
PROCEDURE Inclui_Final_da_Lista (Var Raiz : Ap_Nodo; Reg: Nodo);
VAR
Novo_Nodo, Atual : Ap_Nodo;
BEGIN
NEW ( Novo_Nodo);
Novo_Nodo^:= Reg;
Novo_Nodo^.Prox := NIL;
Atual := Raiz;
WHILE Atual^.Prox <> NIL DO
Atual := Atual^.Prox;
Atual^.Prox := Novo_Nodo;
END.

49

uma pessoa,

Exemplo 5 : Faa uma sub-Rotina genrica que recebendo como parmetro as informaes de uma pessoa,
acrescente a mesma em uma lista. No Inicio, considere a lista com o valor NIL. As pessoas sero includas sempre
no final da lista.
PROCEDURE Inclui_Final_da_Lista (Var Raiz : Ap_Nodo; Reg: Nodo);
VAR
Novo_Nodo, Atual : Ap_Nodo;
BEGIN
NEW ( Novo_Nodo);
Novo_Nodo^:= Reg
Novo_Nodo^.Prox := NIL;
IF RAIZ = NIL THEN
Raiz := Novo_Nodo
ELSE
BEGIN
Atual := Raiz;
WHILE Atual^.Prox <> NIL DO
Atual := Atual^.Prox;
Atual^.Prox := Novo_Nodo;
END;
END.

11.2.1 Exerccios:
1. Faa uma sub-Rotina que conte quantos elementos existem em uma lista simplesmente encadeada.
2. Faa uma sub-Rotina que verifique se uma determina pessoa existe na lista. A consulta pode ser feita pelo Nome
da pessoa. Use a lista definida nos exemplos anteriores.
3. Faa uma sub-Rotina que elimine o primeiro elemento da lista se o mesmo existir.
4. Faa uma sub-Rotina que elimine o segundo elemento da lista se o mesmo existir.
5. Faa uma sub-Rotina que elimine o ultimo elemento da lista se o mesmo existir.
6. Faa uma sub-Rotina genrica que elimine um determinado elemento de uma lista. Dever ser fornecido o
nmero do elemento a ser eliminado. Pode ser que a lista no contenha este elemento. Por Exemplo, a lista tem 10
nodos e deseja-se eliminar o nodo de nmero 11.
7. Faa uma sub-Rotina que permita a incluso de um elemento na lista em uma determinada posio. A subRotina dever receber a lista, a informao e a posio em que a nova informao ser includa. Caso a posio
seja maior que o nmero de elementos existentes na lista, a mesma dever ser includa no final. Considere a
possibilidade da lista, no incio estar vazia.
8. Faa uma sub-Rotina para ordenar uma lista de nmeros inteiros em ordem crescente. Antes de construir a
Rotina, faa a definio do tipo da lista: RECORD e tipo apontador.

50

9. Faa a definio de um ou mais tipos que possam no futuro criar uma lista como a que mostrada abaixo:
Fornecedor
Nome

Prod

Prox

Nome

Prod

Prox

Nome

Prod

Prox

Nome Quant

Seg

Nome Quant

Seg

Nome Quant

Seg

Nome Quant

Seg

Nome Quant

Seg

Nome Quant

Seg

10. Faa uma sub-Rotina genrica para incluir um novo produto na lista de produtos de um fornecedor qualquer.
Os parmetros de entrada sero as informaes do produto e a lista dos produtos de cada fornecedor
(Fornecedor^.Prod). A incluso de novo produto se dar sempre no final da lista de produtos.
11. Faa uma sub-Rotina genrica para incluir um novo fornecedor na lista de fornecedores. A incluso se dar
sempre no final da lista.
12. Faa uma sub-Rotina genrica que inclua um produto para um determinado fornecedor. Os parmetros de
entrada sero: A lista de fornecedores, as informaes do produto e as informaes do fornecedor, que ter includo
no seu campo Prod este novo produto. A Rotina dever antes de mais nada percorrer a lista de fornecedores at
achar o fornecedor cujo Nome combine com o Nome passado como parmetro. S aps que ser feito o processo
de incluso do novo produto. Caso o fornecedor no exista na lista, o mesmo dever antes de tudo ser includo na
lista de fornecedores, para s ento ter o produto includo no seu corpo Prod. Use tambm as Rotinas criadas nos
itens 10 e 11.

51

12.

Lista Duplamente Encadeada

Continuado o estudo de listas encadeadas, apresentamos agora uma nova estrutura conhecida como lista
duplamente encadeada. Este termo dado pelo fato de existir dois endereos (pointers) que apontam para nodos da
mesma lista, isto , um endereo aponta para o nodo imediatamente posterior e outro endereo aponta para o nodo
imediatamente anterior, isto com exceo do primeiro e do ltimo nodo, cujos endereos posterior e antecessor so
respectivamente NIL.
Abaixo est uma figura representando este tipo de lista encadeada na memria
Abaixo colocaremos exemplos de Rotinas para criao de listas duplamente encadeada na memria.
Exemplo1: Faa um algoritmo que armazene o Nome, idade e sexo de uma pessoa em uma estrutura duplamente
encadeada na memria.
Lista

PROGRAM LISTA_ENCADEADA;
USES CRT;
TYPE
Ap_Nodo = ^Nodo
Nodo = RECORD
Nome : STRING;
Idade : BYTE;
Sexo
: CHAR;
Ant, Prox : Ap_Nodo;
END;
VAR
Raiz : Ap_Nodo;
BEGIN
NEW(RAIZ)
WRITE (Digite o Nome : );
READLN (RAIZ^.Nome);
WRITE (Digite o Idade : );
READLN (RAIZ^.Idade);
WRITE (Digite o Sexo : );
READLN (RAIZ^.Sexo);
RAIZ^.Ant := NIL;
RAIZ^.Prox := NIL;
END.
Exemplo 2: Aproveitando a lista criada no Exemplo anterior, crie uma sub-Rotina que recebendo como parmetro
as informaes de uma pessoa, acrescente esta pessoa no incio da lista.
PROCEDURE Inclui_Inicio_da_Lista (Var Raiz : Ap_Nodo; Reg: Nodo);
VAR
Novo_Nodo : Ap_Nodo;
BEGIN
NEW ( Novo_Nodo);
52

Novo_Nodo^:= Reg;
Novo_Nodo^.Ant := NIL;
Novo_Nodo^.Prox := Raiz;
Raiz^.Ant:= Novo_Nodo;
Raiz := Novo_Nodo;
END.
Exemplo 3: Aproveitando a lista criada no Exemplo anterior, crie uma sub-Rotina que recebendo como parmetro
as informaes de uma pessoa, acrescente esta pessoa na lista, de forma que a mesma seja a segunda da lista.
PROCEDURE Segunda_Posio_da_Lista (Var Raiz : Ap_Nodo; Reg: Nodo);
VAR
Novo_Nodo, Aux : Ap_Nodo;
BEGIN
NEW ( Novo_Nodo);
Novo_Nodo^:= Reg;
Aux := Raiz^.Prox;
Novo_Nodo^.Prox := Aux;
Novo_Nodo^.Ant := Raiz;
Raiz^.Prox := Novo_Nodo;
IF Aux <> NIL THEN
Aux^.Ant := Novo_Nodo;
END.
Exemplo 4: Faa uma sub-Rotina genrica que recebendo como parmetro as informaes de
acrescente a mesma no final da lista.
PROCEDURE Inclui_Final_da_Lista (Var Raiz : Ap_Nodo; Reg: Nodo);
VAR
Novo_Nodo, Atual : Ap_Nodo;
BEGIN
NEW ( Novo_Nodo);
Novo_Nodo^:= Reg;
Novo_Nodo^.Prox := NIL;
Atual := Raiz;
WHILE Atual^.Prox <> NIL DO
Atual := Atual^.Prox;
Atual^.Prox := Novo_Nodo;
Novo_Nodo^.Ant := Atual;
END.

53

uma pessoa,

Exemplo 5 : Faa uma sub-Rotina genrica que recebendo como parmetro as informaes de uma pessoa,
acrescente a mesma em uma lista. No Inicio, considere a lista com o valor NIL. As pessoas sero includas sempre
no final da lista.
PROCEDURE Inclui_Final_da_Lista (Var Raiz : Ap_Nodo; Reg: Nodo);
VAR
Novo_Nodo, Atual : Ap_Nodo;
BEGIN
NEW ( Novo_Nodo);
Novo_Nodo^:= Reg
Novo_Nodo^.Ant := NIL;
Novo_Nodo^.Prox := NIL;
IF RAIZ = NIL THEN
Raiz := Novo_Nodo
ELSE
BEGIN
Atual := Raiz;
WHILE Atual^.Prox <> NIL DO
Atual := Atual^.Prox;
Atual^.Prox := Novo_Nodo;
Novo_Nodo^.Ant := Atual;
END;
END.

12.1.1 Exerccios:
1.
2.
3.
4.

Faa uma sub-Rotinas que elimine o primeiro elemento da lista, se o mesmo existir.
Faa uma sub-Rotinas que elimine o segundo elemento da lista, se o mesmo existir.
Faa uma sub-Rotina que elimine o ltimo elemento da lista, se o mesmo existir.
Faa uma sub-Rotina genrica que elimine um determinado elemento de uma lista. Dever ser fornecido o
nmero do elemento a ser eliminado. Pode ser que a lista no contenha este elemento. Por Exemplo, a
lista tem 10 nodos e deseja-se eliminar o nodo de nmero 11.
5. Faa uma sub-Rotina que permita a incluso de um elemento na lista em uma determinada posio. A subRotina dever receber a lista, a informao e a posio em que a nova informao ser includa. Caso a posio
seja maior que o nmero de elementos atualmente existentes na lista, a mesma dever ser includa no final.
Considere a possibilidade da lista no incio estar vazia.
6. Faa uma sub-Rotina para ordenar uma lista de nmeros inteiros em ordem crescente. Antes de construir a
Rotina, faa a definio do tipo da lista: RECORD e o tipo apontador.
7. Aproveitando a lista ordenada no exerccio anterior, faa uma sub-Rotina genrica para listar o contedo da
lista em ordem crescente.
8. Aproveitando a lista ordenada no exerccio anterior, faa uma sub-Rotina genrica para listar o contedo da
lista em ordem crescente.

54

9. Faa as definies de tipo necessrias para criar, no futuro, uma estrutura na memria como a que
representada na figura abaixo:

A
B

NIL

C
D

NIL

...
Z

Obs.: a) Dicionrio um vetor ( de A at Z) de pointers para uma estrutura duplamente encadeada onde alm
dos campos Prox e Ant , existem mais dois campos STRING os quais representam a palavra e o seu
significado.
b) A lista de palavras que esto ligadas ao ndice A do vetor, correspondem aquelas palavras que iniciam
com a letra A, e assim por diante.
10. Usando a definio feita no exerccio anterior, faa uma sub-Rotina para incluso de uma palavra e o seu
significado no dicionrio de palavras. Lembre-se que a palavra e o seu significado no devem ser includas em
qualquer lista de forma aleatria, a incluso dever ser feita somente na lista cujo ndice do vetor corresponde
primeira letra da palavra. Desta forma, caso a palavra, fosse Cavalo, esta palavra, junto com o seu significado,
deveriam ser includos na lista existente no ndice C do vetor.

55

You might also like