Vous êtes sur la page 1sur 57

Silvoney Fernandes da Silva Silvoneyfernandes@yahoo.com.

br

ndice

1. VARIVEIS COMPOSTAS HOMOGNEAS. ERROR: REFERENCE SOURCE NOT FOUND


1.1 Variveis Indexadas Uni Dimensionais(Vetores).....................................Error: Reference source not found 1.1.1 Exerccios 10:.........................................................................................................................................6 1.2 Variveis Indexadas Bidimensionais(Matrizes)........................................Error: Reference source not found 1.2.1 Exerccios 11:.......................................................................................................................................10 2. Tipo Record..................................................................................................Error: Reference source not found 2.1.1 3. Exerccios 1 :........................................................................................................................................13

Tipos Definidos Pelo Usurio e Constantes...............................................Error: Reference source not found 3.1 Tipos Definidos Pelo Usurio...................................................................Error: Reference source not found 3.1.1 Exerccios 2 :........................................................................................................................................14 3.2 Constantes.................................................................................................Error: Reference source not found 3.2.1 Exerccios 3 :........................................................................................................................................16

4.

Sub-Rotinas..................................................................................................Error: Reference source not found 4.1 Procedure..................................................................................................Error: Reference source not found 4.1.1 Exerccios 4 :........................................................................................................................................18 4.2 Variveis Globais e Locais.......................................................................Error: Reference source not found 4.2.1 Exerccios 5 :........................................................................................................................................20

5.

Passagem de Parmetros............................................................................Error: Reference source not found 5.1.1 5.1.2 Exerccios 6 :........................................................................................................................................23 Exerccios 7 :........................................................................................................................................25

6.

Function........................................................................................................Error: Reference source not found 6.1.1 Exerccios 8 :........................................................................................................................................27

7.

Recursividade...............................................................................................Error: Reference source not found 7.1.1 Exerccios 8 :........................................................................................................................................29

8.

Unit................................................................................................................Error: Reference source not found 8.1.1 Exerccios 9 :........................................................................................................................................32

9.

Arquivos........................................................................................................Error: Reference source not found 9.1 Arquivos FILE...........................................................................................Error: Reference source not found 9.1.1 Exerccios 10 :......................................................................................................................................39 9.2 Arquivos TEXT..........................................................................................Error: Reference source not found 9.3 Sub-Rotinas para Tratamento de Arquivos TEXT....................................Error: Reference source not found 9.3.1 Exerccios 11 :......................................................................................................................................43

10. 10.1 10.2 10.3

Alocao Dinmica..................................................................................Error: Reference source not found Introduo.................................................................................................Error: Reference source not found Definio de Pointers................................................................................Error: Reference source not found Rotinas para Alocao de Memria:........................................................Error: Reference source not found 2

10.4 Atribuio de Valores...............................................................................Error: Reference source not found 10.4.1 Exerccios:............................................................................................................................................46 11. 11.1 Lista Simplesmente Encadeada..............................................................Error: Reference source not found Definio...................................................................................................Error: Reference source not found

11.2 Criando Listas na Memria......................................................................Error: Reference source not found 11.2.1 Exerccios:............................................................................................................................................52 12. Lista Duplamente Encadeada.................................................................Error: Reference source not found 12.1.1 Exerccios:............................................................................................................................................56

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.1Variveis 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>; 4

END. 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 2 3 4 5 6 7 8 9 10

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 5

READ(Nomes[i]); END.

1.1.1Exerccios 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. 6

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 40o 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: 7

EMPREGADOS 224 1 MESES 17 1

1731 2 3 2

2210 3 9 3

4631 4 2 4

526 300 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= e B= construmos a tabela C= 1 2 3 4 5 6 7 2 4 5 1 3 6 7

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.2Variveis 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)


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. ALGORITMO Exemplo; VARIVEIS MAT : MATRIZ [1:4,1:4] DE REAL INICIO <Comandos> FIM Em pascal: 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>]); 9

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 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.1Exerccios 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: 10

Mat 1 4

2 5

3 6 Total

Somalinha 6 15 21

11

2.Tipo Record
Os tipos de dados que so mais comumente usados, e que foram vistos com maior nfase em programao I, so : 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 Pessoa, devemos faz-lo da seguinte forma: Algoritmo 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 12

devemos indicar o Nome da varivel, seguido de um ponto(.), seguido do Nome do campo. 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.1Exerccios 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

13

3.Tipos Definidos Pelo Usurio e Constantes

3.1Tipos 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 Matriz = ARRAY[1..4,1..4] OF INTEGER VAR 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.1Exerccios 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: Departamento Funo Salrio: 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. 14

Emitir um relatrio dos funcionrios que trabalhem na contabilidade e que tenham mais de dois filhos menores de 18 anos 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.2Constantes
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 CONSTANTE SetaParaBaixo=CHR(24) INICIO <Comandos> FIM Pascal CONST SetaParaBaixo=CHR(24) 15

BEGIN <Comandos>; END 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 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 Pascal PROGRAM Teste; CONST TotalLinhas = 10; TotalColunas = 20; TYPE matriz = ARRAY[ 1..totallinhas, 1 ..totalcolunas] OF INTEGER; VAR Mat lin,col BEGIN FOR lin : = 1 TO totallinhas DO BEGIN FOR col: = 1 TO totalcolunas DO BEGIN READ(mat[lin,col]); END; END; END. : matriz; : BYTE;

