Вы находитесь на странице: 1из 125

Pascal

Abril/2008

A LINGUAGEM PASCAL
ESTRUTURA DE UM PROGRAMA PASCAL
Um programa em pascal consiste de um Cabealho ( program header ) seguido por uma Seo de
Declaraes, onde todos os objetos locais so definidos, e de um Corpo, onde so especificados, atravs
de comandos, as aes a serem executadas sobre os objetos.

PROGRAM Nome_Do_Programa;
{ Cabealho }
[ declarao de units
]
[ declarao de rtulos
]
[ declarao de constantes
]
{ Seo de Declaraes }
[ declarao de tipos
]
[ declarao de variveis ]
[ declarao de subprogramas ]
begin
comando [ ; comando] ...
{ Corpo do Programa }
end.

Cabealho do Programa.
O cabealho consiste da palavra reservada Program seguida de um identificador que corresponde ao
nome do programa, terminando com um ponto e vrgula.
Exemplos:
program Circulo;
program Relatrio;

Seo de Declaraes
A sintaxe do pascal requer que todos os identificadores usados no programa sejam predefinidos ou que
sejam declarados antes que voc possa us-los.
A declarao de identificadores feita na seo de declarao onde so associados nomes aos objetos
que sero usados no programa, tais como tipos de dados, variveis e subprogramas.

Corpo do Programa
Onde so especificadas, atravs dos comandos da linguagem, as aes do programa. a onde fica lgica
do programa.
program Exemplo;
var
I : integer;
begin
for I := 1 to 100 do
if I mod 7 = 0 then
writeln( I:5, e divisvel por 7);
end.
Pgina 2

O TURBO PASCAL
O Turbo Pascal mais que um simples compilador da linguagem Pascal, ele um Ambiente Integrado de
Desenvolvimento ( IDE - Integrated Development Environment ), consistindo de um conjunto de
ferramentas de desenvolvimento integradas. Entre as ferramentas que compem o Turbo Pascal temos:

Editor de Cdigo-Fonte
Compilador
Link-Editor
Depurador
Ajuda On-Line da Linguagem e do prprio IDE

Principais Comandos do Turbo Pascal :

Compilar o programa : ALT + F9


Compilar e Executar o Programa : CTRL + F9
Acessar o Menu : ALT + Letra realada.
Criar um novo programa : menu FILE | NEW
Salvar o programa atual : F2
Sair do Turbo Pascal : ALT + X
Ver tela com os resultados do programa executado : ALT + F5

ELEMENTOS DA LINGUAGEM PASCAL


IDENTIFICADORES
Os identificadores so nomes a serem dados a variveis, tipos definidos, procedimentos, funes e
constantes nomeadas.
Os identificadores so formados com letras de a at z, dos dgitos de 0 at 9 e dos caracteres
especiais _ . Um identificador deve comear com uma letra ou com _ e deve ser nico nos primeiros
16 caracteres ( no Turbo Pascal so considerados os 63 primeiros caracteres ).
No existe distino entre letras maisculas e minsculas no nome de um identificador. Por exemplo, os
nomes ALPHA, alpha e Alpha so equivalentes. Ateno para o fato de que identificadores muito longos
so mais fceis de serem lidos pelas as pessoas quando se usa uma mistura de letras maisculas e
minsculas; por exemplo, SalarioMinimo mais fcil de se ler do que SALARIOMINIMO.

Exemplos de identificadores vlidos:


PAGAMENTO
Soma_Total
MaiorValor
Media1
_Media

Pgina 3

Exemplos de Identificadores Invlidos:


%Quantidade
4Vendedor
Soma Total

O smbolo % no permitido
No pode comear com um nmero
No pode ter espaos entre as letras

Observao : Um identificador dever ficar inteiramente contido em uma linha do programa, ou seja
voc no pode comear a digitar o nome do identificador numa linha e acabar em outro.

PALAVRAS RESERVADAS
Pascal reconhece certo grupo de palavras como sendo reservadas. Essas palavras tem significado
especial e no podem ser usadas como identificadores em um programa. A seguir listamos todas as
palavras reservadas do Pascal Padro:

Palavras reservadas do Pascal Padro:


and
array
begin
case
const
div
do
downto
else

end
file
for
foward
function
goto
if
in
label

mod
nil
not
of
or
packed
procedure
program
record

repeat
set
then
to
type
until
var
while
with

shl
unit
object

until
uses
string

Palavras Reservadas do Turbo Pascal :


asm
constructor
interface
destructor

implementation
inline
shr
xor

COMENTRIOS
Comentrios so textos escritos dentro do cdigo-fonte para explicar ou descrever alguns aspectos
relativos ao mesmo. Os comentrios podem ser colocados em qualquer lugar do programa onde um
espao em branco possa existir.
Voc pode colocar comentrios de duas formas: ou envolvendo o texto entre chaves {..} ou entre (* ..
*).
Quando o compilador encontra o smbolo { ele salta todos os caracteres at encontrar um }. Da
mesma forma, todos os caracteres que seguem (* so pulados at ser detectado o smbolo *). Como
resultado disso, qualquer uma das formas pode ficar dentro da outra; por exemplo {...(*...*)...} um
comentrio.
Uma utilidade de se usar comentrios dentro de comentrios quando queremos escrever alguns
comandos temporrios dentro do programa ( talvez para depurao ), como ilustramos abaixo:
Pgina 4

(*
if A = 10 then { este comando somente para depurao }
write( A e igual a 10 );
*)

TIPOS DE DADOS
Um tipo de dados especifica as caractersticas, ou seja os valores e operaes possveis de serem
utilizados com um dado desse tipo. Toda varivel e constante usada em um programa tem um tipo
associado a ela.

CATEGORIAS
Os tipos podem ser divididos em trs categorias :
TIPO ESCALAR ( SIMPLES ): representa uma nica pea de dados, podendo ser ordenados, isto ,
seus valores mantm um certa ordem. Os tipos integer, char, boolean, enumerado e subintervalo so
ordinais, j o tipo real no ordenado.
Ex.:

integer
real
boolean
char
Enumerado
Subintervalo

Nmeros inteiros
Nmeros reais
Valores lgico TRUE ou FALSE
Caracteres da Tabela ASCII
Relao de Valores em ordem
Faixa de valores ordenados

TIPO ESTRUTURADO : representa uma coleo de itens de dados Ex.:

string
array
record
set
file
text

Cadeia de caracteres
Conjunto de elementos de mesmo tipo
Conjunto de elementos de tipos diferentes
Conjunto de elementos
Arquivos de registro
Arquivos texto

TIPO APONTADOR : representa uma pea de dados que referencia ou aponta para outra pea de
dados
Ex.:

pointer

Referncia para uma varivel dinmica

O programador tambm pode criar seus prprios tipos, como ser visto posteriormente. No entanto o
Pascal j oferece um conjunto de tipos predefinidos, so eles :

Pgina 5

TIPOS DE DADOS ESCALARES


INTEGER
O tipo INTEGER representa os nmeros inteiros. O Turbo Pascal permite cinco tipo predefinidos de
nmeros inteiros, cada um abrange um subconjunto dos nmeros inteiros. Todos os tipos inteiros so
ordinais (ordenados).
So eles:
TIPO
Shortint
Integer
Longint
Byte
Word

FAIXA DE VALORES
-128..127
-32768..32767
-2147483648..2147483647
0..255
0..65535

No. De BYTES
Com sinal 8-bits
Com sinal 16-bits
Com sinal 32-bits
Sem sinal 8-bits
Sem sinal 16-bits

Ex.:
var
NumAlunos
: integer;
Cont
: integer;

REAL
O tipo REAL representa os reais. O Turbo Pascal permite cinco tipo predefinidos de nmeros reais,
cada um com um faixa de valores e preciso especficas. Todos os tipos reais no so ordinais.
So eles:
TIPO
real
single
double
extended
comp

FAIXA
DE
VALORES
2.9e-39..1.7e38
1.5e-45..3.4e38
5.0e-324..1.7e308
3.4e4932..1.1e4932
-9.2e18..9.2e18

No. de BYTES
6
4
8
10
8

var
Nota : real;
Salario : real;

Pgina 6

BOOLEAN
O tipo BOOLEAN representa os valores lgicos TRUE e FALSE. O tipo BOOLEAN ordinal, onde :
FALSE < TRUE.
var
Aprovado : boolean;
Confirma : boolean;

CHAR
O tipo CHAR representa um nico caracter pertencente tabela ASCII.
var
Sexo : char;

TIPO ENUMERADO ( ENUMERATED )


O tipo escalar enumerado um escalar ordenado onde os valores que as variveis deste tipo podem
assumir so descritos atravs de uma lista de valores. Cada valor um identificador o qual tratado
como uma constante. Isto permite que nomes significativos sejam associados a cada valor usado para as
variveis.
A definio de um tipo enumerado feita colocando-se entre parnteses os identificadores que as
variveis podem assumir, separados por vrgulas, como mostrado a seguir:
var
Dias : ( Domingo, Segunda, Terca, Quarta, Quinta, Sexta, Sabado );
Nesse caso, os valores tm a seguinte ordem :

Domingo < Segunda < Terca < Quarta < Quinta < Sexta < Sabado
Ex.:
program Totaliza_Horas_De_Trabalho;
var

Dias
Meses

:(Domingo,Segunda,Terca,Quarta,Quinta,Sexta,Sabado);
:(Jan,Fev,Mar,Abr,Mai,Jun,Jul,Ago,Set,Out,Nov,Dez);

TotalHoras, HorasDeTrabalho : integer;


begin

. . .
TotalHoras := 0;
for Dias := Segunda to Sabado do
begin
readln( HorasDeTrabalho );
TotalHoras := TotalHoras + HorasDeTrabalho;
end;

. . .
end.

TIPO SUBINTERVALO ( SUBRANGE )


O Pascal admite tambm um tipo denominado subintervalo ( subrange ) que representa um subconjunto
de valores de tipos escalares ordenados.
Pgina 7

Uma varivel do tipo subintervalo declarada da seguinte forma :


var
NumDiadoMes
: 1..31;
LetrasMaiusculas : A..Z;
DiaDoAno
: 1..365;

TIPOS DE DADOS ESTRUTURADOS


STRING
Armazena uma cadeia de caracteres com o tamanho mximo de at 255 caracteres, mas podemos ser
especificar um tamanho menor que 255. Esse tipo permite a concatenao utilizando-se o operador +.
var
Frase : string;
Nome : string[45];

OBS.: Os demais tipos estruturados e apontadores sero vistos posteriormente.

VARIVEIS
Uma varivel um valor que pode ser alterado dentro de um programa. Todas as variveis usadas num
programa devem ser declaradas usando a clusula VAR, dentro da seo de declaraes. Nesse
comando, alm de indicar o nome que deseja para as variveis, indica-se tambm qual o tipo que as
mesmas esto associadas.

Sintaxe:
var identif [ , identif ]... : tipo-do-dado;
[ identif [ , identif ]... : tipo-do-dado; ] ...
O tipo-do-dado um dos tipos predefinidos ou um tipo definido pelo usurio:
Ex.:
var
Soma, Total, Salario

: real;

Idade, Contador
Ms
Dias

: integer;
: 1..12;
: (SEG, TER, QUA, QUI, SEX, SAB, DOM );

CONSTANTES
Uma constante um valor que no pode ser alterado durante a execuo do programa.
As constantes podem ser divididas nas seguintes categorias de acordo com o tipo predefinido a que elas
pertencem:

INTEIRAS

Representadas pelos nmeros inteiros.


Ex.: 1230 , -1234 , 0 , 9
Pgina 8

REAIS

LITERAIS

ARRAY
RECORD

Representadas pelos nmeros reais.


Ex.: 12.57, 100, 100.00, -100.23
23.45e-5 = 23.45E-5 = 23.45x10-5
Representadas pelos caracteres colocados entre apstrofos.
Ex.: Isto um exemplo
Bem vindo a Sergipe
Voce o 1 colocado
- Literal Vazia
Representadas por um array.
Representadas por um record

Pgina 9

CONSTANTES PREDEFINIDAS
O Pascal Padro possui trs identificadores que representam constantes, so eles :
MAXINT - Representa o maior inteiro possvel.
TRUE e FALSE - Representam os valores de uma varivel do tipo boolean.

CONSTANTES NOMEADAS
Em um programa possvel se associar um identificador a uma constante, de forma que sempre que nos
referirmos a esse identificador, estaremos nos referindo ao valor da constante.

Sintaxe:
const

NumDias = 7;
{ tipo integer }
NumAulas = 14;
{ tipo integer }
PI
= 3.141519265;
{ tipo real }
Esporte
= Futebol de Campo; { tipo literal }
FatorCalculo = ( PI * 13.5 ) + 9;
{ tipo real }
AulasDia = NumAulas / NumDias; { tipo real }
Exemplo :
program Area_Circulo;

{
Programa para calcular a rea de um crculo.

}
const
PI = 3.141519265;
var
Area, Comprimento, Raio
: real;
BEGIN
writeln( Digite o Raio : );
readln( Raio );
Area
:= PI * Raio * Raio;
Comprimento := 2 * PI * Raio;
writeln( rea = , Area );
writeln( Comprimento da Circunferencia = , Comprimento );
END.

Pgina 10

CONSTANTES TIPADAS
Constantes tipadas so constantes que tm tipo definido, mas que podem ter seu contedo alterado da
mesma forma que uma varivel. Na declarao de uma constante tipada especificado tanto o tipo
quanto o valor inicial da constante.
const

NumDias : integer = 7;
{ tipo integer }
NumAulas : integer = 14;
{ tipo integer }
PI
: real
= 3.141519265;
{ tipo real
}
Esporte : string[20] = Futebol de Campo;
{ tipo literal }
Fator
: real
= ( PI * 13.5 ) + 9; { tipo real }
AulasDia : real
= NumAulas / NumDias; { tipo real }
program Area_Circulo;

{
Programa para calcular a rea de um crculo.

}
const
PI : real = 3.141519265;
Raio : real = 1;
var
Area, Comprimento : real;
BEGIN
writeln( Digite o Raio : );
readln( Raio );
Area
:= PI * Raio * Raio;
Comprimento := 2 * PI * Raio;
writeln( rea = , Area );
writeln( Comprimento da Circunferencia = , Comprimento );
END.

Pgina 11

DECLARAO DE TIPOS ( TYPE )


Uma declarao de tipo, permite que se associe um identificador descrio de um tipo. Uma vez
declarado, tal identificador pode ser usado da mesma forma que o nome de um tipo predefinido.

Sintaxe:
type ident = descrio-do-tipo;
[ident = descrio-do-tipo;] ...
Onde:
ident = o nome que passar a identificar o tipo definido.
Descrio-do-tipo = a descrio de um tipo vlido em Pascal.

