Академический Документы
Профессиональный Документы
Культура Документы
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
Pgina 3
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:
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
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
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
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
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;
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 := 0;
for Dias := Segunda to Sabado do
begin
readln( HorasDeTrabalho );
TotalHoras := TotalHoras + HorasDeTrabalho;
end;
. . .
end.
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
REAIS
LITERAIS
ARRAY
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
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.
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
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
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
random( x )
pi
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,
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
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 )
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;
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.
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
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 }
...
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
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
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
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
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
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.
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
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
Pgina 49
Pgina 50
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
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 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
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
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;
Sintaxe
type
Nome-Do-Tipo = record
campo1 : tipo;
campo2 : tipo;
. . .
campoN : tipo;
end;
Reg_Aluno = record
Nome
: string(40);
Matricula : integer;
Notas
: array[1..3] of real;
end;
Pgina 58
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;
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
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;
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;
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;
Pgina 64
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
Pgina 67
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 ];
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
Pgina 70
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
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
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
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
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
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.
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
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
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 .
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
Processamento Operaes L / E
FECHAMENTO
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
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:
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).
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
Processamento Operaes L / E
CLOSE
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
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.
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
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
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
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
VAR
<nomeVar> : <nomeTipoDado> ;
Exemplo:
Pgina 113
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
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:
Pgina 118
Exemplo:
Pgina 119
Pgina 120
Apndice A
Pgina 121
Pgina 122
Apndice B
Pgina 123
Pgina 124
Apndice C
Pgina 125