3.2.1Exerccios 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. 16

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.1Procedure
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 17

PROGRAM Teste; VAR 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.1Exerccios 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.2Variveis 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] PROCEDURE Setanome INICIO LEIA (Nome) FIM INICIO Setanome ESCREVA (Nome) FIM Pascal PROGRAM Teste; VAR Nome : STRING[80]; PROCEDURE Setanome; BEGIN READ(Nome); END; BEGIN Setanome; WRITE(Nome); 18 (varivel global) {varivel global}

END 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. 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 EscreveNoVdeo; END; 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 19

INICIO Setanome ESCREVA (Nome) mudana ESCREVA (Nome) FIM 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.1Exerccios 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:

X 2 2 X 3 3X 4 4 X 5 5X 6 nX ( n +1) Y =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.

20

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 : INTEIRO Funcionrio : STRING PROCEDURE EscreveNome(N : INTEGER; Nome : STRING) VARIAVEIS I : INTEIRO INICIO PARA i DE 1 ATE n FACA ESCREVA (Nome) FIM PARA FIM INICIO LEIA (Nmero, Funcionrio) EscreveNome (Nmero, Funcionrio) FIM Pascal PROGRAM Teste; VAR Nmero : INTEGER; 21

Funcionrio

: STRING;

PROCEDURE EscreveNome(N : INTEGER; Nome : STRING); VAR I : INTEGER; BEGIN FOR i : = 1 TO n DO BEGIN WRITE(Nome); END; END; BEGIN READ(Nmero, Funcionrio); EscreveNome(Nmero, Funcionrio); END. 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.

22

5.1.1Exerccios 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 A 5 FIM INICIO X 10 PorValor (X) ESCREVA (X) FIM Pascal PROGRAM Teste; VAR X : INTEGER; PROCEDURE PorValor(A : INTEGER); BEGIN A : = 5; END; BEGIN X : = 10; PorValor(X); WRITE(X); END. 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 A 5 FIM 23

INICIO X 10 PorReferncia(X) ESCREVA (X) FIM Pascal PROGRAM Teste; VAR X : INTEGER; PROCEDURE PorReferncia(VAR A: INTEGER); BEGIN A : = 5; END; BEGIN X : = 10; PorReferncia(X); WRITE(X); END. 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 24

Pascal PROGRAM Teste; CONST Mximo = 50 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 LeInfo(Vetor, Reg); END.

5.1.2Exerccios 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) 25

6.Function
Sintaxe: 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 K Soma(2,3) ESCREVA (K) FIM Pascal PROGRAM Teste; VAR K : BYTE; FUNCTION Soma(V1, V2 : BYTE) : BYTE; BEGIN 26

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

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


50

50

1 n!

d) Calcular:

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.

27

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; 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;

b)

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.

28

Segue abaixo uma representao das variveis e seus contedos em cada uma das chamadas: 1a Chamada 2a 3a 4a 5a 6a 7a Chamada Chamada Chamada Chamada Chamada Chamada A=80 A=40 A=20 A=10 A=5 A=2 A=1 Valor=40 Valor=20 Valor=10 Valor=5 Valor=2 Valor=1 Valor=0

7.1.1Exerccios 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. 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.

b)

29

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.

30

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 sub-Rotinas 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.

31

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. Como complementao do Exemplo vamos construir um pequeno programa que use a sub-Rotina definida acima: PROGRAM Testa_Unit; USES Tela; BEGIN Escreve_Str(10, 10, Teste de Unit); END;

8.1.1Exerccios 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.

32

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.1Arquivos 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 N 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. 33

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_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.

34

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.

35

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.

36

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.

37

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.

38

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.1Exerccios 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.

39

9.2Arquivos 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.3Sub-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.

40

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. 41

Sintaxe : WRITE(Meu_Arquivo, informao) ou WRITELN(Meu_Arquivo, Informao) Exemplo: 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 42

Arquivo : TEXT; Reg : registro; BEGIN ASSIGN(Arquivo, Dados.Dat); 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 ASSIGN(Arquivo, Dados.Dat); ERASE(Arquivo); END.

9.3.1Exerccios 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).

43

10.Alocao Dinmica

10.1Introduo
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.2Definio 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:

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. 44

Sintaxe para definio: <Nome da varivel> : ^<tipo> 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.3Rotinas 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.

45

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:

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.4Atribuio 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.

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.1Exerccios:
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 46

memria. 3. Percorra o ARRAY definido acima e escreva quantos caracteres A, E, I, O e U existem no mesmo. 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.

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.

47

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.1Definio
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.

11.2Criando 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: 48

PROGRAM AINDA_T_ERRADO; TYPE REGISTRO = RECORD Nome Idade Sexo Ender END; BEGIN <comandos>; END.

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

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:

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.

49

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

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.

50

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. uma pessoa,

51

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.1Exerccios:
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 sub-Rotina 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.

52

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

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.

53

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.

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 54

Novo_Nodo : Ap_Nodo; BEGIN NEW ( Novo_Nodo); 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. uma pessoa,

55

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.1Exerccios:
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 sub-Rotina 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.

56

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

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.

57

Vous aimerez peut-être aussi