Exemplo:
program Uso_Do_Type;
type
TDias = (Dom,Seg,Ter,Qua,Qui,Sex,Sab );
TMeses= (Janeiro, Fevereiro, Marco, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro,
Novembro, Dezembro );
TMaiusculas = A..Z;
TContador = 1..MAXINT;
Boolean
= ( FALSE, TRUE );
var
Dias
: TDias;
Meses
: TMeses;
DiasUteis : Seg..Sex;
I, J
: TContador;
BEGIN
...
END.

Pgina 12

EXPRESSES
Uma expresso um conjunto de operandos unidos por operadores, de forma a computar um valor ou
resultado.
Os operandos podem ser variveis, constantes ou valores gerados por funes.
Os operadores identificam as operaes a serem efetuadas sobre os operandos. Cada tipo de dados
possui um conjunto de operadores relacionados. Os operadores classificam-se em Unrios e Binrios,
conforme tenham um ou dois operandos, respectivamente.

Prioridade das Operaes


Se vrios operadores aparecerem em uma expresso, a ordem de execuo das operaes ser dada
segundo os critrios abaixo :
pelo emprego explcito de parnteses
pela ordem de precedncia existente entre os operadores
se existirem operadores de mesma ordem de precedncia, a avaliao ser feita da esquerda para a
direita.
Ordem de Precedncia dos Operadores ( da maior para a menor )

Operadores
( )
@ not
* / div mod
and shl shr + - or xor
= <> < > <= >= in

Categoria
Parntesis
Operadores Unrios
Operadores Multiplicativos
Operadores Aditivos
Operadores Relacionais

Tipos de Expresses
Existem trs tipos bsicos de expresses:
Numricas: Uma expresso numrica quando os seus operandos so numricos ( inteiros ou reais
) e o resultado tambm um valor numrico. Nas expresses relacionais so usados os operadores
Aritmticos e os de Manipulao de Bits.
Literais: Uma expresso literal quando os seus operandos so literais do tipo string (no pode
ser char) e o resultado tambm um valor literal. S existe um nico operador para se usar em
expresses literais, o operador Concatenao( + ).
Boolenas: Uma expresso booleana quando seu resultado do tipo boolean (TRUE ou FALSE),
podendo seu operando serem de qualquer tipo de dados. Nas expresses relacionais so usados os
operadores Lgicos e os Relacionais.

Tipos de Operadores

Aritmticos
Manipulao de Bits
Concatenao
Relacionais
Lgicos
Atribuio
Pgina 13

Operadores de Ponteiros
Operadores de Conjuntos
Operador Type-Cast

Pgina 14

OPERADORES ARITMTICOS
Usados para efetuar operaes aritmticas com nmero inteiros e reais.

Subtrao
Adio
Multiplicao
Diviso Real
Diviso Inteira ( truncada )
Resto da Diviso Inteira
Inverte Sinal
Mantm Sinal

+
*
/
div
mod
+

Exemplo:
var
A, B : integer;
C, D : real;
BEGIN
A := 1;
B := 3;
C := 5;
D := 10;
A := 1 + B;
A := B + D; { errado, D real }
B := 10 div 3;
A := 10 mod 3;
C := D / C;
D := 10 div C;
{ errado, o operado div s para inteiros }
A := -1;
B := 5 + A;
B := -A;
C := D * A;
B := C * B; { errado, C real }
END.

Pgina 15

OPERADORES DE MANIPULAO DE BITS


Usados para efetuar a manipulao dos bits de uma varivel.

E binrio

and
Deslocamento de bits ( Shift Left ) shl
Deslocamento de bits ( Shift Right ) shr
OU binrio
or
XOR binrio
xor
NOT binrio
not
OPERADOR CONCATENAO ( + )
Efetua a juno de duas variveis ou constantes do tipo string.
Exemplo:
var
PreNome, SobreNome, NomeCompleto : string[ 30 ];
BEGIN
{ Suponhamos o nome Josias Lima Santos }
PreNome
:= Josias;
SobreNome := Santos;
NomeCompleto := PreNome + SobreNome;
writeln( NomeCompleto );
NomeCompleto := Jose + Maria;
writeln( NomeCompleto );
...
END.
OPERADORES RELACIONAIS
Usados para efetuar a comparao entre dados de mesmo tipo.

Maior que
Menor que
Maior ou igual
Menor ou igual
Igual
Diferente

>
<
>=
<=
=
<>

Pgina 16

Exemplo:
var
Nota1, Nota2 : real;
NomeAluno1, NomeAluno2 : string[ 30 ];
A, B, C : integer;
BEGIN
A := 2;
B := 3;
C := 1;
if B = A + C then
writeln( B );
Nota1 := 5.0;
Nota2 := 10.0;
if Nota1 < Nota2 then
writeln( Nota1 );
NomeAluno1 := Maria Jose;
NomeAluno2 := MariaJose;
if NomeAluno1 < NomeAluno2 then
writeln( NomeAluno1 );
END.
OPERADORES LGICOS
Usado para se analisar duas ou mais expresses interrelacionadas.

E
OU
NO

and
or
not

Exemplo:
var
Nota1, Nota2 : real;
NomeAluno1, NomeAluno2 : string[ 30 ];
A, B, C : integer;
BEGIN
A := 2;
B := 3;
C := 1;
NomeAluno1 := Maria Jose;
NomeAluno2 := MariaJose;
if ( B = A + C ) and ( NomeAluno1 <> NomeAluno2 ) then
writeln( NomeAluno1, B );
if ( A = C ) or ( NomeAluno1 = NomeAluno2 ) then
writeln( NomeAluno1 );
if not( A = C ) then
writeln( NomeAluno1 );
END.
Pgina 17

TABELAS VERDADE
OPERADOR AND

OPERANDO 1
TRUE
TRUE
FALSE
FALSE

OPERANDO 1
TRUE
FALSE
TRUE
FALSE

RESULTADO
TRUE
FALSE
FALSE
FALSE

OPERANDO 1
TRUE
FALSE
TRUE
FALSE

RESULTADO
TRUE
TRUE
TRUE
FALSE

OPERADOR OR

OPERANDO 1
TRUE
TRUE
FALSE
FALSE
OPERADOR NOT

OPERANDO
TRUE
FALSE

RESULTADO
FALSE
TRUE

OPERADOR ATRIBUIO ( := )
Usado para atribuir o valor de uma expresso a uma varivel.
Exemplo:
A := 10;
Nome := Josias;
OPERADORES DE PONTEIROS
Usado na manipulao de variveis dinmicas e apontadores.

Endereo
Referncia

@
^

OPERADORES DE CONJUNTOS
Usados na manipulao de variveis do tipo conjunto.

Unio

Pertinncia

+
*
=
<>
<= , >=
in

Acesso a campos

Complemento
Intercesso
Igualdade
Desigualdade
Subconjunto

Pgina 18

Pgina 19

OPERADOR TYPE-CAST ( tipo( x ) )


Usados para alterar o tipo de uma expresso.

Exemplo:
type
TDias = ( Dom, Seg, Ter, Qua, Qui, Sex, Sab );
var
Dia : TDias;
NumDia : 0..6;
TudoOk : boolean;
Opcao : char;
NumOp : byte;
BEGIN
readln( NumDia );
Dia
:= TDias( NumDia );
TudoOk
:= boolean( 1 );
NumOp
:= byte( opcao );
END.

Pgina 20

FUNES PRE-DEFINIDAS
O Pascal oferece um conjunto de funes predefinidas (built-in functions), que so usadas com vrios
tipos de dados simples. As funes, na maioria das vezes, necessitam de dados como parmetro (dados
de entrada). Vejamos algumas dessas funes:

Funes Matemticas
Nome
da Objetivo
Funo
abs( x )
Calcula o valor absoluto de x.
arctan( x ) Calcula o arco-tangente de x em
radianos
cos( x )
Calcula o coseno de x em radianos
exp( x )
Calcula ex, em que e=2.7182818

Tipo
do
Parmetro
inteiro ou real
inteiro ou real

Tipo
do
Retorno
o mesmo que x
real

inteiro ou real
inteiro ou real

real
real

inteiro ou real

real

inteiro ou real
inteiro ou real
inteiro ou real
inteiro

real
o mesmo que x
real
boolean

nenhum

nenhum

inteiro

real

nenhum

real

sistema natural de logaritmos


neperianos.
ln( x )
sin( x )
sqr( x )
sqrt( x )
odd( x )
randomize

random( x )

pi

Calcula o logaritmo natural de x


(x>0)
Calcula o seno de x em radianos
Calcula o quadrado de x
Calcula a raiz quadrada de x (x>=0)
Determina se x par ou impar
TRUE, X par / FALSE, X impar
Inicia o gerador de nmeros
aleatrios coma hora do Sistema
Operacional
Retorna
um
nmero
pseudoaleatrio entre 0 e x. Se x no for
especificado retorna um valor
entre 0.0 e 1.0
Retorna o valor de PI (3.1415...)

Funes Literais
Nome Funo

Objetivo

length( x )

Determina o nmero
caracteres de x
Concatena duas ou mais string
strings (mx 255 caracteres)
Retorna uma subcadeia da string,
cadeia x, com z caracteres, inteiro,

concat( x1, x2, x3,...)


copy( x, y, z )

Tipo
do Tipo
Parmetro
Retorno
de string
inteiro
string
string

Pgina 21

do

Nome Funo

pos( x, y )

delete( x, y, z )

Insert( x, y, z )

UpCase( x )

Objetivo

Tipo
do Tipo
Parmetro
Retorno
comeando no caracter y.
inteiro
Retorna a posio da cadeia x String, string inteiro
dentro da cadeia y, se no for
encontrada retorna 0.
Remove z caracteres da string,
nenhum
cadeia x a partir da posio y inteiro,
inteiro
Insere
a
cadeia
de string, string, nenhum
caracteres x na cadeia y a inteiro
partir da posio z (max 255
)
Retorna x convertido para char
char
maiscula

Pgina 22

do

Funes para Converso


Nome Funo

Objetivo

Tipo
do Tipo do
Parmetro
Retorn
o
Trunca x para um nmero inteiro
real
inteiro
Retorna a parte inteira de x
real
real
Retorna a parte fracionria de x
real
real
Arredonda x para um inteiro
real
inteiro
Determina o caracter ASCII inteiro
char
representado por x
Determina o inteiro que usado char
inteiro
para codificar x
Muda o tipo de x para tipo
qualquer
tipo

trunc( x )
int( x )
frac( x )
round( x )
chr( x )
ord( x )

tipo( x )

Funes de Uso Geral


Nome
Funo
inc (x,[y])
pred( x )
succ( x )
sizeof( x )

Objetivo
Incrementa x de y unidade
Determina o predecessor de x
Determina o sucessor de x
Retorna o nmero de byte de x

Tipo
do
Parmetro
tipo ordenado
tipo ordenado
tipo ordenado
qualquer tipo

Tipo
do
Retorno
o mesmo de x
o mesmo de x
o mesmo de x
inteiro

Pgina 23

COMANDOS ESTRUTURADOS
Comando Composto
Consiste de um ou vrios comandos que devam ser executados seqencialmente, sendo usado em
situaes onde a sintaxe de alguns comandos do Pascal permite apenas um nico comando.
Os comandos que fazem parte do comando composto so separados por ponto-e-vrgula, devendo
comear e terminar pelas palavras reservadas begin e end, respectivamente, de acordo com a sintaxe :
begin
comando [ ; comando ]...
end;
Exemplo:
if A > B then
begin
Temp := A;
A := B;
B := Temp;
end;

Pgina 24

Comandos Condicionais
IF-THEN-ELSE
O comando IF-THEN-ELSE permite efetuarmos um desvio bidirecional na lgica do programa, segundo
uma determinada condio booleana.

Sintaxe:
if exp-booleana then
comando
[else
comando; ]
Exemplo:
if A <= B then
A := ( A + 1 ) / 2
if odd( I ) then
J := J + 1
else
J := J div 2 + 1;
if Nome1 = Jose then
begin
J := J div 2 + 1;
writeln( J * 2 );
end;
if Media >= 5 then
begin
writeln( Aluno Aprovado );
writeln( Parabns !!! );
end
else
writeln( Aluno Reprovado );
if Sexo = MASCULINO then
if Idade > 18 then
begin
writeln( Jovem, aliste-se no Exrcito, Marinha ou Aeronautica! );
writeln( Sirva sua ptria, venha fazer uma carreira brilhante );
end
else
writeln( Voc ainda muito jovem para o servio militar );
if Sexo = MASCULINO then
begin
if Idade > 18 then
begin
Pgina 25

writeln(
writeln(
end
else
writeln(
writeln(
end;

Jovem, aliste-se no Exrcito, Marinha ou Aeronautica! );


Sirva sua ptria, venha fazer uma carreira brilhante );

Voc ainda muito jovem para o servio militar );


Qual o seu Nome ? );

Pgina 26

Comando CASE
O comando CASE permite efetuarmos um desvio multidirecional na lgica do programa. Ele consiste de
um expresso ( chamada seletor ) e uma lista de comandos, cada um precedido por constantes ou
subintervalos separados por vrgulas ( chamados rtulos de case ), de mesmo tipo do seletor, que pode
ser qualquer escalar ordenado ( integer, char, boolean, enumerated, faixa ).

Sintaxe :
case expresso of
rotulo-case : comando;
[rotulo-case : comando;]...
[else
comando [; comando ]...
end;

Exemplo:
program Figuras;
type
TFigura = ( Triangulo, Retangulo, Quadrado, Circulo );
var
Figura : TFigura;
Tipo : integer;
BEGIN
writeln( Qual o tipo da figura ? );
writeln( 0-Triangulo );
writeln( 1-Retangulo );
writeln( 2-Quadrado );
writeln( 3-Circulo );
readln( Tipo );
Figura := TFigura( Tipo );
case Figura of
Triangulo : writeln( Voc escolheu a figura Triangulo );
Retangulo : writeln( Voc escolheu a figura Retangulo );
Quadrado : writeln( Voc escolheu a figura Quadrado );
Circulo : writeln( Voc escolheu a figura Circulo );
end;
END.

Pgina 27

program TestaTecla;
{ Programa para testar a tecla pressionada }
var Tecla : char;
BEGIN
writeln( Pressione uma Tecla : );
readln( Tecla );
case Tecla of
A..Z, a..z: writeln(Voc pressionou uma Letra);
0..9:
writeln(Voc pressionou um Numero);
+, -, *, /: writeln(Voc pressionou um Sinal Aritmetico);
else
writeln( Voc pressionou uma outra tecla qualquer );
end;
END.
OBS.: O Comando CASE pode ser substitudo por um conjunto de IF-THEN-ELSE aninhados, no
entanto, nesses casos, onde h muitas condies, o comando CASE, torna o programa mais legvel.
program TestaIdade;
{ Programa para testar a idade de servio militar }
var Idade : integer;
BEGIN
writeln( Qual a sua Idade ? );
readln( Idade );
case Idade >= 18 of
TRUE : writeln( Voce j pode servir ao exrcito );
FALSE : writeln( Voce ainda no pode servir ao exrcito );
end;
END.

Pgina 28

Comandos de Repetio
Comandos de repetio so aqueles que fazem com que um ou vrios comandos sejam executados
repetidas vezes.

Comando WHILE
O comando WHILE faz com que um comando seja executado enquanto a expresso de controle
permanecer verdadeira ( TRUE ).

Sintaxe :
while expressao do
comando;
A expresso que controla a repetio dever ser do tipo boolean, sendo a mesma avaliada antes que o
comando do lao seja executado. Isto quer dizer que, se logo no incio o resultado da expresso for
FALSE, o lao no ser executado nenhuma vez.
Exemplo:
program TesteWhile;
var I, J : integer;
BEGIN
I := 0;
while I < 5 do
I := I + 1;
writeln( I );
J := 0;
while J < 5 do
begin
J := J + 1;
writeln( J );
end;
END.

Pgina 29

Comando REPEAT
O comando REPEAT faz com que um comando seja executado enquanto a expresso de controle
permanecer falsa ( FALSE ). O teste da condio feito ao final do lao, dessa forma o lao sempre
executado pelo menos uma vez.

Sintaxe :
repeat
comando [;comando]...
until expressao;
A expresso que controla a repetio dever ser do tipo boolean, sendo a mesma avaliada antes que o
comando do lao seja executado. Isto quer dizer que, se logo no incio o resultado da expresso for
FALSE, o lao no ser executado nenhuma vez.
Exemplo:
program TesteRepeat;
var I, J : integer;
BEGIN
I := 0;
repeat
I := I + 1;
until I >= 5;
writeln( I );
J := 0;
repeat
J := J + 1;
writeln( J );
until J >= 5;
END.

{ No necessrio o BEGIN e END }

Pgina 30

Comando FOR
O comando FOR executa repetitivamente um comando enquanto atribudo uma srie de valores a uma
varivel de controle (contador do FOR).

Sintaxe :
for variavel := expressao1 to/downto expressao2 do
comando;
Onde :
variavel = uma varivel de controle cujo valor ser incrementado (se usado o to) ou decrementado (se
usado o downto) de uma unidade.
Expressao1 = o valor inicial da varivel de controle
Expressao2 = o valor final da varivel de controle

A varivel de controle poder ser de qualquer tipo escalar ordenado e as expresses de um tipo
compatvel com ela.
O comando FOR funciona da seguinte maneira :
Inicialmente, a varivel de controle recebe o valor da primeira expresso ( expresso1 )
Antes de comear a execuo do lao, a varivel de controle testada para verificar se ela
menor ou igual ( se for usado o TO ) ou se maior ou igual ( se for usado o DOWNTO ) segunda
expresso.
Se o resultado do teste for verdadeiro, o comando do lao executado
Ao terminar a execuo do comando do lao, a varivel de controle testada para verificar se ela
igual ao valor final
Se a varivel de controle for igual ao valor final, a repetio termina
Se no for igual, ela incrementada ou decrementada de uma unidade
Aps o trmino do comando FOR, a varivel de controle, ter o valor da Expressao2, a no ser que o
comando tenha sido interrompido por um comando goto ou break.

Exemplo :
for I := 1 to 100 do
Soma := Soma + I;
for I := 1 to 100 do
begin
readln( x );
Soma := Soma + x;
end;
for I := 100 downto 1 do
writeln( I );
type TDias = ( Dom, Seg, Ter, Qua, Qui, Sex, Sab );
var
Dia : Tdias
Vendas, VendasToal : real;
...
Pgina 31

for Dia := Seg to Sex do


begin
readln( Vendas );
VendasTotal := VendasTotal + Vendas;
end;

Pgina 32

Comando CONTINUE
O comando CONTINUE causa o desvio para o final do lao mais interno de um comando de repetio.

Exemplo:
while expressao do
begin
...
continue;
...
{ o comando continue desvia para aqui }
end;
for I := expressao1 to expressao2 do
begin
...
continue;
...
{ o comando continue desvia para aqui }
end;
repeat
...
continue;
...
{ o comando continue desvia para aqui }
until expressao;
OBS.: O comando CONTINUE no faz parte do Pascal Padro.

Pgina 33

Comando BREAK
O comando BREAK causa a sada incodicional do lao mais interno de um comando de repetio.

Exemplo:
while expressao do
begin
...
break;
...
end;
{ o comando break desvia para aqui }
...
for I := expressao1 to expressao2 do
begin
...
break;
...
end;
{ o comando break desvia para aqui }
...
repeat
...
break;
...
until expressao;
{ o comando break desvia para aqui }
...

OBS.: O comando BREAK no faz parte do Pascal Padro.

Comando HALT
O comando HALT causa o trmino imediato do programa.
Program teste;
BEGIN
...
if Opcao = F then
halt;
{O programa terminar, aqui se a condicao do IF for satisfeita
...
END.
{O programa terminar, aqui se a condicao do IF no for satisfeita}

Pgina 34

Comandos de Entrada e Sada


Comandos WRITE e WRITELN
Estes procedimentos escrevem (imprimem) valores de dados em dispositivos de sada (vdeo, impressora,
drive de disco, etc). O procedimento WRITELN escreve e passa para a prxima linha de escrita (ou
impresso). A forma geral : .
WRITE
WRITELN
( [ arq, ] val 1 , val 2, val 3, ...)

Sendo que,
a. A transmisso de argumentos opcional, podendo ser totalmente omitida.
b. O argumento ARQ direciona a escrita dos valores val1 , va12, va13, .... , para um dispositivo de sada.
Se ARQ omitido, o default normalmente o vdeo. Para enviar a "escrita" para a impressora, ARQ
LST, varivel da unit Printer.
C. Quando ARQ no do tipo FILE OF , val 1, val 2, val 3, ...,, podem ser literais, constantes simblicas,
variveis, funes, operaes aritmticas ou expresses combinando esses elementos. .
d, Quando ARQ no do tipo FILE OF , val 1, val 2, val 3, ..., podem ser apenas dos tipos elementares
inteiros, reais, caracter e booleanos, e cadeia de caracteres.
e. Quando ARQ no do tipo FILE OF , val 1, val 2, val 3, ..., podem ser formatados da seguinte forma;
<val> : <c> : <d>
onde

val - Valor a ser impresso


c - Nmero total de colunas de impresso. No caso de valores reais, inclui o ponto decimal.
d - Somente para valores reais, Nmero de casas decimais.
Como os valores reais so manipulados em Pascal em notao cientfica, esta formatao deve ser
aplicada aos recis se precisamos dos mesmos em notao decimal.

Pgina 35

Exemplo:
Program Funcionario;
Const
titulo = 'Dados Funcionrio';
Var
nome : string(10];
idade : integer;
salario : real;
Begin
nome := 'Jaime';
idade ;= 30;
salario : = 500000.00;
writeIn (ttulo);
writeIn ;
writeIn ('Nome : ', nome);
writeIn ('ldade : ' idade);
writeIn ('salario Atual :' salario:9:2);
writeIn ('salario Reajustado :' salario*1.50:9:2)
End.
A sada :
Dados Funcionrio
Nome: Jaime
ldade: 30
Salario: 500000.00
Salario Reajustado: 750000.00
Se a formatao fosse:
writeIn ('Nome : ', nome:9);
writeIn ('ldade : ', idade:9); '
wrtleIn ('salario : ', salario:9:2);
writeIn ('salario Reajustado : ', salario*1 .50:9:2);
A sada seria :
Dados Funcionrio
Nome:
Jaime
ldade:
30
Salario:
500000.00
Salario Reajustado: 750000.00

Comandos READ e READLN


Estes procedimentos lem valores de dados de dispostlvos de entrada (teclado, drive de disco, etc). O
procedmento READLN l e passa pcra a prxima linha de leitura. A forma geral :
READ ( [ arq, ] var 1 , var 2, var 3, ... )
READLN .
sendo que:
a. A transmisso de argumentos opcional, podendo ser totalmente omitida.
Pgina 36

b. O argumento ARQ direciona a leitura de valores para as variveis varl, var2, var3, .... , a partir de
dispositivo de entrada. Se ARQ omitido, o default normalmente o teclado.
C. Quando ARQ no do tipo FILE OF , var 1, var 2, var 3, ..., podem ser apenas dos tipos elementares
inteiros, reais e caracter, e cadeia de caracteres. .

Pgina 37

ESTRUTURA DE DADOS TIPO ARRAY


Definio
Um array um tipo de dado estruturado consistindo de um nmero fixo de componentes, todos do
mesmo tipo. Cada componente de um array pode ser explicitamente acessado atravs de um ndice , ou
subscrito.
As variveis desse tipo se subdividem em duas categorias, as uni-dimentsionais (tambm chamados de
vetores ), e as multi-dimensionais, a depender do nmero de ndices usados para individualizar cada
elemento do conjunto. Os arrays bi-dimensionais so comumente chamados de matrizes, onde no
primeiro ndice visualizamos como sendo as linhas de um tabela, e o segundo ndice, as colunas.

Declarao do Tipo Array


A definio de um tipo array feita de acordo com a seguinte sintaxe:
[packed] array [ tipo-do-ndice [ , tipo-do-ndice ] ... ] of tipo-do-dado
Onde :
Tipo-do-ndice : Corresponde ao tipo dos ndices, podendo ser um dos seguintes :
Um tipo enumerado
O identificador de um tipo escalar ordenado
Um subintervalo
Tipo-do-dado : Corresponde ao tipo dos componentes do array.

OBSERVAES
1. Os smbolos (. e .) so substitutos que podem ser utilizados no lugar de [ e ].
2. O uso da palavra reservada packed faz com que o array seja melhor alocado na memria de forma
a economizar espao, em detrimento de um pequena perda de performance. No Turbo Pascal, isso
feito automticamente, de forma que a palavra packed sempre ser desprezada.

EXEMPLOS
type
TMatriz
= array[ 1..10, 1..10 ] of real;
TSituacao = array[ boolean ] of integer;
TCores
= ( Vermelho, Amarelo, Azul );
TIntensidade = array[ TCores ] of real;

Pgina 38

Referncia aos Elementos de um Array


Um elemento de um array selecionado colocando-se uma expresso entre colchetes, logo depois do seu
nome. Neste caso, o elemento com o ndice denominado de varivel subscrita.
No caso de um array multi-dimensional, as expresses usadas para indexao devem ser separadas umas
das outras atravs de vrgulas.

EXEMPLOS
var
A
: TMatriz;
Intensidade : TIntensidade;
BEGIN
A[ 1, 5 ] := 0.5;
Intensidade[ Amarelo ] := 0.3;
END.

OBSERVAES
1. Se nos referenciar-mos a um array utilizando um ndice fora dos limites do array, isso provocar
um erro em tempo de execuo.
Ex. : A[ 11, 5 ] := 10;
{ O limite de linhas da matriz A 10 e no 11 }
Todos os elementos de um array podem ser copiados em outro com um nico comando de atribuio
desde que as duas variveis sejam do mesmo tipo. Se os arrays forem multi-dimensionais, pode-se
tambm copiar parte deles, como mostrado abaixo:
type
TMatriz = array[ 1..10, 1..10 ] of integer;
TVetor = array[ -50..50 ] of real;
var
A, B : TMatriz;
X, Y : TVetor;
BEGIN
X := Y;
{ Atribui a X todos os elementos de Y }
A[ 1 ] := B[ 2 ];
{ Atribui a linha 2 de B linha 1 de A }
END.

OBSERVAES
Duas variveis so do mesmo tipo se elas forem definidas na mesma lista do comando var. Assim, se
tivermos :
var
Vetor1 : array[ 1..5 ] of integer;
Vetor2 : array[ 1..5 ] of integer;
Vetor3, Vetor4 : : array[ 1..5 ] of integer;
as variveis Vetor1 e Vetor2 no so consideradas como sendo do mesmo tipo no Pascal. Dessa maneira,
a atribuio abaixo daria erro de compilao :
Vetor1 := Vetor2;
Ao passo que a atribuio abaixo estaria correta :
Pgina 39

Vetor3 := Vetor4;

Pgina 40

Arrays de Caracteres
Os arrays de caracteres podem ser manipulados como strings, vejamos um exemplo:

EXEMPLO
program TesteArrayChar;
var
Digitos : array[ 1..10 ] of Char;
I
: integer;
BEGIN
Digitos := 0123456789;
for I := 1 to 10 do
write( Digitos[ I ] );
writeln;
writeln( Digitos );
END.

Leitura e Impresso de Arrays


A leitura e impresso de arrays so feitas indicando individualmente quais elementos se deseja ler ou
imprimir.

EXEMPLOS
var
Vetor : array[ 1..10 ] of integer;
Matriz : array[ 1..10, 1..20 ] of real;
I, J : integer;
BEGIN
{ Leitura de um vetor }
for I := 1 to 10 do
readln( Vetor[ I ] );
{ Impresso de um vetor }
for I := 1 to 10 do
writeln( Vetor[ I ] );
{ Leitura de uma matriz - Linha por Linha }
for I := 1 to 10 do
for J := 1 to 20 do
readln( Matriz[ I, J ] );
{ Impresso de uma matriz - Linha por Linha }
for I := 1 to 10 do
for J := 1 to 20 do
writeln( Matriz[ I, J ] );
{ Leitura de uma matriz - Coluna por Coluna }
for I := 1 to 20 do
for J := 1 to 10 do
readln( Matriz[ I, J ] );
END.
Pgina 41

Arrays Multi-Dimensionais
Para ilustrar o uso de arrays multi-dimensionais, considere o seguinte problema:
Um professor atribui a cada aluno de uma turma de 50 alunos, trs notas resultantes de trs avaliaes;
o professor deseja saber a mdia de cada aluno e a mdia da turma em cada avaliao.
Uma maneira natural de tratar esse problema com o uso de um array bi-dimensional ( MATRIZ ), tal
como ilustrado abaixo na matriz NOTAS. Onde cada linha representa um aluno e cada coluna
representa uma avaliao (dessa forma teramos uma matriz 50 X 3), assim para sabermos a nota do
aluno No 10 na 2a Avaliao, teramos NOTAS[ 10, 2 ] .

Mdia
da
Avaliao

10.0

10.0

10.0

10.0

2.0

0.0

1.0

1.0

8.0

6.0

9.0

7.7

8.0

5.0

10.0

7.7

7.0

5.3

7.5

Mdia
do
Aluno

Usaremos dois arrays uni-dimensionais ( VETORES ) para conter as mdias. O array Media_Alunos
conter a mdia de cada aluno e Media_Avaliacao conter a mdia de cada avaliao.

Pgina 42

Program Analise_de_Notas;
{
Programa que ir ler as notas obtidas pelos alunos de uma turma colocando-as
em um array bi-dimensional. A seguir ser calculada a mdia obtida por cada
aluno e a mdia de cada avaliao, imprimindo os resultados.
}
const
Num_Avaliacoes = 3;
Num_Alunos
= 10;
type
IndiceAluno
= 1..Num_Alunos;
IndiceAvaliacao = 1..NumAvaliacoes;
var
Notas
: array[ IndiceAluno, IndiceAvaliacao ] of real;
MediaAlunos : array[ IndiceAluno ] of real;
MediaAvaliacao : array[ IndiceAvaliacao ] of real;
I, J
: integer;
Soma
: real;
BEGIN
{ Leitura da Matriz de Notas }
for I := 1 to NumAlunos do
{ Leitura das Noras do I-esimo aluno }
for J := 1 to NumAvaliacoes do
read( Notas[ I, J ] );
{ Calculo da mdia de cada avaliao guardando-as no array MediaAvaliacao }
for J := 1 to NumAvaliacoes do
begin
Soma := 0;
for I := 1 to NumAlunos do
Soma := Soma + Notas[ I, J ];
MediaAvaliacao[ J ] := Soma / NumAlunos;
end;
{ Calculo da mdia de cada aluno guardando-as no array MediaAlunos }
for I := 1 to NumAlunos do
begin
Soma := 0;
for J := 1 to NumAvaliacoes do
Soma := Soma + Notas[ I, J ];
MediaAlunos[ I ] := Soma / NumAvaliacoes;
end;
{ Impressao das Mdias dos Alunos e suas notas }
writeln( Aluno, Media:7, :10, Notas, );
for I := 1 to NumAlunos do
begin
write( I:4, MediaAlunos[ I ]:8:1, :4 );
Pgina 43

for J := 1 to NumAvaliacoes do
write( Notas[ I, J ]:5:1 );
writeln;
end;
{ Impressao das medias das avaliaoes }
write( Media das Avaliaes : );
for J := 1 to NumAvaliacoes do
write( MediaAvaliacoes[ J ]:5:1 );
END.

Pgina 44

Arrays Constantes
As constantes j vistas se enquadram entre as constantes denominadas escalares. No Pascal existem
outros tipos de constantes, denominadas estruturadas, para as quais esto associadas no um valor,
como nas escalares, mas um coleo de valores.
Um dos tipos de constantes estruturadas do Pascal so os Arrays Constantes, os quais so definidos da
seguinte forma:
const
ident-constante : array[ tipo-do-ndice [ , tipo-do-ndice ] ... ] of tipo-do-dado = valores;

EXEMPLO
const
DIGITOS : array[ 1..10 ] of integer = ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 );
A declarao de um array constante contm a especificao de cada um dos valores dos elementos do
array.
O tipo dos elementos de uma constante de array pode ser qualquer um dos tipos de dados da linguagem
Pascal, com exceo do tipo file.

EXEMPLOS
type
TStatus
= ( Ativo, Passivo, Esperando );
TStatusString = array[ Status ] of string[ 7 ];
const
StatusString : TStatusString = ( Ativo, Passivo, Esperando );
Dessa forma, esses so os valores dos elementos do array constante StatusString :
StatusString[ Ativo ]
= Ativo
StatusString[ Passivo ] = Passivo
StatusString[ Esperando ] = Esperando
Um exemplo com array multi-dimensionais :
type
TMatriz = array[ 1..2, 1..3 ] of integer;
const
MATRIZ : TMatriz = ( ( 1, 2, 3 ), ( 4, 5, 6) );
MATRIZ[ 1, 1 ] = 1
MATRIZ[ 2, 1 ] = 2
MATRIZ[ 3, 1 ] = 3

MATRIZ[ 1, 2 ] = 4
MATRIZ[ 2, 2 ] = 5
MATRIZ[ 3, 2 ] = 6

MATRIZ[ 1, 3 ] = 7
MATRIZ[ 2, 3 ] = 8
MATRIZ[ 3, 3 ] = 9

Pgina 45

Uso de ndices com Contedo Semntico


Como vimos, os ndices de um array servem para acessar individualmente seus elementos.
Freqentemente, esses ndices tm um significado intrnseco. Por exemplo, se desejssemos contar as
letras existentes em um texto, poderamos declarar o contador da seguinte maneira:
type
Faixa = 1..26;
var
Contador : array[ Faixa ] of integer;
ficando subentendido que Contador[ 1 ] o contador da letra a, Contador[ 2 ] o contador da letra
b e assim sucessivamente. No entanto, o entendimento ficaria mais claro se usssemos como ndice
no um nmero inteiro para indicar a letra, mas a prpria letra, isto , Contador[ a ] para indicar o
contador da letra a, Contador[ b ] para para indicar o contador da letra b, etc. Isto possvel
uma vez que o ndice de um array pode ser qualquer escalar ordenado ( char, integer, boolean,
enumerated, subrange ) Assim, a declarao anterior ficaria melhor da seguinte forma :
type
Letras = a..z;
var
Contador : array[ Letras ] of integer;
EXEMPLO
Vejamos um exemplo completo usando o recurso de ndices com contedo semntico.
program Vendedor;
{
Programa para ler as vendas efetuadas durante uma semana por uma equipe de
vendedores. A seguir ser impresso o valor das vendas indicando quais os
dias que tiveram vendas abaixo e acima da mdia.
}
type
TDias = ( Seg, Ter, Qua, Qui, Sex, Sab, Dom );
var
Vendas : array[ TDias ] of real;
Dia : TDias;
Total,
Media : real;
BEGIN
{ Leitura das vendas da semana }
for Dia := Seg to Dom do
read( Vendas[ Dia ] );
{ Clculo da Mdia }
Total := 0;
for Dia := Seg to Dom do
Total := Total + Vendas[ Dia ];
Media := Total / 7;
writeln( Vendas Dirias Comparadas com a Mdia );
Pgina 46

writeln(
SEG
TER
QUA
for Dia := Seg to Dom do
write( Vendas[ Dia ] :9:2 );
writeln;
for Dia := Seg to Dom do
if Vendas[ Dia ] > Media then
write( + : 9 )
else
if Vendas[ Dia ] < Media then
write( - : 9 )
else
write( 0 : 9 );
END.

QUI

SEX

SAB

DOM );

Pgina 47

Pesquisa em Arrays

PESQUISA SEQUENCIAL / PESQUISA BINRIA


Pesquisar significa procurar algum valor dentre os componentes de um Vetor. Existem vrios algoritmos
de pesquisa em. Vetores. Abordaremos aqui os dois principais: Pesquisa Seqencial e Pesquisa Binria.
A Pesquisa Seqencial caracteriza-se pela busca exaustiva, componente a componente, dentro do Vetor.
A busca termina ou quando o componente procurado encontrado ou quando o Vetor chega ao seu final.

PROCEDURE Pesquisaseq (Vet : TPVet;.TamLog, Proc : integer ;


VAR Achou : BOOLEAN; VAR Pos : integer)
BEGIN
Pos i= 1;
Achou := FALSE;
WHILE (Pos <= TamLo9) AND (NOT Achou) DO
BEGIN
IF (Vet[Pos] = Proc) THEN
. Achou i= TRUE
ELSE
Pos = Pos + 1;
END;
END;
Pgina 48

Pgina 49

Pesquisa Seqencial normalmente utilizada quando a busca feita em um Vetor desordenado.


Quando o Vetor pesquisado est ordenado, pode ser utilizada a Pesquisa Binria, que realiza uma busca
mais eficiente.
O mtodo utiliza trs ndices: "LimInf" (representando o incio lgico), "Limsup" (representando o fim
lgico) e "Meio".(para a posio pesquisada no Vetor). inicialmente os ndices possuem os seguintes
valores :
LimInf <-- 1
LimSup <-- TamLog
Meio <-- (LimInf + Limsiup) DIV 2

Verifica-se se "Vet[Meio]" igual ao elemento procurado. Em caso afirmativo, a pesquisa encerrada;


caso contrrio, feita uma nova pesquisa utilizando-se a metade inferior (se elemento procurado
menor que "Vet[Meio]") ou superior (se elemento procurado maior que "Vet[Meio]") do Vetor.

Pgina 50

o procedimento termina em uma das trs situaes:


- quando o elemento encontrado (achou) ;
- quando o limite inferior ultrapassa o limite superior (elemento no encontrado);
- quando o limite superior ultrapassa o limite inferior (elemento no encontrado).
Transformando esta lgica em cdigo Pascal obtemos o seguinte
procedimento:
PROCEDURE PesqBinaria (vet : TPVet; TamLog, Proc : INTEGER;
VAR Achou : BOOLEAN;
VAR Meio : INTEGER ) ;
VAR Limlnf, LimSuP : INTEGER;
BEGIN
LimInf := 1;
Limsup := TamLog;
Achou := FALSE;
WHILE (LimInf1<= Limsup) AND (NOT Achou) DO
BEGIN
Meio := (Limlnf + Limsup) DIV 2;
IF (VetMeio] = Proc) THEN
Achou := TRU
ELSE
IF (Vet[Meio] > Proc) THEN
Limsup := Meio - 1
ELSE
Limlnf := Meio + 1;
Pgina 51

END;
END;
Veja que se o elemento procurado for encontrado, a varivel "Achou" retornar o valor TRUE e a
posio correspondente ser retornada em "Meio".

Pgina 52

Classificao / Ordenao de Arrays


MTODO DA BOLHA
Ordenar um Vetor colocar seus componentes sob algum critrio de ordenao (ascendente ou
descendente). Existem vrios algoritmos de ordenao, cada um apresentando maior ou menor eficincia
de acordo com o estado original da seqncia a ordenar.
O algoritmo que ser aqui apresentado conhecido como "Mtodo da Bolha" (Bubble Sort), que consiste
em comparar e trocar (se necessrio) todos os elementos adjacentes de um Vetor at o seu final
(tamanho lgico). O Vetor ter ento o maior elemento (ordenao ascendente) em sua ltima posio.

Como o Vetor ainda no est ordenado. um novo processo de comparaes e possveis trocas pode ser
efetuado. No entanto o processo s precisa ser efetuado at a penltima posio do Vetor e, assim
sendo, o tamanho lgico do Vetor decrementado de um.

Pgina 53

Pgina 54

O Vetor continua no ordenado. Repetimos ento o processo decrementando novamente o tamanho


lgico de um.

o algoritmo termina quando no houver mais trocas durante a execuo de um processo de comparaes,
na pior das hipteses quando o tamanho lgico igual a um. No exemplo acima um novo processo ser
executado, mas nenhuma troca ser realizada, assegurando-se ento que o Vetor est ordenado.

Cada processo definido pela seqncia de comandos relacionada ao comando REPEAT. Antes da
execuo de cada processo a varivel "Trocou" recebe o valor FALSE, j que nenhuma troca foi ainda
efetuada.
O processo ento executado e caso haja alguma troca a varivel "Trocou" recebe o valor TRUE,
implicando a execuo de um novo processo.

Pgina 55

A grande vantagem deste algoritmo que se, por exemplo, a seqncia original j estiver ordenada
executado apenas um processo de comparaes, e, sem nenhuma troca, o algoritmo logo chega ao seu
final.

Pgina 56

ESTRUTURADA DE DADOS TIPO REGISTRO


Conceito
Um tipo de dado estruturado cujos elementos constituintes no precisam ser de mesmo tipo.
Assim, podemos tanto nos referir coletivamente a um conjunto de elementos que diferem entre si no
tipo, quanto a um elemento especfico do conjunto, denominado campo do registro.

Declarao do Tipo Registro


A declarao do tipo registro, consiste da palavra reservada record, seguida de uma lista de
campos, e terminando com a palavra reservada end, de acordo com a sintaxe abaixo:

Sintaxe
[ packed ] record

ident-campo : tipo;
[ ident-campo : tipo; ]
. . .
end;
Onde, ident-campo consiste no nome que identifica o campo e tipo o tipo de dados do campo,
podendo ser qualquer um dos tipos escalares, estruturados ou apontador.

A clusula packed faz parte da especificao do pascal ANSI, mas no aceita em compiladores
como o Turbo Pascal.

Pgina 57

Declarao de Variveis Registro


A maneira mais fcil de definir um registro incluir a definio como parte de uma
declarao de varivel.
Sintaxe
VAR

Nome-Do-Registro : record
campo1 : tipo;
campo2 : tipo;
...
campoN : tipo;
end;

Exemplo
VAR
Aluno : record
Nome
: string(40);
Matricula : integer;
Notas : array[1..3] of real;
end;

Declarao de Tipos Registro


Outra forma de definir um registro e que freqentemente mais til do que uma
declarao de varivel, definir um tipo de registro, utilizando-se da declarao TYPE. Assim
as variveis podem ser definidas como sendo desse tipo.

Sintaxe
type

Nome-Do-Tipo = record
campo1 : tipo;
campo2 : tipo;
. . .
campoN : tipo;
end;

VAR variavel : Nome-Do-Tipo;


Exemplo
type

Reg_Aluno = record
Nome
: string(40);
Matricula : integer;
Notas
: array[1..3] of real;
end;
Pgina 58

VAR MelhorAluno : Reg_Aluno;


PiorAluno : Reg_Aluno;

Pgina 59

Manipulao de Registros
Referncia aos Campos
Os nomes dos campos de um registro so semelhantes aos ndices de uma array. Eles
permitem acessar individualmente cada informao. Para tal, colocamos o nome da varivel do
tipo record ao qual o campo pertence, seguida de um ponto e finalmente do nome do campo.

Sintaxe

Nome-Do-Registro Nome-Do-Campo

Exemplo
type

Reg_Aluno = record
Nome
: string(40);
Matricula : integer;
Notas
: array[1..3] of real;
end;

VAR Aluno1 : Reg_Aluno;


Aluno2 : Reg_Aluno;
I
: integer;
...
{ Leitura dos campos de Aluno1 }
read( Aluno1.Nome, Aluno1.Matricula );
for I := 1 to 3 do
read( Aluno1.Notas[ I ] );
{ Exibio dos campos de Aluno2 }
writeln( Aluno2.Nome );
writeln( Aluno2.Matricula );
for I := 1 to 3 do
write( Aluno2.Notas[ I ] );
...

Pgina 60

Comando WITH
O comando with utilizado para simplificar a referncia aos campos de uma varivel tipo
record, eliminando a necessidade de se colocar seu nome antes dos nomes dos campos.

Sintaxe
with Varivel-Registro [,Varivel-Registro]... do
comando
with Varivel-Registro [,Varivel-Registro]... do
begin
comando;
comando;
...
end;

Exemplo
type

Reg_Aluno = record
Nome
: string(40);
Matricula : integer;
Notas
: array[1..3] of real;
end;

VAR Aluno1,
Aluno2 : Reg_Aluno;
I
: integer;
...
{ Leitura dos campos de Aluno1 }
with Aluno1 do
begin
read( Nome, Matricula );
for I := 1 to 3 do
read( Notas[ I ] );
end;
...

Pgina 61

O uso de virgula no comando with eqivale ao uso de withs aninhados:


With Aluno1, Aluno2 do
Nome := Maria;

With Aluno1 do
With Aluno2 do
Nome := Maria;

Dessa forma, Maria est sendo atribudo ao campo Nome de Aluno2. Se quisssemos atribuir
Antonio ao campo Nome do Aluno1, teramos :

With Aluno1 do
begin
Nome := Antonio;
With Aluno2 do
Nome := Maria;
end;
E, nesse caso, seria mais prtico colocarmos :
Aluno1.Nome := Antonio;
Aluno2.Nome := Maria;

Atribuio de Campos e Registros


{ Atribuio campo a campo }
Aluno1.Nome
:= Aluno2.Nome;
Aluno1.Matricula := Aluno2.Matricula;
for I := 1 to 3 do
Aluno1.Notas[ I ] := Aluno2.Notas[ I ];

{ Atribuio do registro inteiro }


Aluno1 := Aluno2;

Pgina 62

Registros Aninhados
Algumas vezes temos necessidade de estruturar um registro de forma hierrquica, onde algum
campo seja tambm um registro.

Declarao
type Reg_Data = record
Dia : 1..31;
Mes : 1..12;
Ano : integer;
end;
Reg_Aluno = record
Nome
: string(40);
Matricula
: integer;
Notas
: array[1..3] of real;
Data_Nascimento : Reg_Data;
end;
var Aluno1, Aluno2 : Reg_Aluno;

Referncia aos Campos

Para referenciar os campos do registro procedemos da mesma forma j descrita:

Aluno1.Nome := Josias;
Aluno1.Data_Nascimento.Ano := 1970;
Aluno1.Data_Nascimento := Aluno2.Data_Nascimento;

Pgina 63

Arrays de Registros
Muitas vezes encontramos um problema no qual temos que trabalhar com um conjunto de
registros de mesmo tipo. para tais problemas, podemos utilizar uma estrutura de dados que combina
arrays e records.
Por exemplo, suponhamos que temos uma classe com 50 alunos onde cada aluno representado
pelo registro Reg_Aluno, assim, podemos criar um array de 50 elementos, onde cada elemento do tipo
Reg_Aluno.

Exemplo
type
Reg_Aluno = record
Nome
Matricula
Notas
end;

: string(40);
: integer;
: array[1..3] of real;

VetClasse = array[ 1..50 ] of Reg_Aluno;


var Classe : VetClasse;
I, J : integer;

Os registros dos 50 alunos poderiam ser lidos da seguinte forma:


for I := 1 to 50 do
begin
read( Classe[ I ].Nome, Classe[ I ].Matricula );
for J := 1 to 3 do
read( Classe[ I ].Notas[ J ] );
end;
Os registros dos 50 alunos poderiam ser exibidos da seguinte forma:
for I := 1 to 50 do
begin
with Classe[ I ] do
begin
write( Nome, Matricula );
for J := 1 to 3 do
read( Notas[ J ] );
end;
end;

Pgina 64

EXEMPLO DO USO DE REGISTROS


Estudo de Caso
Problema : Uma empresa deseja avaliar o desempenho de sua equipe de vendedores para otimizar a
produo. Para isto, deseja que seja elaborado um programa com as seguintes especificaes.
Entrada: Para cada vendedor ser fornecido seu nome, a quantidade de tens vendidos no ms e a
quantidade de tens devolvidos pelos clientes.
Sada: Como resultado dever ser impresso para cada vendedor alm dos dados lidos, a venda lquida
(vendas menos devolues) e a diferena entre a venda lquida e a mdia das vendas lquidas.
Soluo : As informaes sobre cada vendedor sero definidas com um registro do seguinte tipo:
type Reg_Vendedor = record
Nome
: string(30);
Vendas,
Devolucoes,
Liquido,
Comparacao : integer;
end;
Os dados como consistem de uma lista de vendedores, sero definidos como um array de
registros Reg_Vendedor.
Var Vendedores : array[ 1.. NumVendedores ] of Reg_Vendedor;
O programa consiste basicamente das seguintes partes:
1.
2.
3.
4.
5.

Ler os dados
Calcular a venda lquida de cada vendedor
Calcular a mdia das vendas lquidas
Calcular a diferena da venda lquida de cada vendedor com a mdia
Imprimir os resultados

Pgina 65

program Relatorio_de_Vendas;
{
Programa que l as vendas e as devolues de um grupo de vendedores e imprime uma tabela
mostrando para cada vendedor os dados lidos, a venda lquida e a comparao de sua venda lquida com a
mdia das vendas.
}
const NumVendedores = 20;
type Reg_Vendedor = record
Nome
: string(30);
Vendas,
Devolucoes,
Liquido,
Comparacao : integer;
end;
Var
Vendedor
: array[ 1..NumVendedores ] of Reg_Vendedor;
Media, Soma, I : integer;
BEGIN
{ Leitura dos Dados }
for I := 1 to NumVendedores do
with Vendedores[ I ] do
readln( Nome, Vendas, Devolucoes );
{ Calculo das Vendas Liquidas e da Media das Vendas }
Soma := 0;
for I := 1 to NumVendedores do
with Vendedores[ I ] do
begin
Liquido := Vendas - Devolucoes;
Soma := Soma + Liquido;
end;
Media := Soma / NumVendedores;
{ Comparacao das vendas de cada vendedor com a media }
for I := 1 to NumVendedores do

Vendedores[ I ].Comparacao := Vendedores[ I ].Liquido - Media;


{ Impresso dos Resultados }
clsrscr();
writeln( :25, Resumo das Vendas);
writeln;
writeln( :10, Nome, :12, Vendas, :6, Devol, :4, Liquido, :5, DifMedia );
writeln;
for I := 1 to NumVendedores do
with Vendedores[ I ] do
writeln( Nome, Vendas:11, Devolucoes:11, Liquido:11, comparacao:11 );
END.
Pgina 66

Pgina 67

ESTRUTURA DE DADOS TIPO CONJUNTO


DEFINIO
Um conjunto uma coleo de objetos correlatos. Cada objeto de um conjunto denominado membro
ou elemento.
Exemplos de Conjuntos
Todos os nmeros inteiros compreendidos entre 0 e 100
As letras do alfabeto
As consoantes do alfabeto
Embora na matemtica, no exista nenhuma restrio sobre quais objetos podem ser membros de um
conjunto, em Pascal somente uma forma restrita de conjuntos pode ser usado. Assim, os conjuntos, em
Pascal, s podem conter elementos de mesmo tipo, chamado tipo base, podendo este apenas ser um dos
tipos escalares ordenados da linguagem.
A definio de um tipo conjunto feita da seguinte forma :
[ packed ] set of tipo-base
onde, o tipo-base pode ser um tipo escalar enumerado, o identificador de um tipo escalar ou uma faixa.
Exemplo
type
TDiasDaSemana = ( Dom, Seg, Ter, Qua, Qui, Sex, Sab );
TCaracters = set of char;
TDiasDoMes = set of 1..31;
TDiasUteis = set of SEG..SEX;

OBS.: O nmero mximo de elementos em um conjunto no Pascal de 256, e, se o tipo-base for inteiro,
os valores s podem estar no intervalo de 0 a 255.

Pgina 68

CONSTRUTORES DE CONJUNTOS
O construtor de conjuntos usado para definir os elementos de um conjunto, cuja sintaxe :
[ expr1, expr2..expr3, expr4, ... ]
Na sintaxe acima, vemos que os elementos podem ser especificados por meio de uma lista de
expresses, ou por um par de expresses separadas por dois pontos ( .. ). Se for especificado um par
de expresses, significa que todos os valores compreendidos a partir da primeira expresso at a
segunda expresso sero includos como elementos do conjunto.
Cada expresso especificada no construtor de conjuntos deve ser do mesmo tipo do tipo-base do
conjunto.

Exemplo
type
TDias = set of ( Dom, Seg, Ter, Qua, Qui, Sex, Sab );
TCharSet = set of char;
var
DiasDeTrabalho : TDias;
Letras
: TCharSet;
Inf, Sup
: char;
...
DiasDeTrabalho := [ Seg..Sex ];
Letras := [ a..z, A..Z ];
Inf := I;
Sup := N;
Letras := [ Inf .. Sup ];

Quando no construtor de conjuntos especificamos somente constantes nas expresses, estamos


definindo um conjunto constante, podendo, inclusive, ser definido na declarao const.

Exemplo :
const
Numeros = [ 1, 3..10, 12 ];
Letras = [ M, A, I, O, R ];

OBS.:
O conjunto vazio representado por [ ], sendo ele compatbel com todos os tipos de conjuntos.
Pgina 69

A ordem dos elementos no conjunto irrelevante, assim os conjuntos [ 1, 3, 5 ] e [ 1, 5, 3 ] so


idnticos.

Pgina 70

EXPRESSES COM CONJUNTOS


Valores do tipo conjunto podem ser calculados atravs de expresses de conjuntos, as quais consistem
de conjuntos, de variveis do tipo conjunto, de construtores de conjuntos e operadores de conjuntos.
Os operadores envolvidos em uma expresso de conjunto so os seguintes:

Complemento de um Conjunto ( not )


Retorna o conjunto complementar do operando.
Exemplo
type
TDias = set of ( Dom, Seg, Ter, Qua, Qui, Sex, Sab );
var
DiasDeTrabalho,
FimDeSemana
: TDias;
...
DiasDeTrabalho := [ Seg..Sex ];
FimDeSemana := not DiasDeTrabalho;
{ Dom e Sab }

Interseo de Conjuntos ( * )
Retorna o conjunto contendo os elementos comuns aos dois conjuntos.
Exemplo : [ 1, 3 ] * [ 3, 5, 7 ] => [ 3 ]

Diferena de Conjuntos ( - )
Retorna o conjunto contendo os elementos do primeiro conjunto quer no esto no segundo.
Exemplo : [ 1, 2, 3, 4 ] - [ 2, 4 ] => [ 1, 3 ]

Unio de Conjuntos ( + )
Retorna o conjunto contendo todos os elementos existente nos dois conjuntos.
Exemplo : [ 1, 3 ] + [ 3, 5, 7 ] => [ 1, 3, 5, 7 ]

Igualdade de Conjuntos ( = )
Retorna TRUE se os elementos do primeiro conjunto so os mesmos do segundo.
Pgina 71

Exemplo : [ 1, 3 ] = [ 3, 1 ] => retorna TRUE

Desigualdade de Conjuntos ( + )
Retorna TRUE se os elementos do primeiro conjunto no so os mesmos do segundo.
Exemplo : [ 1, 3 ] <> [ 3, 1, 2 ] => retorna TRUE

SubConjunto de um Conjunto ( <= )


Retorna TRUE se o primeiro conjunto est contido no segundo.
Exemplo : [ 1, 2, 3 ] <= [ 3, 1, 2, 4, 5 ] => retorna TRUE

SuperConjunto de um Conjunto ( >= )


Retorna TRUE se o primeiro conjunto contm o segundo.
Exemplo : [ 3, 1, 2, 4, 5 ] >= [ 1, 2, 3 ] => retorna TRUE

Elemento de um Conjunto ( in )
Retorna TRUE se o primeiro operando elemento do conjunto.
Exemplo : 3 in [ 1, 2, 3 ] => retorna TRUE

APLICAES DE CONJUNTOS

Exemplo 1
Expresses de conjuntos so teis para tornar mais claros testes complicados. Por exemplo :
if ( Ch = A ) or ( Ch = E ) or ( Ch = I ) or
( Ch = O ) or ( Ch = U ) then
pode ser expresso mais facilmente da seguinte maneira :
if Ch in [ A, E, I, O, U ] then

Pgina 72

Outro exemplo seria :


if ( Valor >= 0 ) and ( Valor <= 9 ) then
fica melhor se for expresso como :
if Valor in [ 0..9 ] then

Pgina 73

Exemplo 2
O seguinte exemplo ilustra o uso de conjuntos para selecionar pessoas com certas caractersticas.
Vamos supor que possumos informaes sobre um grupo de pessoas contendo :
Nome
Cor do Cabelo ( 1=castanho, 2=grisalho, 3=louro, 4=negro, 5=ruivo )
Estado Civil
( 1=casado, 2=divorciado, 3=solteiro )
e que desejamos convidar para uma festa somente pessoas que sejam solteiras ou divorciadas e cuja cor
dos cabelos seja grisalho ou louro. O programa seguinte ir ler as informaes sobre as pessoas e listar
aquelas que satisfaam os critrios desejados.
Program Seleciona_Pessoas;
{
Programa para ler as informaes sobre um grupo de pessoas e selecionar aquelas que satisfaam
alguns critrios.
}
type
TCaracteristicas = ( Castanho, Grisalho, Louro, Negro, Ruivo,
Casado, Divorciado, Solteiro );
TCorDoCabelo
= set of Castanho .. Ruivo;
TEstadoCivil = set of Casado .. Solteiro;
TFichaPessoa = record
Nome
: string[ 30 ];
Cabelo
: TCorDoCabelo;
EstadoCivil : TEstado Civil;
end;
const
CRITERIO = [ Solteiro, Divorciado, Grisalho, Louro ];
var
Pessoa
: TFichaPessoa;
NumPessoas,
I
: integer;
CorCabeloChar,
EstadoCivilChar : char;
BEGIN
readln( NumPessoas );
writeln( Pessoas Convidadas para a Festa );
for I := 1 to NumPessoas do
with Pessoa do
begin
readln( Nome, CorCabeloChar, EstadoCivilChar );
case CorCabeloChar of
1 : Cabelo := [ Castanho ];
2 : Cabelo := [ Grisalho ];
3 : Cabelo := [ Louro ];
Pgina 74

4 : Cabelo := [ Negro ];
5 : Cabelo := [ Ruivo ];
end;
case EstadoCivilChar of
1 : EstadoCivil := [ Casado ];
2 : EstadoCivil := [ Divorciado ];
3 : EstadoCivil := [ Solteiro ];
end;
if (Cabelo + EstadoCivil ) <= CRITERIO then
writeln( Nome );
end;
END.

Pgina 75

SUBPROGRAMAS
At agora temos desenvolvido programas que englobam a lgica completa do algoritmo para a soluo de
um determinado problema.
comum, em programao, decompor a lgica de programas complexos em programas menores e, depois,
junt-los para compor o programa final. Essa tcnica de programao denominada programao
modular.
A programao modular consiste num mtodo para facilitar a construo de grandes programas, atravs
de sua diviso em pequenas etapas, que so os mdulos ou subprogramas e para possibilitar o
reaproveitamento de cdigo, j que podemos utilizar um mdulo quantas vezes for necessrio,
eliminando assim a necessidade de escrever o mesmo cdigo do programa em situaes repetitivas.
Outra importncia da modularizao que ela permite que diferentes programadores trabalhem
simultaneamente na soluo de um mesmo problema, atravs da codificao separada dos diferentes
mdulos.
A modularizao, em Pascal, pode ser feita atravs de procedimentos (procedures) e funes
(functions). Isso feito associando-se um nome a uma seqncia de comandos atravs do que chamamos
Declarao do Procedimento ou da Funo. Pode-se, ento, usar o nome do procedimento ou da funo
dentro do corpo do programa, sempre que desejarmos que o seu bloco de comandos seja executado, isso
o que chamamos de Chamada do Procedimento ou da Funo.

Procedimentos
Definio
Um procedimento uma estrutura de programa autnoma que est includa num programa em Pascal.
Nele podem ser colocados todos os elementos da linguagem Pascal, como se fosse um programa
completo, isso feito atravs de sua declarao.
Um procedimento pode ser referido escrevendo simplesmente o seu nome seguido de um lista opcional
de parmetros. Quando um procedimento referenciado, o controle de execuo do programa
automaticamente transferido para o incio do procedimento. As instrues de execuo dentro do
procedimento so ento executadas, tendo em conta quaisquer declaraes especiais que sejam nicas
para o procedimento. Quando todas as instrues de execuo tiverem sido executadas, o controle
passa automaticamente para a instruo imediatamente a seguir da chamada do procedimento.

Declarao
procedure Nome_Do_Procedimento( Lista-parametros );
[ declarao de rtulos ]
[ declarao de constantes ]
{ Declaraes Locais }
[ declarao de tipos ]
[ declarao de variveis ]
[ declarao de subprogramas ]
begin
comando [ ; comando] ...

{ Corpo do Procedimento }

end;
Pgina 76

Exemplo
program Encontro;
var
Nome : string[ 15 ];
procedure Elogio;
begin
writeln( Bonito Nome );
writeln( Um dos meus favoritos );
end;
BEGIN
writeln( Qual o seu nome ? );
readln( Nome );
Elogio;
writeln( Prazer em conhece-la, , Nome );
END.
Ao executar o programa acima, seria exibido o seguinte dilogo na tela :
Qual o seu Nome ?
Florentina
Bonito Nome
Um dos Meus Favoritos
Prazer em conhece-la Florentina
Para um procedimento simples como o que foi declarado acima, a sintaxe a seguinte :
procedure Nome-do-Procedimento;
begin
comando [ ; comando ] ...
end;
A primeira linha da declarao chama-se cabealho do procedimento que, de acordo com a sintaxe,
consiste da palavra reservada procedure seguida por um identificador que ir servir como nome do
procedimento. Aps o cabealho, temos o corpo do procedimento que consiste de um comando
composto.
A declarao de um procedimento feita na parte de declaraes do programa principal. O nome do
procedimento colocado dentro do corpo do programa principal considerado como uma chamada do
procedimento. As chamadas de um procedimento podem ocorrer onde pode ser usado qualquer outro
comando do Pascal.

Pgina 77

Parmetros
Os parmetros so uma forma dos procedimentos trocarem informaes com os programas.
Para ilustrar melhor o uso de parmetros, considere um programa para solicitar as notas obtidas por um
aluno com o respectivo peso, para depois calcular a mdia aritmtica ponderada. O programa deveria
comear por :
writeln( Primeira Nota);
writeln( Digite a Nota : );
readln( Nota1 );
writeln( Digite o Peso da Nota : );
readln( Peso1 );
A seguir o programa dever solicitar a segunda nota como indicado abaixo :
writeln( Segunda Nota);
writeln( Digite a Nota : );
readln( Nota2 );
writeln( Digite o Peso da Nota : );
readln( Peso2 );
Note que as quatro ltimas linhas dos dois trechos do programa executam a mesma tarefa: eles
apresentam uma mensagem, depois lem um nmero, a seguir apresentam um segunda mensagem e
finalmente lem um segundo nmero. Visto que so tarefas repetitivas, faz sentido pensarmos em
declararmos essas linhas como um procedimento. Existe, no entanto, um problema : na primeira parte
ns usamos as variveis Nota1 e Peso1 e na segunda parte ns usamos as variveis Nota2 e Peso2.
O problema resolvido em Pascal com o uso de variveis especiais chamadas de parmetros formais.
Esses parmetros so, na realidade, posies que sero preenchidas com os endereos das variveis
quando o procedimento for chamado pelo programa.
O procedimento LerDadosNota usado no programa a seguir, usa os parmetros formais Nota e Peso para
fazer aquilo que desejamos:
program MediaGlobal;
var
Nota1, Nota2, Nota3,
Peso1, Peso2, Peso3, Media : real;
{ Procedimento para solicitar os dados da Nota do aluno ao usurio }
procedure LerDadosNota( var Nota : real; var Peso : real );
begin
writeln( Digite a Nota : );
readln( Nota );
writeln( Digite o Peso da Nota : );
readln( Peso );
end;
{ PROGRAMA PRINCIPAL }
BEGIN
writeln( Primeira Nota);
Pgina 78

LerDadosNota( Nota1, Peso1 );


writeln( Segunda Nota);
LerDadosNota( Nota2, Peso2 );
writeln( Terceira Nota);
LerDadosNota( Nota3, Peso3 );
Media := ( ( Nota1 * Peso1 ) + ( Nota2 * Peso2 ) + ( Nota3 * Peso3 ) ) /
( Peso1 + Peso2 + Peso3 );
writeln( Media Global = , Media:5:2 );
END.

Pgina 79

Como vemos, na hora de usar o procedimento com as variveis Nota1 e Peso1 substituindo os parmetros
formais Nota e Peso, devemos chamar o procedimento LerDadosNota da seguinte forma :
LerDadosNota( Nota1, Peso1 );
As variveis usadas na chamada do procedimento, no caso Nota1 e Peso1, so denominadas parmetros
atuais, que iro substituir todas as ocorrncias dos parmetros formais no corpo do procedimento.
Esse processo chamado Passagem de Parmetros.
Como mostrado no programa anterior, um procedimento pode ser chamado vrias vezes usando
parmetros atuais diferentes em cada vez.
Note que o tipo do parmetro formal definido no cabealho do procedimento e que os parmetros
formais e atuais devem ser de mesmo tipo.
Um procedimento pode ter qualquer nmero de parmetros, os quais so listados entre parnteses
depois do nome do procedimento, separados por ponto-e-vrgulas. Quando dois ou mais parmetros
formais tiverem o mesmo tipo, eles podem ser combinados e seus tipos s precisam ser escritos uma
nica vez. Nesse caso, os parmetros combinados so separados por vrgulas. Assim, no exemplo
anterior, o cabealho de LerDadosNota poderia ser escrito da seguinte forma :
procedure LerDadosNota( var Nota, Peso : real );
A sintaxe de um procedimento que possua parmetros a seguinte :
procedure Nome-Do-Procedimento( var parametro [ ,parametro ] ... : tipo
[;var parametro [ ,parametro ] ... : tipo ]...);
begin
comando [ ;comando ]...
end;

Onde o tipo o nome do identificador de um tipo de dado predefinido ou de um tipo criado pelo
programador.

Pgina 80

Passagem de Parmetros por Referncia


Existem duas formas de compartilhamento de dados entre mdulos:
. Por variveis globais (como temos utilizado at agora).
. Por transmisso de dados na chamada do mdulo.
O compartilhamento de objetos globais entre programas e mdulos no promove a independncia fsica
dos mdulos, que, por conceito, so logicamente independentes. Quando um mdulo utiliza um objeto
global a ele, isto dificulta a sua reutilizao e manuteno. Para ser independente fisicamente, um
mdulo deve utilizar somente objetos locais a ele.
A forma de compartilhamento de dados entre mdulos e programas que promove a independncia fsica
de implementao a transmisso de dados pelo chamador ao mdulo chamado, no momento de sua
ativao (chamada). Quando isto ocorre, o mdulo chamado recebe os dados em variveis locais a ele.
Os valores transmitidos pelo chamador ao mdulo chamado so denominados parmetros reais. As
variveis locais do mdulo chamado que recebem esses valores so denominadas parmetros formais. Os
parmetros formais tambm podem retornar valores para o chamador do mdulo.
Dessa forma, as LPS definem dois tipos de parmetros e dois tipos de passagem na modularizao e
abstrao de programas,
TIPOS DE PARMETROS
FORMAIS
So variveis locais declaradas no cabealho do sub-programa, que tm a funo da comunicao de
dados entre o sub-programa e o seu chamador. Essas variveis podem receber valores transmitidos pelo
chamador e/ou retornar valores para o chamador.
REAIS
So valores enviados e/ou recebidos pelo chamador. Os valores enviados podem estar sob a forma de
literais, variveis, funes, operaes ou expresses que combinam esses elementos. No caso de valores
recebidos, o parmetro real tem que ser uma varivel (o mdulo chamado precisa de um elemento
apropriado para armazenar um valor).
TIPOS DE PASSAGENS
POR VALOR
O valor de dado do parmetro real copiado para a varivel parmetro formal.
Essa passagem somente transmite um valor de dado ao mdulo chamado. portanto uma passagem
somente de entrada de dados para o mdulo chamado. Essa passagem no tem recursos para alterar o
valor de dado de uma varivel parmetro real.
POR REFERNCIA

Pgina 81

O endereo da varivel parmetro real copiado para o parmetro formal. Neste caso, o parmetro
formal uma varivel "ponteiro" que passa, no momento da chamada do mdulo, a armazenar o endereo
da varivel parmetro real.
Essa passagem pode retornar valores de dados ao chamador do mdulo. portanto uma passagem de
entrada de dados para o mdulo chamado e/ou sada de dados para o mdulo chamador. Essa passagem
tem recursos para alterar o valor de dado do parmetro formal: o parmetro formal armazena o
endereo de memria do parmetro real.
Na chamada de um mdulo, os parmetros reais, tambm chamados "argumentos", devem se
corresponder aos parmetros formais em:
NMERO
ORDEM
TIPO DE DADO
Um parmetro formal para passagem por referncia declarado com a indicao da palavra reservada
VAR, conforme indicado nos exemplos a seguir.

A forma como os parmetros foram passados vista no item anterior uma das vrias formas de
passagem de parmetros, denominada Passagem por Referncia ( ou Passagem por Varivel ) . Os
parmetros passados dessa forma refletem todas as modificaes que neles forem feitas quando for
retornado ao programa. Assim, voc pode usar esse tipo de parmetro para fornecer valores aos
procedimentos como para retornar valores ao programa. Por conseqncia, somente variveis podem
ser passadas por esse mecanismo; expresses e constantes no so permitidas.
Para um melhor entendimento, considere o seguinte cabealho de um procedimento:
procedure Total( var N : integer;
var P, B : real );
Os parmetros formais N, P e B, por terem sido definidos como parmetros de referncia ( possui a
palavra reservada var na frente da lista ), na realidade no so verdadeiramente variveis e, por isso,
no tem nenhuma memria alocada a elas.

Passagem de Parmetros por Valor


Exemplos:
Exemplo: Passagem Por Valor (no VAR)

Pgina 82

Neste exemplo, a passagem de parmetros para o procedimento P feita por valor. O valor de a[1] (10)
no momento da chamada transmitido (copiado) para a varivel x, declarada no cabealho do
procedimento P Com a chamada do procedimento writeIn (x), impresso o valor de x (12), Aps a
execuo do procedimento P impresso o valor de a[1] [10] com a chamada writeIn (a[1]). Dessa forma,
o valor de a[1] no foi alterado pela execuo de P
Exemplo: Passagem Por Referncia (var)

Pgina 83

Neste exemplo, a passagem de parmetros para o procedimento P feita por referncia. A referncia
(endereo) da varivel tipo array "a", no momento da chamada, transmitido (copiado) para a varivel x,
declarada no cabealho do procedimento P Com o comando de atribuio, o valor da varivel a[1]
alterado para 12, pois x uma referncia (contm o endereo) para a varivel do tipo array "a". Com a
chamada do procedimento writeIn jx), impresso o valor da referncia de x (12), Aps a execuo do
procedimento e o valor impresso de a[1] tambm 12.

Pgina 84

Funes
A funo um caso particular de um procedimento que retorna apenas um valor. Se uma funo retornar
mais de um valor, ela deixa conceitualmente de ser funo, devendo ser implementada como um
procedimento. Nem todo procedimento que retorna um valor dever ser implementado como uma funo.
As funes so subprogramas que retornam apenas um valor no nome da funo. lsto significa que a
associao entre parmetros e argumentos dever ser feita exclusivamente por valor. O nome da funo
funciona como se fosse um parmetro por referncia.
J foram mostrados vrios exemplos de funes, como as funes padro "SQRT(x)" e "ORD(x)". Para
utiliz-las basta passar-lhes um argumento "x", e um valor retornado no prprio nome da
funo.
SQRT ( 25 ) ---> 5
ORD ( CAR ) --->65 { CAR = 'A'}
Alm das funes padro, Pascal permite a criao de novas funes pelo prprio usurio, como descrito
a seguir.
A declarao de uma funo consiste da palavra reservada FUNCTION, o nome da funo, seus
parmetros opcionais e, por ltimo, o tipo da funo que representa o tipo de dado que ser retornado
pelo nome funo. As funes, como os procedimentos, tambm possuem um Bloco de Declaraes e um
Bloco de Comandos prprios.
FUNCTION <nome> ( <lista de Parmetros> ) : <tipo>;
{ Bloco de Declaraes }
BEGIN
{ Bloco de Comandos }
END;
Os Tipos Simples so os nicos tipos vlidos que podem ser retornados pelo nome da funo,
Segue um exemplo comparando o procedimento "Maiores" que retorna apenas um valor, e a
implementao da funo "Maior" do mesmo problema.

O procedimento "Maiores" recebe dois parmetros inteiros ("Num 1" e "Num2") associados por valor e
retoma o maior no parmetro "Maior" associado por referncia.

Pgina 85

A funo "Maior" recebe dois parmetros inteiros ("Num 1" e "Num2") associados por valor e retorna o
maior no nome da funo que funciona como se fosse o parmetro "Maior" do procedimento "Maiores".
O exemplo parece deixar claro que o nome da funo funciona exatamente como um parmetro
associado por referncia. Porm existe uma diferena que est relacionada com a maneira pela qual a
funo ativada.
Enquanto a chamada do procedimento funciona como um Comando Simples, a chamada de uma funo
funciona como uma varivel que primeiro precisa ser calculada para depois ser operada.

Em todas as ativaes da funo "Maior", o nome da funo est funcionando como uma varivel do tipo
inteiro, seja em expresses aritmticas, expresses relacionais, ou mesmo como um argumento de um
subprograma. A diferena que "Maior" s ter um valor aps Ter sido executada, retornando um valor
decorrente do seu processamento no nome da funo.
Entendido o mecanismo de ativao de funes, possvel entender a diferena entre o nome da funo
e um parmetro associado por referncia no Bloco de Comandos do subprograma.
Enquanto um parmetro associado por referncia pode aparecer em qualquer contexto dentro do
procedimento, o nome da funo normalmente deve aparecer no lado esquerdo de um comando de
atribuio, recebendo o valor decorrente do seu processamento. Caso contrrio, ser interpretado
como uma outra ativao da mesma funo.

RECURSIVIDADE
Um problema dito recursivo se ele definido em termos de si mesmo. Neste caso possvel definir um
novo problema similar ao problema original, porm de alguma forma mais simples. Existem muitos
problemas que so definidos intuitivamente de forma recursiva. Vejamos o problema do clculo do
fatorial de um nmero "n".

Pgina 86

O problema fatorial definido matematicamente em funo de si mesmo. Mas como implementar esta
idia em Pascal? Utilizando subprogramas (procedimentos/funes) recursivos.

Dentro do bloco de comandos da funo "Fat" feita uma referncia ao nome da funo no lado direito
do comando de atribuio, implicando em uma nova ativao da funo "Fat".
A cada nova ativao de "Fat" criado um novo ambiente chamado de contexto, onde um novo conjunto
de variveis locais e ligaes de
parmetros de mesmo nome so criados. Pelo mecanismo de escopo de variveis so acessveis apenas os
nomes mais recentemente criados (ltima ativao).
Da maneira que a funo Fatorial est implementada ela ir ativar-se indefinidamente (Loop). Assim
como em uma soluo iterativa, existe o problema de quando termina a repetio de chamadas (condio
de escape ou contorno).
A soluo "amarrar" a chamada da funo a uma condio que ir determinar ou no uma nova ativao.
Normalmente a condio est associada ao argumento do subprograma, que a cada nova ativao
modificado a fim de tomar a condio no satisfeita em algum momento.

Enquanto "N" for maior que 0, a funo pode ativar-se decrementando o argumento de 1. Quando "N"
for igual a 0, a funo recebe o valor 1 (0! = 1) e encerra a seqncia de ativaes.
O gerenciamento de subprogramas recursivos gera alguns problemas que no ocorrem com
subprogramas no recursivos. Um dessesproblemas que o subprograma recursivo chamado
extemamente (por um outro subprograma ou pelo programa principal) e internamente (chamada
recursiva). necessrio portanto que sejam guardados corretamente os endereos de retorno para
cada ativao do subprograma. Outro problema salvar as variveis locais a cada vez que feita
uma nova ativao do subprograma.
O controle das seguidas ativaes de um subprograma recursivo feito atravs de um mecanismo de
empilhamento. Quando o subprograma chamado do programa principal, o contexto inicial montado.
A partir da, a cada mudana de contexto o anterior dever ser salvo, e o novo contexto criado ser
empilhado acima do anterior.
Pgina 87

Quando ocorre a chamada no programa principal (Fat(3)) o contexto inicial montado. Fat(2) ativa
novamente a funo gerando um novo contexto que obriga salvar o contexto inicial para que quando
retornado seja reativado. Enquanto houver chamadas recursivas a "Fat", um novo contexto montado e
empilhado (colocado em cima) do ltimo, tornando-se o corrente.
No instante em que "N" igual a 0, encerrada a seqncia 'de ativaes e os contextos ora empilhados
sero retornados e reativados at que seja encontrado o contexto principal (Fat(3)).
Observe que se o argumento "N" fosse passado por referncia no seria possvel recuperar seu valor a
cada reativao de um contexto .

Pgina 88

O nmero de ativaes de uma rotina recursiva chamado de Profundidade da Recorrncia. Para o


exemplo de "Fat(3)" a profundidade varia em funo de "N" que, quando trs, implica trs ativaes.
Existem duas formas de ativao recursiva de um subprograma: diretamente ou indiretamente. Direta
quando o subprograma se auto-ativa como no caso do fatorial. lndiretamente quando, por exemplo, um
subprograma "P" ativa um subprograma "Q" e este ativa "P" novamente.

Solues recursivas so apropriadas quando o problema definido por si mesmo. No entanto, isto no
significa que a resoluo recursiva sempre a melhor para este tipo de problemas. Para o exemplo
fatorial, a soluo iterativa resolve o problema de maneira mais simples e eficiente, pois no necessita
do mecanismo de empilhamento de contextos.

Pgina 89

Units do Turbo Pascal


Em Pascal, uma biblioteca de elementos pblicos denominada UNIDADE, A
organizao de uma unidade de elementos pblicos tem os mesmos
fundamentos e os mesmos elementos bsicos de programao que um
programa.
Dessa forma, uma unidade em Pascal tem quatro reas principais;
1 REA DE IDENTIFICAO
2 REA DE INTERFACE
3 REA DE IMPLEMENTAO
4 REA DE INICIALIZAO
A rea de identificao estabelece que o texto de uma unidade e o nome Pascal desta. Quando o
compilador Pascal identifica que o texto uma unidade de elementos pblicos, ele gera ao final de sua
compilao um arquivo pr-compilado de extenso em disco .TPU (Turbo Pascal Unit), em vez de um
arquivo de programa executvel.
Como o prprio nome diz, a rea de interface contm uma lista de todos os elementos, relacionados
atravs de suas interfaces, que so pblicos na unidade. Os programas somente podem utilizar, como
uma "abstrao", os elementos que esto relacionados nessa rea.
Na rea de implementao, devem estar definidos, pelo menos, os elementos . indicados na rea de
interface. Essa definio, que a implementao desses elementos, no podem ser acessados pelos
programas.
A rea de inicializao o "programa principal" da unidade. Os comandos existentes nessa rea so
executados antes do primeiro comando do programa Pascal que utiliza a undade.
A organizao dessas reas possui os seguintes aspectos gerais:
a. Uma unidade Pascal identificada pelo compilador atravs da palavra reservada UNIT.
b. Os elementos de programao de uma unidade so os mesmos de um programa.
c. Uma unidade Pascal termina obrigatoriamente por um ponto.
d. Todas as reas so obrigatrias, mesmo que no contenham linhas de definio de dados ou comandos.
.
e. A rea de inicializao delimitada por duas palavras reservadas obrigatrias: BEGIN e END.

Conforme visto anteriormente, as bibliotecas so unidades de elementos pr-definidos e prcompilados, prontos para serem utilizados pelos programas. Esses elementos so chamados no cdigo
Pgina 90

fonte de um programa e reconhecidos pelo compilador atravs de uma diretiva de compilao que indica
o nome da unidade onde est armazenado o elemento utilizado pelo programa. No momento da linkedio
do programa (aps c sua compilao), os cdigos de todos os elementos pr-definidos utilizados pelo
mesmo so incorporados ao seu cdigo objeto para formar o cdigo completo executvel do programa.
A unidades so assim colees de tipos, constantes, variveis, procedimentos e funes pr-definidos.
Em Pascal, o comando que indica o uso por um programa de elementos pr-definidos em unidades o
comando USES .

A CONSTRUO DE UMA UNIDADE


De forma similar a programas, temos primeiro que criar o cdigo fonte da unidade. Aps, esse cdigo
fonte deve ser convertido para um cdigo de mquina.
O compilador do sistema Turbo Pascal gera um arquivo de extenso TPU (Turbo Pascal Unit) como
produto final da compilao de uma unidade definida pelo programador. O compilador reconhece que o
cdigo fonte uma unidade quando a sua rea de identificao se inicia com a palavra reservada UNIT.
o arquivo de extenso TPU, a biblioteca criada pelo programador e que pode ser referenciada pelos
programas.
No sistema Turbo Pascal, o programador pode incorporar a sua unidade biblioteca pcdro do
compilador, armazenada no arquivo TURBO.TPL (Turbo Pascal Library). lsto realizado com um
programa utiltrio do sistema Turbo, denominado TPUMOVER, que tem como objetivo a gerncia de
unidades. Com este programa, podemos incluir e retirar unidades do biblioteca padro do compilador.
A vantagem de incluir unidades na biblioteca padro melhorar a performance do processo de
construo de programas, no que se refere etapa de compilao.
A organizao do cdigo fonte de uma unidade deve obedecer ao quanto indicado no Apndice C.

Pgina 91

Arquivos
ARQUIVOS DE DADOS EM PASCAL
Para que os dados manipulados em nossos programas no se percam quando desligamos
o computador, precisamos guardar os dados, que foram processados pelo programa e
que esto armazenados na memria principal, em um meio de armazenamento
permanente, como um disco rgido ou flexvel (memria secundria).
A forma na qual o sistema operacional armazena dados e programas em disco o
arguivo. Arquivos so gravados em disco pelo sistema operacional conforme comandos
diretos dos usurios no prompt do sistema operacional ou solicitaes dos programas.
CONCEITOS BSICOS

Um arquivo de dados uma segencia de elementos de mesmo tipo armazenada em


disco, que pode crescer dinamicamente ao longo da execuo de um programa.
Existem duas operaes bsicas que um programa pode realizar em um arquivo de
dados. So elas: leitura e escrita, Na leitura, os elementos armazenados no arquivo
so lidos para variveis de memria. Na escrita, os valores de dados armazenados Em
variveis de memria so escritos (gravados) no arquivo.
Um arquivo de dados para ser lido ou escrito por um programa tem antes que ser
aberto, isto , tornado disponvel para operaes de leitura e/ou escrita dentro do
programa. Aps utilizado no programa, um arquivo tem que ser fechado, ou seja,
tornado indisponvel para operaes.
ABERTURA

Processamento Operaes L / E
FECHAMENTO

Em um arquivo aberto em um programa, sempre existe uma posio corrente. Posio


corrente aquela na qual pode ser lido ou escrito (ou reescrito) um elemento.
Elemento a menor partcula que pode ser lida ou escrita em um arquivo, Elemento de
um arquivo a sua unidade de acesso.
A abertura de um arquivo em disco associa um nome lgico ao nome fsico do arquivo,
prepara o arquivo para operaes de leitura e/ou escrita e torna corrente a primeira
posio do arquivo. Aps essa abertura, qualquer operao sobre o arquivo, quer seja
de leitura, escrita, alterao da posio corrente ou fechamento, deve ser
especificada no programa referenciando o nome lgico.
As operaes de leitura e escrita so sempre realizadas na posio corrente. Quando
um elemento j existe na posio corrente, e realizada uma operao de escrita no
arquivo, os valores j gravados so destrudos pela escrita dos novos valores.

Pgina 92

Quando realizada uma operao de leitura ou escrita, aps a leitura ou escrita dos
valores, a posio corrente incrementada para a prxima posio disponvel na
seqncia de elementos armazenados no arquivo.
O fechamento desfaz o apontamento para a posio corrente, tornando assim o
arquivo indisponvel para operaes.

Pgina 93

Dessa forma, para um programa utilizar os elementos armazenados em um arquivo em


disco, necessrio que o programa contenha:
l A declarao de urna VARIVEL TIPO ARQUIVO, que ser o nome lgico do arquivo
no programa. Essa varivel conter sempre, enquanto o arquivo estiver aberto, a
posio corrente. Qualquer operao sobre o arquivo especificada no programa dever
referenciar essa varivel,
2 A declarao de VARIVEIS que armazenaro os valores dos ELEMENTOS lidos ou
gravados. Essas variveis devero sempre aparecer nas operaes de leitura e escrita.
3 Um comando de ASSOCIAO do nome lgico ao nome fsico do arquivo.
4 Um comando de ABERTURA, que prepara o arquivo para as operaes de leitura
e/ou escrita e faz com que a varivel tipo arquivo aponte para a primeira posio de
acesso.
5 Um cornando de FECHAMENTO do arquivo, que anula a referencia a uma posio do
arquivo.
TIPOS DE ARQUIVOS
Um programa Pascal pode manipular dois tipos bsicos de arquivos: TEXTO e
BINRIO.

Um arquivo tipo texto aquele no qual os elementos esto armazenados sob a forma
de caracteres. Neste caso, a unidade de acesso o CARACTER. Um arquivo tipo
binrio aquele no qual os elementos esto armazenados sob a forma binria. Neste
caso, a unidade de acesso o REGISTRO. Assim, tanto o caracter para o arquivo
texto, quanto o registro para o arquivo binrio, so unidades indivisveis com relao
a acesso.
Portanto, um arquivo texto uma seqncia de caracteres armazenados em disco,
enquanto um arquivo binrio uma seqncia de registros armazenados em disco.
O tipo de armazenamento de um arquivo caracteriza em Pascal a aplicabilidade de
todos os procedimentos envolvidos para abertura, leitura, escrita, acesso direto,
fechamento e funes auxiliares.
ARQUIVOS TEXTUAIS
Um arquivo texto pode ser criado pelo programador com um editor de texto (exemplo:
editor do sistema Turbo Pascal) ou um programa.
Em um arquivo texto, podemos agrupar fisicamente os caracteres linha a linha,

Pgina 94

As marcas EOLN e EOF so marcas de controle, que significam End Of Line (fim de
linha) e End of File (fim de arquivo), respectivamente. Quando o programador cria o
arquivo texto com um editor, essa marca includa com a tecla <enter>. A marca EOF
automaticamente includa quando o arquivo gravado.
Exemplo:

A organizao fsica de um arquivo texto livre, devendo porm considerar os tipos


de dados das variveis que armazenaro os caracteres lidos.
Pgina 95

Alm da obrigatoriedade de dgitos, existe em Pascal uma norma fundamental para a


leitura de caracteres gravados em arquivos texto para variveis numricas: a leitura
de dgitos para uma varivel numrica encerrada somente quando encontrado um
caracter branco. Dessa forma, aps um grupo de dgitos que se quer ler para uma
varivel numrica, tem que haver um caracter branco no arquivo. O caracter branco
o delimitador de dgitos em um arquivo texto.
Tambm um grupo de dgitos quando possui um ponto, somente pode ser lido para uma
varivel numrica quando esta for do tipo real. O ponto caracteriza um valor real.
No caso de caracteres que sero lidos para variveis tipo caracter ou cadeia de
caracteres, a leitura realizada at o nmero mximo de caracteres que a varivel
pode armazenar.
Em um arquivo texto, podemos escrever (gravar) dados formatados, aplicando a
mesma formatao val;<c>:<d> aplicada para escrita em dispositivo padro,
Os caracteres armazenados em um arquivo texto somente podem ser acessados
seqencialmente, ou seja, para acessar (ler ou escrever) um caracter, antes tem que
ser lidos todos os caracteres anteriores a ele na seqncia de armazenamento.

Pgina 96

ARQUIVOS BINRIOS
Um arquivo binrio somente pode ser criado por um programa. Em um arquivo binrio,
o programador no tem a liberdade de escolher a organizao fsica de
armazenamento de seus elementos e as operaes de leitura e escrita so realizadas
sempre registro a registro.
Em Pascal, os registros de um arquivo binrio possuem uma numerao, efetuada
automaticamente quando da escrita (gravao) de cada registro. Essa numerao
inicia com 0 (zero). O primeiro registro ou primeira unidade de acesso de um arquivo
binrio em Pascal tem o nmero 0 (zero), o segundo registro ou segunda unidade de
acesso tem o nmero 1 (um) e, assim, sucessivamente, at a marca EOF (fim de
arquivo).

Um registro de um arquivo binrio em Pascal pode ser de tipo:


SIMPLES : caracter, integer, real
ESTRUTURADO : array, record
O acesso a um elemento ou registro de um arquivo binrio pode ser realizado
seqencialmente ou diretamente, atravs do nmero de registro do elemento,
DECLARAO
Declaramos os dois tipos de arquivos em Pascal da seguinte forma:
TIPO TEXTO

Var
Pgina 97

<nomeVarArq> : TEXT;
TIPO BINRIO

Var
<nomeVarArq> : FILE OF <nomeTipoReg>;
O smbolo TEXT um identificador de um tipo pr-definido para variveis tipo
arquivo texto.
Os smbolos FILE OF sao palavras reservadas, formando um construtor de tipo para
arquivos que armazenam registros, sendo que nomeTipoReg pode ser inteiro, real,
caracter, cadeia de caracteres, matriz ou record,
Exemplo:
Var
arq : text;
Type
TF = record
Num: integer;
Nome: string[50];
salario : real;
end;
str50 = string[50];
vet = array [1..30] of integer;
Var
arql : file of TF;
arq2 : file of integer;
arq3 : file of real;
arq4 : file of char; arq5 : file of str50;
arq5 : file of vet;
PROCEDIMENTOS BSICOS
ABERTURA E FECHAMENTO

Os procedimentos em Pascal para a abertura e o fechamento de um arquivo de dados


so:
ASSIGN RESET / REWRITE

Processamento Operaes L / E
CLOSE

O procedimento ASSIGN faz a associao do nome lgico no programa ao nome fsico


do arquivo no sistema operacional, independente do tipo de arquivo.
Pgina 98

Forma Geral:
ASSIGN ( <nomeLogico>, <nomeFisico> ) ;
Exemplo:
Program Exemplo1;
Var
arq : text;
Begin
assign (arq, ALUNOS.TXT);
End.
Program Exemplo2;
Var
arq : text;
nomeArq : string[8];
Begin
write (Entre com o nome do arquivo : );
readln (nomeArq);
assign (arq, nomeArq + .REV);
End.
Program Exemplo3;
Type
treg = record
nome : string[45];
salario : real
end;

Var
arq : file of treg;
Begin assign (arq, ALUNGS.DAT);
End.
Program Exemplo4;
Type
treg = record
nome : string[45];
salario : real
end;
Var
arq : file of treg;
nomeArq : string[8];
Begin
Pgina 99

write (Entre com o nome do arquivo : );


readln (nomeArq) ;
assign (arq, nomeArq + .REV);
End.
Os procedimentos RESET e REWRITE preparam um arquivo para as operaes de
leitura e/ou escrita, fazendo a varivel arquivo apontar para a primeira posio do
arquivo.
Forma Geral:
RESET ( <nomeLogico> ) ;
REWRITE ( <nomeLogico> ) ;
Exemplo:
Program Exemplo1;
Var
arq : text;
Begin
assign (arq, ALUNOS.TXT);
reset (arq);

End.

Pgina 100

Program Exernplo2;
Type
treg = record
nome : string[45];
salario : real
end;

Var
arq : file of treg;
nomeArq : string[8);
Begin
write (Entre com o nome do arquivo : );
readln (nomeArq);
assign (arq, nomeArq + .REV};
rewrite (arq);
End.

Alm da varivel arquivo, esses procedimentos inicializam o controle EOF de final de


arquivo da seguinte forma:

De acordo como o indicado neste quadro, os procedimentos RESET e REWRITE


independem do tipo de arquivo e tem as seguintes conseqncias:
Pgina 101

No procedimento RESET, quando o EOF inicializado como FALSE, o arquivo tem que
existir para poder ser aberto.
No procedimento REWRITE, quando EOF inicializado como TRUE, o arquivo ser
criado ou recriado (quando o arquivo j existir, todo o contedo j gravado ser
ignorado).

Pgina 102

Com relao ao processamento do arquivo, esses procedimentos tornam disponveis as


seguintes operaes:

De acordo como o indicado neste quadro, os procedimentos RESET e REWRITE com


relao a disponibilidade das operaes de leitura e escrita dependem do tipo de
arquivo e tem as seguintes conseqncias:
No arquivo TEXT, o procedimento RESET prepara o arquivo para operaes somente
de leitura, enquanto que o procedimento REWRITE prepara o arquivo para operaes
somente de escrita.
No arquivo FILE OF, ambos os procedimentos preparam o arquivo para as operaes
de leitura e escrita. Obviamente, no caso do procedimento REWRITE, as operaes
de leitura somente podero ser realizadas aps j existirem registros no arquivo.
O procedimento CLOSE fecha o arquivo, tornando-o indisponvel para quaisquer
operaes. Este procedimento no depende do tipo de arquivo,

Forma Geral:
CLOSE ( <nomeLogico> ) ;
Exemplo :
Program Exemplo1;
Var
arq ; text;
Begin
assign (arq, ALUNOS.TXT);
reset (arq);
close (arq)
Pgina 103

End,

Pgina 104

Program Exemplo2;
Type
treg = record
nome : string[45];
salario : real
end;
Var
arq : file of treg;
Begin
assign (arq, INVERT.ALU);
rewrite (arq);
close (arq)

End.
LEITURA E ESCRITA
Em Pascal, as operaes de leitura e escrita em arquivos so realizadas pelos
procedimentos READ, READLN, WRITE e WRITELN. Essas operaes dependem
do tipo de arquivo, como segue:

Esses procedimentos lem ou escrevem dados do/no arquivo e fazem a varivel tipo
arquivo apontar para a prxima posio do arquivo.
Pgina 105

As formas gerais desses procedimentos so:


TIPO TEXTO

READ ( <nomeVarArq>, var1, var2, var3, ... ) ;


READLN ( <nomeVarArqo, var1, var2, var3, ... ) ;
WRITE ( <norneVarArq>, val1, val2, val3, ... ) ;
WRITELN ( <nomeVarArq>, val1, val2, val3, . ) ;
onde var1, var2, var3, ..., e val1, val2, val3, ...., devem ser do tipo: caracter, cadeia de
caracteres, inteiro e real.
TIPO REGISTRO

READ ( <nomeVarArq>, varReg) ;


WRITE ( <nomeVarArq>, varReg) ;
Exemplo:
Program ListarArquivo;
Var
numero, tipo : integer;
nome : string[13];
nota 1, nota2, nota3 : real;
c : char;
FT : text;
Begin
assign (FT, ALUNOS.TXT);
reset (FT);
repeat
readln (FT, numero, c, nome, nota1, nota2, nota3, c, tipo) ;
writeln (Nome : , nome);
writeln (Nota 1 : , nota1:5:l);
writeln (Nota 2 : , nota2:5:l);
writeln (Nota 3 : , nota3:5: l);
writeln (Tipo : , tipo)
until eof (FT) ;
close (FT)

End.
Program ListarArquivo;
Var
numero : integer;
nome : string[13];
notal, nota2 : real;
C : char;
FT : text;
Pgina 106

Begin
assign (FT, ALUNOS.TXT);
reset (FT);
repeat
readln (FT, numero, c, norne, notal, nota2);
writeln (Nome : , nome);
writeln (Nota 1 : , notal:5:1);
writeln (Nota 2 : , nota2:5:1);
until eof (FT) ;
close (FT)
End.

Pgina 107

Program ArquivoRegistro;
Type TREG = record
mat : integer;
nome : string[13];
turma : integer

end;
Var
fr : file of TREG;
reg : TREG,
Procedure CriarArquivo;
J

var
ft : text;
Ig, pp, sc : real;
C : char;
begin
assign (ft, ALUNOS.DG); reset (ft);
repeat
readln (ft, reg.mat, c, reg.nome, Ig, pp, sc, c, reg.tipo);
write (fr, reg);
until eof (ft);
close (ft)
end;
i

Procedure ListarArquivo;
begin
seek (fr,O);
repeat
read (fr,reg);
writeln (Nome : , reg.nome);
writeln (Turrna : , reg.turma)
until eof (fr)
end;
/

Begin
assign (fr, ALUNOS.DAT);
rewrite (fr);
CriarArquivo;
ListarArquivo;
close (fr)
End.
S

Pgina 108

Nos exemplos anteriores, foi utilizada a funo EOF que retorna TRUE caso a posio
corrente seja EOF ou FALSE caso a posio corrente no seja EOF. A forma geral
dessa funo :
i

EOF ( <nomeVarArq> )
l

Pgina 109

RECURSOS ESPECIAIS PARA ARQUIVO BINRIO


Em Pascal, temos os seguintes recursos para a utilizao de arquivos binrios:
PROCEDIMENTO PARA ACESSO DIRETO
Esse procedimento altera a posio corrente de um arquivo binrio aberto em um
programa.
Forma Geral:
SEEK ( <nomeVarArq>, <numReg> ) ;
Exemplo:
Program ConsultarArquivo;
Type TREG = record
nome : string[l 3];
Ig, pp, sc : real
end;
Var
fr : file of TREG;
reg . TREG,
num : integer;
Begin
assign (fr, ALUNOS, DAT) ;
reset (fr); writeln (Entre com o numero de matricula ; );
readln (nurn);
while num <> 0 do
begin
seek (fr, num-1);
read (fr, reg);
writeln (reg.nome, reg,sc);
writeln (Entre corn o numero de matricula : );
readln (num)
end;
close (fr)
End.
FUNO PARA OBTER O TAMANHO DO ARQUIVO
Essa funo retorna a quantidade de registros armazenados no arquivo. A forma geral
:
FILESIZE (<nomeVarArq>)
Pgina 110

Exemplo:
Program IncluirRegistros;
Var fr : file of real; num : real;
Begin
assign (fr, DADOS.DAT);
reset {fr);
seek (fr, filesize(fr));
readln (num);
while num <> 0 do
begin
write (fr, num);
readln (num)
end;
close (fr)
End.
FUNO PARA OBTER O NMERO DE REGISTRO DA POSIO CORRENTE
A forma geral :
FILEPOS (<nomeVarArq>)
Exemplo:
Program AlterarArquivo;
Type TREG = record
nome ; string[13];
Ig, pp, sc : real
end;
Var
fr : file of TREG;
reg : TREG;
num : integer;
Begin
assign (fr, ALUNOS.DAT);
reset (fr);
writeln (Entre com o numero de matricula : );
readln (num);
while num <> O do
begin
seek (fr, num-l ); read (fr, reg); writeln (reg.nome, reg.lg, reg.pp, reg.sc); readln
(reg.lg); seek (fr, filepos(fr)-1); write (fr, reg); writeln (Entre com o numero de
matricula : ); readln (num)
end;
Pgina 111

close (fr)

End.

Pgina 112

Variveis Dinmicas e Apontadores


TIPO PONTE IRO
As estruturas estticas, como a matriz, definida em Pascal com o construtor ARRAY,
tem seu tamanho especificado estaticamente, em tempo de compilao. Dessa forma,
as posies da memria do computador necessrias para armazenar os valores de
dados so reservadas com a declarao da varivel esttica e ficam permanentemente
alocadas at o trmino da execuo do programa (ou sub-programa onde esto
declaradas ). Quando no conhecemos o tamanho de uma estrutura do tipo ARRAY,
ternos que maximiz-lo na declarao da varivel. Isto acarreta desperdcio de
memria.
Outro ponto a considerar que incluses e excluses de elementos entre outros
elementos de um ARRAY no so operaes eficientes, pois significam deslocar todos
os outros elementos que vem aps na seqncia,
O conceito de estruturas dinmicas, isto , que podem crescer na memria do
computador durante a execuo do programa, tem o objetivo de promover solues
eficientes para esses casos, Assim, temos as listas lineares, as filas, as pilhas, as
rvores e os grafos, cujo tamanho no definido em tempo de compilao e nas quais
as operaes de incluses e excluses de elementos entre outros elementos no
representam mover elementos da estrutura,
Para declarar estruturas dinmicas nas LPs, temos um construtor que cria uma
varivel que armazena valor de endereo de memria, ou, como comummente se diz,
aponta para um endereo de memria. Apontando endereo , a varivel pode formar
uma estrutura que cresce dinamicamente, onde cada elemento guarda o seu valor de
dado e o endereo do prximo elemento na seqncia, Tambm, dessa forma, incluir
ou excluir elementos entre outros elementos significa alocar e/ou atribuir endereos.
Variveis que armazenam endereos de memria denominam-se PONTEIROS. O
smbolo em Pascal que denota uma varivel ponteiro ^
Forma Geral:

VAR
<nomeVar> : <nomeTipoDado> ;
Exemplo:

Pgina 113

Neste exemplo, a varivel x um ponteiro que aponta para um local (endereo) de


memria, reservado para armazenar valores inteiros.
Exemplo:

Neste exemplo, a varivel pe um ponteiro que aponta para um local (endereo) de


memria, reservado para armazenar dados de um empregado,
Para que o espao apontado pela varivel ponteiro possa receber um valor de dado,
esse espao tem antes que ser explicitamente reservado ou alocado na execuo do
programa. Dessa forma, antes de um comando de atribuio ou leitura de valores de

Pgina 114

dados para uma varivel tipo ponteiro, o local de memria que ir receber esses
valores tem que estar reservado.
O procedimento NEW aloca o espao de memria em uma varivel ponteiro, ou seja,
atribui a varivel ponteiro um endereo de memria para receber o valor de dado.
Exemplo:
NEW (N);

NEW (pe);

Pgina 115

Na memria do computador, os dados apontados ficam armazenados em um


local da memria denominado HEAP, fora da rea de armazenamento do
programa e fora da pilha que armazena variveis locais . O procedimento NEW
armazena um endereo de um local do HEAP na varivel ponteiro.
Exemplo:

Pgina 116

Pgina 117

Variveis ponteiro podem ser referenciadas na rea de execuo por duas formas
diferentes:
a. Referencia ao valor de dado armazenado no local apontado
< nomeVarPT> ^
b. Referencia ao valor do endereo arrnazenado na varivel
< nomeVarPT>
Exemplo:

Quando trabalhamos com variveis ponteiro, comum a necessidade de inicializar


essas variveis fazendo-as apontar para nada, assegurando que elas ainda no
receberam um endereo . A palavra reservada em Pascal para essa inicializao NIL.
Exemplo:
px : = NIL; py : = NIL; pe : = NIL;

Outra operao necessria com ponteiros, liberar o espao de memria alocado


para uma varivel ponteiro. Essa operao realizada em Pascal com o procedimento
DISPOSE. Esse procedimento desaloca dinamicamente o endereo de memria
(destri a referencia) anteriormente armazenado na varivel ponteiro.

Pgina 118

Exemplo:

Pgina 119

Pgina 120

Apndice A

Pgina 121

Pgina 122

Apndice B

Pgina 123

Pgina 124

Apndice C

Pgina 125

Вам также может понравиться