	


LGICA DE PROGRAMAO



PASCAL / DELPHI



























www.curso2000.com.br





TURBO PASCAL / DELPHI




PROJETISTA DA LINGUAGEM PASCAL:


Niklaus Wirth
Professor da Escola Politcnica de Zurique.




ANO DE APRESENTAO  DA LINGUAGEM :


1971




REA DE APLICAO :

Linguagem de programao estrutura
da para o desenvolvimento de aplicaes de uso geral




OBJETO DESTE ESTUDO :


Linguagem Turbo Pascal 6.0, produzida pela Borland Intemational.


CONCEITOS  BSICOS:


VARIVEIS  NUMRICAS :

integer - Nmeros inteiros entre -32768 e 32767.

real - Nmeros reais de 11 algarismos significativos.

byte -  Nmeros inteiros entre 0 e 255.





VARIVEIS ALFANUMRICAS:

string -  Caracteres alfanumricos entre apstrofos.
char - String de apenas um caractere entre apstrofos.


VARIVEIS LGICAS:

boolean - Assume apenas valores booleanos, que so:
true (verdadeiro) ou false (falso).


OPERADORES ARITMTICOS :

* Multiplicao

/ Diviso

+ Soma

- Subtrao


OPERADORES RELACIONAIS:

< Menor que

> Maior que

= Igual a

<> Diferente de

<= Menor ou igual a

>= Maior ou igual a


OPERADORES LGICOS:

not - negao

and - e

or - ou

xor - ou exclusivo


COMANDOS DE DECLARAO DE VARIVEIS :

No Turbo Pascal a declarao de variveis  obrigatria no incio do programa 
pois, caso isso no acorra, o compilador acusar erro de compilao.

Exemplos:

Varivel inteira A, real B e booleana C.

Var

A : integer;
B : real;
C : boolean;

Na declarao de uma varivel string, necessita-se informar a sua mxima 
extenso. Esta declarao da extenso reserva uma rea fixa na memria para 
o processamento.

Exemplo:

A varivel string R com 13 caracteres, seria assim declarada:

Var

R : string[13];

Para declarar mais de uma varivel do mesmo tipo, pode-se proceder das duas 
seguintes formas:

Var

x, y, z : integer;

ou

x : integer;
y : integer;
z : integer;


EXPRESSO DE ATRIBUIO DE VALORES :

A:=B+5;

O smbolo := equivale  uma flecha ( <- ), indicando que  uma atribuio.



PONTO E VRGULA:

O ponto e vrgula no Turbo Pascal indica o fim do comando e sua presena  
obrigatria


INCIO E FIM DE PROGRAMA:

Todos os programas em Turbo Pascal devem comear e terminar desse modo:

program Exemplo;
.
.
begin
.
.
.
.
.
end.

O "program" indica o incio do programa;

"Exemplo"  um nome qualquer dado ao programa;

"begin" indica o incio e 'end" o fim do processamento.


COMENTRIOS:

Os comentrios devem ser escritos entre chaves , {....} ou parnteses com 
asterisco - (*....*). No h necessidade de terminar a linha do comentrio com 
ponto e vrgula.

Exemplo:

{Exemplo de como escrever um comentrio}

(* Pode-se escrever tambm desta foram *)


COMANDOS DE ENTRADA E SADA:


SADAS DE INFORMAES NO VDEO:

write - Apenas imprime

writeln - Imprime e envia o sinal de mudana de l1nlla (Line Feed)

Tudo o que se deseja imprimir deve vir entre parnteses.

Exemplo 1:
 Imprimindo a varivel A.

writeln(A);

Exemplo 2:
Imprimindo o texto sempre entre apstrofos 1').

writelnl'confirma a Resposta (S/N) ? ');

Exemplo 3:

Program Prog01 ;

var

LARGURA, COMPRIMENTO, ALTURA: integer;

begin

LARGURA := 10;
COMPRIMENTO := 3;
ALTURA := 2;
writeln('VOLUME = ', LARGURA*COMPRIMENTO*ALTURA,' Cm3'):

end.



O resultado do programa acima ficaria assim no vdeo:
VOLUME = 60 cm3





SADA DE INFORMAES NA IMPRESSORA:

Os comandos que acionam a impressora so os mesmos do vdeo, ou seja, 
write e writeIn, acrescidos do parmetro (lst).

Exemplo:

writeIn(lst,'VOLUME = ', LARGURA*COMPRIMENTO*ALTURA,' cm3');

OBS.: O comando de mudana de linha (line feed)  dado aps a impresso no 
exemplo anterior. A saida do comando de impresso (VOLUME = 60 cm3) seria 
a mesma com os comandos abaixo:

write(lst,'VOLUME = ');
write(lst,LARGURA*COMPRIMENTO*ALTURA);
write(lst,'cm3');

ENTRADA DE DADOS:

read - No inclui "tine feed" aps a operao.

readln - inclui "line feed" aps operao

Exemplo:

readIn(QUANTIDADE);

OBS.: Quando for necessrio mais de uma entrada read ou readIn, os dados a 
serem digitados no devem ser separados por vrgulas e sim por espao.

readln(COMPRIMENTO,LARGURA,ALTURA);

OBS.:  conveniente pedir apenas uma entrada de dado por cada comando 
read ou readIn, para que no ocorra inconvenientes na entrada de textos.

Exemplo:

Program Prog02;

var
      C,L,A : integer;

begin

     write('DlGlTE COMPRIMENTO');
     readln(C);

     write('DIGITE LARGURA');
     readln(L);

     write('DIGITE ALTURA');
     readln(A);

     writein('VOLUME = ',c*L*A,' cm3');

end.

OBS.: Quando usado o comando writeIn sem variveis a serem impressas, 
causar apenas o envio de um line feed (mudana de linha) para a tela ou 
impressora.


ESTRUTURA DE DECISO:

COMANDO lF:

Na estrutura de deciso em PASCAL, utiliza-se os comandos if / then / else / 
end, conforme apresentados nos exemplos abaixo.

Estrutura de deciso SIMPLES (if/ then / end):

Exemplo:

Program Prog03;
{Estrutura de Deciso Simples}

var

    VALOR : real;

begin

     write('DIGITE UM VALOR NEGATIVO');
     readln(VALOR);

     if VALOR > 0 then
        begin
            writeln('FOI DIGITADO UM VALOR POSITIVO !');
       end;

end.

OBS: Observe o END com ponto e vrgula aps o if.



Estrutura de deciso COMPOSTA (if / then / else / end):
Na estrutura de deciso composta em PASCAL,  necessrio tomar 
alguns cuidados. O comando end que precede o else do exemplo abaixo, no 
deve levar ponto e vrgula. O ponto e vrgula ali posicionado, indicaria que j 
chegou ao fim da atuao do comando if anterior. Portanto, somente o segundo 
e ltimo end deve receber o ponto e vrgula. Veja os exemplos a seguir:

Program Progo4;
{Estrutura de Deciso Composta}

var
      VALOR : real;

begin

      writel'DIGITE UM VALOR: ');
      readIn(VALOR) 

      if VALOR > lo then
         begin
             writeln('O VALOR  MAIOR QUE 10');
         end
      else
         begin
             writeln('o VALOR  MENOR DO QUE lo');
         end;
end.

Program Prog05;

var
    VALOR : real;

begin

    write('DIGITE UM VALOR POSITIVO MENOR QUE 100:');
    readIn(VALOR)

    if (VALOR > 0) and (VALOR < 100) then
       begin
           writeln('fol DIGITADO CORRETAMENTE')j
       end
    else
       begin
           writeln('fol DIGITADO ERRADO');
       end;

end.


COMANDO CASE:

O comando case  extremamente importante para estruturao de um 
programa que possua diversas opes de execuo, tomando-o bem legvel e 
estruturado, evitando o uso repetido do if.

Exemplo:

Program Prog06;

var

    VALOR : integer;

begin
    write('DIGITE UM NMERO ENTRE 0 e 2 INCLUSIVE');
    readIn(VALOR);

    case VALOR of

      0 : begin
               writeIn('NMERO DIGITADO = ZERO');
           end;

      1 : begin
              writeIn('NMERO DIGITADO = UM');
           end;

      2 : begin
              writeIn('NMERO DIGITADO = DOIS');
          end;

    end; {case)

end.

O comando case oferece uma opo de else (se no). Veja o exemplo abaixo:

Program Prog07;

var

     VALOR : integer;

begin
    write('DIGITE UM NMERO ENTRE 0 E 2 INCLUSIVE');
    readln(VALOR);

    case VALOR of

       0 : begin
                writelnl'Nmero Digitado = zero');
            end;

       1 : begin
                writeln('Nmero Digitado = um');
            end;

       2 : begin
                writeln('Nmero Digitado = dois');
            end;

       else

           begin
               writeln('VOC DIGITOU FORA DA FAIXA DE 0 A 2 ');
           end;

       end; {case}

end.

OBS: A varivel do case pode ser de qualquer tipo at agora citado. Vejamos 
um exemplo do comando case com uma varivel de seleo do tipo char:

Program Prog08;

var
    RESP : char;

begin
    readIn(RESP);

    case RESP of

      'S' : begin
                 writeln('voc DIGITOU S');
             end;

      'N' : begin
                  writeln('voc DIGITOU N');
             end;

    end; {case}

end.

OBS: A presena dos apstrofos limitando as letras S e N indica que a 
comparao deve ser feita em relao a um string.



FUNES MATEMTICAS:

abs(X) - Retorna o valor absoluto de X.

arctan(X) - Retorna o arco tangente de X em radianos.

cos(X) - Retorna o cosseno de X (X deve estar em radianos).

exp(X) - Retoma o valor de e elevado  X.

frac(X) - Retorna a parte decimal (fracionria) de X.

int(X) - Retorna o valor inteiro de X.

ln(X) - Retorna o logaritimo natural ou neperiano de X.

sin(X) ~ Retorna o seno de X (X em radianos).

sqr(X) ~ Retoma o quadrado de X.

sqrt(X) - Retoma a raiz quadrada de X.


POTENCIAO:

A potenciao A = BC ( A  igual a B elevado  C ) obtem-se da seguinte forma:

A := exp(C*In(B))


FUNES DE MANIPULAO DE STRING :

concat(X,Y,...) , Concatena as strings X, Y, ...

OBS : Pode-se tambm usar a soma (+) de strings.

Exemplo:

A :='AERO';

B := 'DINAMICA';

concat(A,B) retorna AERODINAMICA.

copy(X,Y,Z) - Extrai Z caracteres a partir do Y-simo caractere da string X.

Exemplo:

A := 'AERODINAMICA';

copy(A,5,4) retoma DINA.

lenght(X) - Retorna o comprimento da string X.

Exemplo:

A := 'AERODINAMICA';

lenght(A) retorna 12.

pos(X,Y) - Retorna a posio da string X dentro da string Y. Se no for 
encontrada retornar 0.

Exemplo:

A := 'FUMEC';

B :='M';

pos(A,B) retorna 3.

delete(A,B,C) - Remove C caracteres a partir da posio B da string A.

Exemplo:

A:='PANCADARIA';

delete(A,3,3); a varivel A conter Padaria.

insert(A,B,C) - Insere A na string B, a partir da posio C.

Exemplo:

A :='NCA';

B :='PADARIA';

C :=3;

insert(A,B,C); a varivel B conter PANCADARIA.

str(X,Y) - Converte o valor numrico de X num string Y.

Exemplo:

x := 15;

str(X,Y); a varivel Y conter a string 15.

val(X,Y,Z) - Converte a string X em nmero e atribui  varivel Y. A varivel Z 
deve ser inteira e indica o sucesso ou no da converso. Em caso de sucesso, 
Z conter zero, caso contrrio, conter a posio do caractere que ocasionou o 
problema.

Exemplo:

X :='1234';

val(X,Y,Z); a varivel Y conter o nmero 1234 e Z valer zero.


FUNES DE TRANSFORMAO:

chr(x) - Retorna o caractere cujo cdigo ASCII  X.

Exemplo:

chr(42); retornar o sinal *.

round(X) - Provoca o arredondamento na primeira casa decimal.

Exemplos:

x := 18.5;

round(X) retorna 19.

X := 17.4;

round(X) retoma 17.

trunc(X) - Retorna o maior inteiro no maior que X (menor ou igual a X)


FUNES ESPECIAIS:

keypressed -  uma funo booleana que devolve o valor true se alguma tecla 
estiver sendo pressionada e false em caso contrrio.

random - Retorna um nmero real randmico entre 0 e 1.

random(X) - Retoma um nmero real randmico entre 0 e X.

upcase(X) - Se o caractere X do tipo char for minsculo, converte-o para 
maisculo. Caso contrrio, no h alterao.

OBS: As funes e os procedimentos descritos at aqui so chamados 
predefinidos ou predeclarados. Mais adiante estudaremos como se utilizam as 
funes e os procedimentos declarados pelo prprio usurio.


ESTRUTURA DE REPETIO:

COMANDO WHILE:

os comandos a serem repetidos , ou seja, aqueles que sero submetidos ao 
loop, devem estar limitados por begin e end.

A condio de repetio  testado antes, e portanto, os comandos envolvidos 
no while podem no ser executados nenhuma vez.

Exemplo: Programa para calcular e imprimir os nmeros inteiros de 0 a 100.

Program Prog09;

var

    I : real;

begin

     I:=o;

     while 1 <= 100 do
          begin
              writeIn(I);
               I := I+1;
         end;

end.

As condies que acompanham o while podem ser compostas de not, and, or e 
xor, tal como o comando if.


COMANDO GOTO:

	O comando goto desvia o processamento do ponto em que for 
encontrado, para outra Iinha do programa que est marcada com um Iabel 
(rtulo). Este Iabel necessita ser declarado no incio do programa.
	Este recurso (goto / Iabel) nos permite abandonar de forma "radical" um 
Ioop, antes que seja executado at o final por vias normais. O goto  um 
comando "forte" que pode abandonar no s o loop controlado pelo while como 
tambm os Ioops gerados pelos outros dois comando de repetio que 
estudaremos mais adiante (for e repeat).

Exemplo:
O programa abaixo permite a entrada de no mximo dez nmeros para serem 
somados dentro da varivel SOMA, ou at ser digitado zero:

Program Prog10;
var
     I, SOMA : integer;
label
     FIM;
begin
     1 := 0;
     SOMA := 0;

     while I <= lo do
          begin
              write('DIGITE VALOR: ');
              readln(NUm);

              if NUM o 0 then
                 begin
                     SOMA := SOMA + NUM;
                 end
             else
                 begin
                      goto FIM;
                 end;

             I := I + 1 ; 
          end;

          FIM:
              writeln ('SOMA DOS NMEROS= ', SOMA);

end.

COMANDO FOR:

As linhas do programa a serem controladas pelo comando for devem estar 
entre begin e end;

A varivel de controle pode ser somente do tipo integer.

O passo (step)  sempre +1 ou -1.

Exemplo:

Programa para calcular e imprimir os valores numricos de 1 a 10

Program Prog11;

var
     I : integer;

begin

     for I :=1 to lo do
        begin
            writeIn(I);
        end;

end.

	Desejando decrementar a varivel de controle, teremos a seguinte 
configurao:

Program Prog12;

var 
     I : integer;

begin

     for I := 10 downto 1 do
        begin
            writeIn(I);
        end;

end.

	Quando houver necessidade da existncia de um for dentro da estrutura 
de outro for, a escrita do programa ficar assim:

Program Prog131

var
    I,J ; integer;

begin

     for I := 1 to 10 do
        begin
             .
             for J := 1 to 10 do
                begin
                     .
                               .
                     .
                end;


             .
      end;

end. 

OBS: O comando repetitivo for deve ser utilizado nos locais em que a 
quantidade de vezes a ser repetida j est determinada antes da sua 
execuo. Isto significa que no devemos fazer atribuies  varivel de 
controle do for dentro da prpria estrutura. Esta varivel pode ser utilizada para 
ser impressa ou para clculos, mas jamais deve receber algum valor.


COMANDO REPEAT / UNTIL:

	O comando repeat controla repeties de trecho de programa tal como o 
for, mas h duas diferenas fundamentais:

	- O nmero de vezes que se repetir as linhas de programa situadas 
dentro do repeat / until no precisa estar predefinido. Os prprios comandos 
situados entre o repeat e o until podem determinar a sada ou no do loop de 
repetio.

	- A verificao da suficincia ou no da condio de repetio  feita no 
fila do loop.

Exemplo:

Suponha um programa que s termina quando for digitado um nmero 
negativo:

Program Progl 4;

var
    VALOR : real;
begin
    VALOR := 0;

    repeat

            writel'DIGITE UM NMERO NEGATIVO') ;
           readln(VALOR);

    until VALOR < 0;

end.




OBS:

	- Os comandos a serem repetidos no necessitam ser limitados por 
begin e end.

	- As condies que acompanham o repeat / until podem ser compostas 
de not, and, or e xor, tal como no comando if.

	- Os comandos internos ao repeat / until so executados pelo menos 
uma nica vez.

Outro exemplo:

Program Prog15 ;

var
     I : real;

begin
     I:=0;

     repeat

        writeln(I);
        I := I + 1;

     until I > j 00
end.

OBS:

	No repeat e while, o incremento ou decremento da varivel de controle 
deve ser providenciado internamente na lgica por quem desenvolveu o 
programa.


RESUMINDO:

	Os trs tipos de comandos de controle de repetio devem ser utilizados 
visando s seguintes caractersticas:

	- Comando for:
	Utiliza-se no caso de saber o nmero de repeties antecipadamente e o 
passo de incremento ou decremento for sempre 1. No se deve alterar o valor 
da varivel de controle.

	- Comando repeat:

	Controla a condio de repetio aps sua execuo. Este comando  
sempre executado pelo menos uma vez.

	- Comando while:
	Controla a condio de repetio antes da sua execuo. Pode ocorrer 
situaes em que o comando while no seja executado.

MATRIZES:

	A declarao de uma matriz no Turbo Pascal  obrigatria. Por exemplo, 
para se declarar uma matriz MAT de uma nica dimenso (vetor) composta de 
50 nmeros inteiros, seria feito da seguinte forma:

var
    MAT : array[1..50] of integer;

	No caso de uma matriz bidimensional de 50 linhas e 100 colunas, 
composta de string de 10 caracteres, seria assim:

var
    MAT : array[1..50 , 1..100] of string[10];

OBS:
Os elementos que formam as matrizes so conhecidos com variveis 
indexadas. Estas variveis alm de serem indexadas, podem ser utilizadas de 
todas as formas que so utilizadas as variveis comuns (clculos, impresses, 
etc...).

Exemplo:

programa para receber via teclado 5 elementos para serem armazenados no 
Vetor VET e som,los na varivel TOTAL:

Program Prog16;

var
     VET : array[1..5] ofinteger;
     TOTAL,I : integer;

begin
     TOTAL := 0;
      for I :=1to 5 do
         begin
              write('DIGITE ELEMENTO ',I,': ');
              readIn(VET[I]);
              TOTAL := TOTAL + VET[I];
         end;

      writeIn(TOTAL);

end.

Outro exemplo:

Programa para receber via teclado os elementos da Matriz MAT, que possui 10 
Linhas e 5 colunas:

program Prog 17;
var
     LINHA, COLUNA : integer;
     MAT : array[1.. lo , 1..5] ofinteger;
begin
     for LINHA := 1 to lo do
        begin
            for COLUNA := 1 to 5 do
                begin
                     writeI'DIGITE ELEMENTO ',LINHA,'X',COLUNA,':
                     readln(MAT[LINHA,COLUNA]);
                end;
        end;
end.

	Para transferir todos os elementos de uma matriz MAT para outra matriz 
chamada COPIA, pode-se utilizar a tcnica de acesso a todos os elementos da 
matriz MAT, usando geralmente o comando for. Supondo que a matriz MAT de 
uma nica dimenso (vetor) estivesse anteriormente carregada, poderamos 
fazer da seguinte forma:

.

.
for I := 1 to lo do
     begin
         COPIA[I] := MAT[I];
     end;
.
.

ou simplesmente:

COPIA := MAT;

A atribuio acima pode ser feita com qualquer matriz, independente de sua 
dimenso.


PROCEDIMENTOS:

	Um procedimento  uma sub-rotina que fica desmembrada da lgica 
principal do programa e que geralmente  necessrio sua execuo em vrios 
pontos do programa. Para isto, basta determinar o processamento do 
procedimento atravs da referncia ao seu nome, que deve ser devidamente 
declarado e escrito no incio do texto do programa. Nas linhas em que for 
encontrado o nome do procedimento, ser determinado a sua execuo, e 
aps ser executado, ocorrer o retomo do processamento para a prxima linha 
aps o nome que ordenou a execuo.

	Os procedimentos devem vir no incio do programa (declarados pelo 
comando procedure), pois a chamada efetuada pelo programa principal utiliza o 
prprio nome do procedimento. Isto  necessrio por que a medida que o 
compilador vai avanando no seu trabalho, ele confirma as palavras e as 
sentenas, para verificar se no h erro de sintaxe. Caso o compilador 
encontre uma palavra desconhecida, toma-se necessrio analisar se foi erro do 
programador ou uma palavra nova criada por ele. Se a declarao do 
procedimento no viesse antes da sua utilizao, o compilador no teria como 
distinguir entre um erro e a chamada de um procedimento.

program Prog18 ;

procedure MENSAGEM;
begin
    writeIn ('LTPI - LINGUAGEM TURBO PASCAL');
end;

{--* PROGRAMA PRINCIPAL *--}
begin

     {-- MANDA EXECUTAR O PROCEDIMENTO --}
     MENSAGEM;
     {-- ESTE  O PONTO DE RETORNO DO PROCEDIMENTO --}

end.


OBSERVAES:

	O Pascal em si possui poucos comandos e algumas liaes e 
procedimentos pr-declarados dentro de si mesmo. O usurio pode criar a sua 
biblioteca de procedimentos e enriquecer o vocabulrio do TURBO PASCAL. A 
fora desta linguagem passa a depender da pesquisa e da experincia do seu 
usurio.
	No se pode desviar de um procedimento para outro atravs do 
comando goto, ou seja, de um subprograma para outro.

VARIAVEIS LOCAIS E GLOBAIS:

VARIAVEIS LOCAIS:

	Para facilitar o entendimento do conceito de variveis locais, imagine um 
grande programa (com vrios procedimentos) escrito simultaneamente por 
diversos programadores. Cada programador no precisa preocupar-se com os 
nomes das variveis que outro esteja utilizando para desenvolver o seu 
procedimento. Cada varivel s vale dentro do seu respectivo procedimento e 
deve ser declarada cada vez que se fizer presente. Os valores contidos em 
variveis locais perdem-se aps a execuo do procedimento.

VARIAVEIS GLOBAIS:

	Estas variveis valem para qualquer parte do programa, exceto no caso 
de ser novamente declarada como varivel local dentro de um procedimento. 
Toda declarao de variveis  feita no incio do programa.

Exemplo:

program Prog19;

{-- DECLARAO DE VARIVEIS GLOBAIS--}

var

I: integer;

procedure TESTE;

var

     I : integer;
begin
    I := 5;
end;

{--* PROGRAMA PRINCIPAL *--}
begin

    I := 1;
    TESTE;

    writeIn(I);

end.

OBSERVAO: Ao dar RUN no programa anterior, o valor impresso na tela 
dever ser 1 e no 5, apesar da varivel I ter sido tambm declarada dentro do 
procedimento (varivel local que perde o seu valor aps a execuo do 
procedimento). Esta declarao tornou-a uma varivel local e portanto, distinta 
da I global. Se retirssemos a declarao da varivel I que est dentro do 
procedimento esta seria tratada como varivel global e o resultado a ser 
impresso seria 5.

PASSAGEM DE PARMETROS:

	Um procedimento pode trabalhar com valores, mesmo que no sejam 
usadas variveis globais. Para isto temos um recurso chamado passagens de 
parmetro. O grande poder dos parmetros est nesta correta passagem de 
valores entre o programa principal/procedimento e o procedimento chamado.

Observe o exemplo abaixo:

Program Prog20;

procedure MULT(A,B : real);
begin
     writeIn(A * B);
end;

{--* PROGRAMA PRINCIPAL *--}
begin

      MULT (3,5);

end.

OBS.: O programa anterior consiste em um procedimento que imprime o valor 
do produto de dois nmeros recebidos pela passagem de parmetros e um 
programa principal que manda executar o procedimento MULT enviando os 
valores numricos 3 e 5 como parametro.

Observaes:

- No foi utilizada nenhuma varivel global.

- As variveis A e B do procedimento no precisam ser declaradas, pois so 
variveis de passagem e foram declaradas no incio do procedimento na linha 
do comando procedure. 

- O programa principal no utiliza nenhuma varivel. 

- As variaveis de passagem recebem os valores na mesma ordem em que so 
declaradas como parmetros. Isto quer dizer que, para efeito de clculo dentro 
do procedimento MULT, o A assumiu o valor 3 e B assumiu o valor 5. . .

Outro exemplo:

Program Prog21;

procedure MULT(A,B: REAL);
var
     C : real; (-- VARIVEL LOCAL -- j.

begin
     C ;= A * ~~
     writeln(C);
end.

{-* PROGRAMA PRINCIPAL *--}
begin

     MULT(3,5);

end.

OBS.: Neste programa foi includa a varivel C, que  local, para 
armazenamento temporrio do resultado da multiplicao.  interessante 
separar cada um dos mdulos do programa de forma bem visvel para facilitar 
o acompanhamento, principalmente se os programas forem ficando extensos.

	Utilizando somente variveis globais, no haveria necessidade de 
passar parmetros para o procedimento e o programa ficaria assim:

program Prog22;

var
     A,B,C : real (-- VARIVEIS GLOBAIS --)

procedure MULT;
begin
     C := A * B;
      writeIn (C);
end;

{--* PROGRAMA PRINCIPAL *--}
begin

     A := 3 ;
     B := 5;
     MULT;

end.

OBS.: Neste caso, o writeln poderia estar no programa principal que iria 
imprimir do mesmo modo o mesmo resultado, desde que estivesse posicionado 
aps a chamada do procedimento.

	H mais um modo de trabalhar com PROCEDIMENTO. At agora, os 
valores eram passados a partir de uma chamada para o PROCEDIMENTO. O 
processo inverso, ou seja, passar valores de um procedimento para o 
programa principal ou procedimento que o chamou, pode ser efetuado 
mediante uma pequena alterao na declarao local, acrescentando o 
comando var.

Exemplo:

program Prog23;

var

     A,B,C : real;

procedure MULT(X,Y : real; var Z: real);
begin
    Z := X * Y;
end;

{--* PROGRAMA PRINCIPAL *--}
begin

     A := 3;
     B := 5;
     MULT(A,B,C);
     writeIn(C);

end.

OBS.: Quando se usa este tipo de declarao do procedimento (usando var), 
permite-se que um valor seja retomado de um procedimento para utilizao 
fora dele. 

No exemplo, a varivel local Z passou o valor 15 de volta para a varivel global 
C, quando o processamento retornou do procedimento para o programa 
principal.

Vejamos os dois exemplos a seguir:

program Prog24;

var
     A,B : real;

procedure SOMA(X,Y : real);
begin
      X := X + Y;
      writeIn (X);
end;

{--* PROGRAMA PIIINCIPAL *--}
begin

     A := 2;
     B := lo;
     SOMA (A,B);
     writeIn (A);

end.

OBS.: Os resultados obtidos ao rodar o programa acima so, respectivamente 
12 e 2. Observe que a varivel global A permanece com o mesmo valor, pois 
houve apenas a passagem de parmetro no sentido de ida.

program Prog25;

var
      A,B : real;

procedure SOMA(var X,Y : real);
begin
      X := X + Y;
      writeIn (X);
end;

{--* PROGRAMA PRINCIPAL --}
begin

      A := 2;
      B := lo;
      SOMA(A,B);
      writeIn (A);

end.

	Desta vez, os resultados impressos so respectivamente 12 e 12. 
Devido a presena do var na declarao, o valor da varivel X foi passado de 
volta para a varivel A ao retornar para o programa principal.


FUNES:

	A estrutura de uma funo (function)  muito parecida com um 
procedimento. Pode-se imaginar que uma funo  um procedimento com 
caractersticas especiais quanto ao retorno de valores. No Turbo Pascal, uma 
funo pode ser to bem elaborada quanto um programa qualquer.

	Uma caracterstica que distingue uma funo de um procedimento  que 
a funo pode ser impressa, atribuida ou participar de clculos como se fosse 
uma varivel qualquer.

program Prog26;

var
      A,B,C: real;

function PROD(X,Y : real) : real;
begin
      PROD := X * Y;
end;

{--* PROGRAMA PRINCIPAL *--}
begin

      A := 2;
      B := 110;
      C := PROD(A,B);
      write (C);

end.

OBS.: O resultado impresso ser 20.

	Na declarao da funo, alm do que est dentro dos parnteses, h 
mais uma definio, indicando que a funo  do tipo real, ou seja, retorna ao 
local onde foi chamada, assumindo a condio de uma varivel real. Neste 
caso, a funo s assume valores coerentes com essa declarao.

	Como uma funo pode ser impressa, atribuida ou participar de clculos 
como uma varivel qualquer, isto nos permite, em vez de utilizar a varivel C, 
imprimir diretamente a funo da seguinte maneira:

	WRITELN (PROD(A,B));

E teremos o mesmo resultado.

Outro exemplo:


Vejamos uma funo que soma dois nmeros inteiros digitados via 
teclado:

Program Prog27;

var

   x,y;integer;

function SOMA(A,B : integer) : integer;
begin
   SOMA := A + B;
end;

 {-* PROGRAMA PRINCIPAL *--}
begin

   readIn (X);
   readIn (Y);
   writeIn (SOMA (X,Y));

end.

OBS.: Na declarao da funo podemos acrescentar a clusula VAR e obter 
os mesmos recursos adicionais do procedimento feito desta forma.

program Prog28;

var

   A,B,C: real;

function PROD(X : real; var Y : real) : real;
begin
   PROD := X * Y;
   X := 1
   Y := 1
end;

{--* PROGRAMA PRINCIPAL *--}
begin

   A := 2;
   B := lo;
   writeln (PROD (A,B));

end.

Aps a chamada da funo, as variveis X e Y terminam valendo 1. Mas 
na declarao da funo somente a varivel Y recebe VAR. Isto implica que o 
valor final de Y  passado de volta ao local onde foi solicitada a funo, 
fazendo com que B passe a tomar-se 1 em vez do valor original l0 Isto tudo no 
ocorreu com a varivel A, que continua valendo 2 tal como antes.

No caso de uma funo ser do tipo STRING, deve-se definir primeiro o 
tipo de dado e depois colocar o nome deste tipo na declarao da funo.

Type
     STR1O : string[10];

   function EXEMPLO(          ) : STR1O;


FUNES E PROCEDIMENTOS PR-DECLARADOS 
PARA COTROLE DE TELA

O Turbo Pascal possui algumas funes e procedimentos pr-
declarados para controle da tela:

clrscr - Comando para limpar a tela.

clreol - Este comando apaga todos os caracteres da linha que esto  direito do 
cursor.

delline - Apaga a linha onde est o cursor e causa scroll nas linhas seguintes 
de tal modo que preencha a linha deletada.

insline - Este comando funciona de modo oposto ao delline. Insere uma linha 
vazia na posio onde est o cursor. Provoca scroll nas linhas seguintes.

gotoxy(X,Y) - Movimenta o cursor para coluna X, linha Y da tela. A contagem 
das colunas e linhas comea no 1, ou seja, o canto superior esquerdo possui 
coordenadas (1 ,1).

lowvideo - Diminui a luminosidade dos caracteres na tela.

highvideo - Aumenta a luminosidade dos caracteres na tela.

norrnvideo - Retoma a luminosidade normal.

OUTROS RECURSOS:

delay(X) - Provoca uma pausa no processamento equivalente a X 
millissegundos. X deve ser definido como nmero inteiro.

exit - Abandona o bloco corrente. Estando numa sub-rotina, retoma ao bloco 
onde foi feita a sua chamada. Se usado no programa principal, termina a 
execuo do mesmo.

Halt - Interrompe o processamento do programa e retoma ao nvel de sistema 
operacional.

randomize - Inicializa o gerador de nmeros aleatrios com um valor aleatrio.

prograrn Prog29;

var

      I: integer;

begin

     clrscr;

     for I := 1 to 20 do

     begin
          gotoxy ( lo,();
           writeln('** LTP1 - FUMEC **');
     end;

end.


prograrn Prog30;

begin

     clrscr;
     gotoxy(30,08); writel'li Incluir ');
     gotoxy(30, lo); writel'2] Alterar ');
     gotoxy(30,12); ~vritel'3] Excluir ');
     gotoxy(30,14); writel'4] Pesquisar');
     gotoxy(30,16); writel's] Finalizar');
     gotoxy(30,20); ~vritel'opo ? ');

end. '


DECLARAO DE OUTROS TIPOS ESPECIAIS DE 
DADOS (TYPE):


- SCALAR (ESCALAR);

-SUBRANGE(SUBINTERVALO);

-SET(CONJUNTO);

- RECORD (REGISTRO).



SCALAR
"SCALAR TYPE"  um tipo de dado que se assemelha a um vetor com 
seus elementos ordenados, sendo que o prprio usurio pode definir os seus 
tipos de dados. Por exemplo, se criar-mos dados do tipo Dias da Semana 
(DOMINGO, SEGUNDA, etc), significa que a varivel associada a este tipo, 
somente poder assumir os dados que so os Dias da Semana.

Exemplo:

program Prog3 1 ;

type
     Semana = 
(DOMINGO,SEGUNDA,TERA,QUARTA,QUINTA,SEXTA,SABADO);

var
    DIA : Semana;

begin

     for DIA := DOMINGO to SABADO do
           begin
                ..........
                       ..........
                       ..........
              ..........
         end;

end.

Observaes:

- O comando type foi usado para a declarao (definio) do tipo.

- O tipo de dado Semana  composto pelos valores definidos no 
programa, que so os Dias da Semana (de DOMINGO a SBADO).

- A varivel DIA assume valores que so os Dias da Semana e  usada 
para controlar o comando for.

- A repetio  executada sete vezes e sero atribudas  varivel DIA 
todas as sete possibilidades definidas. 

Um escalar definido pelo usurio no pode ser impresso atravs de um 
comando write ou writeIn, devendo ser detectado de modo indireto como no 
exemplo a seguir., que se utiliza das 4 estaes do ano:

prograrn Prog32;

type
    Estacoes = (VERO, OUTONO, INVEMIO, PRIMAVERA);

var
    EST : Estacoes;

begin

     for EST := PRIMAVERA downto VERAO do
           begin

                case EST of

                          VERO                    : begin
                                                                 Writeln('MUITO CALOR');
                                                            end;

                        OUTONO                 : begin
                                                             Writeln('AS FOLHAS CAEM');
                                                           end;

                        INVERNO                 : begin
                                                                Writeln('MUlTO FRIO');
                                                            end;

                         PRIMAVERA             : begin
                                                                  Writeln('MUITAS FLORES');
                                                             end;

               end;

          end;

end.

As sadas do programa anterior, sero as seguintes:
MUITAS FLORES
MUITO FRIO
AS FOLHAS CAEM
MUITO c ALOR

No exemplo acima no comando for foi utilizado a clusula downto, que 
inverteu a ordem de impresso dos dados tipo Estaes.


SUBRANGE (SUBINTERVALO):

Os tipos integer, real, byte, char e boolean tambm fazem parte dos 
ESCALARES, sendo que j esto PREDEFINIDOS.
Todos os dados do tipo escalar apresentam subintervalos (subrange) em 
que a sua existncia  VLIDA. O tipo de definio de dados conhecido como 
subrange (subintervalo) possui como caracterstica principal, a utilizao de 
apenas trechos de algo maior e mais completo.

program Prog33.

type
    Nalunos = 1..50;

var
     ALUNO . Nalunos;

begin

      writeln('DIGITE O NMERO DO ALUNO:');
      readln(ALUNO);
      writeIn(ALUNO);

end;

No programa anterior, suponha que o nmero de alunos que possam 
pertencer  turma noturna de LPT1 seja 50, surgindo assim, a limitao do seu 
valor entre 1 e 50. Portanto, no existe a possibilidade de a varivel 
encarregada de controlar este nmero ultrapassar o limite inferior e o superior. 
Por esse motivo, declarou-se que o tipo de dados Nalunos est na faixa de 
1..50 e que, a varivel ALUNO  do tipo Nalunos. O tipo Nalunos  um 
subintervalo de um ESCALAR predefinido.

Outro Exemplo:

prograrn Prog34;

type
    Minusc = 'a'..'z';
    Meses = (JAN,FEV,MAR,ABR,MAI,JUN,JUL,AGO,SET,OUT,NOV,DEZ);
    Prisemest = JAN..JUN;
    Segsemest = JUL..DEZ;

Observaes:

- No exemplo anterior, o tipo de dados Minusc  um subintervalo do 
escalar char (Letras minsculas do Alfabeto).

- O tipo de dados Prisemest (meses do primeiro semestre) e Segsemest 
(meses do segundo semestre) so subintervalos de um tipo de dados definidos 
como Meses.

-O Turbo Pascal checa a validade dos subintervalos somente quando a 
diretiva de compilao R estiver ativada. 


CONJUNTO SET:

Os dados do tipo conjunto so reunies de diversos elementos do 
mesmo tipo (escalar), exceto os nmeros reais. Vejamos o exemplo abaixo:

prograrn Prog35 ;

type ,,
    Numeros = set of byte;

var
    PRIMO, MPAR, PAR, FINAL1, FINAL2 : Numeros;

begin

    PRIMO := [1,2,3,5,7]; , 
    MPAR :# [1,3,5,7,9];  ;  '
    PAR := [2,4,6,8]; /
    FINAL1 := PRIMO + MPAR;
    FINAL2 := PRIMO * PAR; 

end.

O programa acima possui as seguintes caractersticas:

- Define-se Numeros como do tipo de dado set of formado por nmeros 
do tipo byte.
- Definem-se as variveis de conjunto PRIMO, MPAR, PAR, FINAL1 e 
FINAL2 como do tipo Numeros.

- Atribuem-se os respectivos nmeros (maior que 0 e menor que 10).

- Executa-se a operao de unio (+) e interseco (*) entre os 
conjuntos.

- As variveis de conjunto FINAL1 e FINAL2, contero os seguintes 
elementos:

FINAL1 : 1,2,3,5,7,9
FINAL2 : 2

- A operao dos conjuntos obedece s seguintes notaes:

          Decises lgicas com conjuntos:

A = B ---> A igual a B
A <> B ---> A diferente de B
A >= B ---> A contm B
A <= B ---> A est contido em B
A in B ---> .A pertence aB

        Exemplo utilizando o operador in:

program Prog36;

var
    LETRA : char;

begin

     write('DIGITE UMA LETRA MINSCULA ENTRE a e f :');
     readln(LETRA);

     if LETRA in ['a'..'f] then
        begin
             writeIn('POSITIVO');
        end
else
         begin
              writeInI'NEGATIVO');
         end;

end. '

Observaes:

- O programa anterior imprime 'POSITIVO' se a letra digitada estiver 
conforme o que foi solicitado na mensagem. Caso contrrio, o comando if 
desvia o processamento para imprimir a mensagem 'NEGATIVO'.

- Um detalhe importante  que o set (conjunto) foi definido na prpria 
sentena do if. Poderia tambm ser declarado na forma normal, utilizando-se 
type e var.


ARQUIVOS DE DADOS EM DISCO:

Como sabemos, ao desligar-mos o computador, as informaes contidas 
na memria RAM sero perdidas, pois trata-se de uma memria voltil.

A utilizao de uma unidade de leitura e gravao em disco magntico, 
possibilita o armazenamento magntico permanente daqueles dados da 
memria RAM, que seriam perdidos ao desligar-mos o computador. Alm 
disso, os discos magnticos rgidos (WINCHESTERS) possuem espao de 
armazenamento vrias vezes maior que o da memriaRAm.

O Turbo Pascal possui trs tipos bsicos de arquivos em Disco:

- Arquivo de texto;

- Arquivo com tipo definido;

- Arquivo de dados sem tipo definido;

O objetivo do estudo nesta apostila, ser o arquivo de dados sem tipo definido 
(acesso randmico ou aleatrio).


DEFINIES:

REGISTRO:

 um conjunto de Campos de Dados.


CAMPOSDEDADOS:

Os campos de dados so diferentes dados ou informaes que 
relacionados, constituem o Registro. Os Campos de Dados podem ser de 
vrios tipos (real, string, etc...), e devem ser dimensionados de acordo com a 
necessidade anual e fatura.

ARQUIVODEDADOS:

Agrupamento organizado de informaes armazenadas em bytes, que podem 
ser acessadas quando necessrio.

 um conjunto organizado de Registros de informaes. Os registros so 
independentes um do outro, mas possuem sua estrutura intema de campos 
igual.


BUFFER

Buffer  uma regio de memria que tem a mesma extenso e diviso 
dos campos do registro associado a ele. Esta regio serve de "molde" 
intermedirio para se encaixar o registro.
Durante o processamento, ao ser lido um registro, os seus dados sero 
trazidos para o buffer, tomando-os disponveis para o processamento.
Para gravar um registro, devemos prepar-lo no buffer e depois mandar 
grav-lo no Disco. Isto faz com que os dados que estavam no buffer sejam 
transferidos para o arquivo. A leitura de um arquivo em disco bem como sua 
gravao so duas das operaes mais lentas que um computador executa. O 
tempo gasto para uma unidade de disco localizar dados, corresponde a um 
perodo de anos para um microprocessador. Pequenas partes da memria 
denominadas "Buffers" so reservadas para que os dados sejam usados em 
operaes de disco. Os "Buffers" agilizam o processamento, reduzindo a 
quantidade de leituras e de gravaes em disco.


ESTRUTURA DE UM PROGRAMA EM TURBO PASCAL

CABEALHO DO PROGRAMA:

Nome do Programa

Diretivas do Compilador

SEO DE DADOS:

Declaraes de Constante

Declaraes de Tipo

Declaraes de Varivel

Declaraes de Label

SEO DE ROTINAS:

Procedures

Funes

SECO DA LGICA PRINCIPAL.-

Bloco de Programa


DECLARAO DE UM ARQUIVO  DE DADOS DE 
ACESSO RANDNICO

Um registro utilizado no arquivo randmico deve ter a sua extenso 
fsica fixa, ou seja, cada campo deve possuir um nmero fixo de bytes. Devido 
a esta razo, precisamos definir a mxima extenso dos campos que iro 
compor este registro.


Exemplo:

Considere um arquivo de um cadastro de ARMAS DE FOGO de uma 
loja especializada em Caa e Pesca. Este cadastro possui campos que indicam 
os seguintes

- Tipo de arma (RevolveR, Pistola, Carabina, Espingarda...);
- Fabricante ou marca (Taurus, Rossi, CBC, IMBEL, etc);
- N de srie da arma (ex : FJ70514);
- Calibre (.38, .32, .22, .380, 7.65, 12, 6.35, etc...);
- Acabamento (Inox, Acetinada, Oxidada, etc ...);
- Capacidade (6 cartuchos, 5, 13, etc...);
- N de canos (1 ou 2).

Vamos agora definir a mxima extenso dos campos que iro compor os 
registros do arquivo de armas:

Tipo             10 bytes;
Marca            6 bytes;
Srie              7 bytes;
Calibre           4 bytes;
Acaba            9 bYtes;
Capacid         2 bYtes;
Ncanos          1 byte.

A declarao da estrutura deste arquivo ficaria assim:

type 
    ARMA = record
            TIPO            : string[10];
            MARCA        : string[6];
            SERIE          : string[7];
            CALIBRE      : real;
            ACABA         : string[9];
            CAPACID      : integer;
            NCANOS      : byte;
    end;

var
     Bufferarma : ARMA;

Observaes:

- Os campos TIPO, MARCA, SERIE, CALIBRE, ACABA, CAPACID, e 
NCANOS, formam um registro do tipo ARMA.
- Foi necessrio criar e identificar um buffer para leitura e gravao. Este 
buffer chama-se Bufferarma e sua formatao (molde)  igual a do registro 
ARMA.

Para trabalharmos inicialmente, com os campos de um registro sem, no 
entanto, gravar ou ler dados, devemos saber que uma Varivel de Campo no 
pode ser diretamente referenciada. Para fazer-mos a referncia precisamos 
colocar o nome do buffer seguido de um ponto (.) e o nome do campo.

Exemplo:

program Prog37;

type
    ARMA = record
            TIPO                  :  string[10];
            MARCA             : string[6];
            SERIE               : string[7];
            CALIBRE           : real;
            ACABA              : string[9];
            CAPACID           : integer;
            NCANOS            : byte;
    end;


var
    Bufferarma : ARMA;

begin

     write('DIGITE O TIPO DA ARMA:');
     readln(Bufferarrna, TIPO);
     wriiteln(Bufferarma, TIPO);
end.

Observaes:

- O campo Bufferarma.TIPO foi utilizado para armazenar, mesmo no 
existindo operaes em disco, o dado digitado via teclado, e captado pelo 
readln.

- O Turbo Pascal admite mais de um campo com o mesmo nome desde 
que sejam de Buffers diferentes. Para que no haja problemas de 
diferenciao, toma-se necessrio a colocao do buffer correspondente antes 
do nome do campo.

COMANDOS DE MANIPULAO DE ARQUIVOS:

          assign() - Associa um Identificador de arquivo ( nome do arquivo a ser 
utilizado no programa ) com o nome do arquivo a ser utilizado no disco. A partir 
dessa atribuio o arquivo em disco deixar de ser referido pelo original do 
disco. Todas as operaes de tratamento de arquivo faro referncia ao 
identificador.

Ex: assign(ARQPROG, 'ARQDISCO.DAT');

          rewrite() - Este comando se comporta de duas formas:
Quando um arquivo que j existe for aberto com rewrite, seu contedo 
ser apagado e o "pointer" ser posicionado no incio do arquivo. Quando o 
arquivo no existir, o comando rewrite criar um novo arquivo com o nome 
especificado na instruo assign, deixando-o aberto. 

Ex: rewrite(ARQPROG);


         reset() - Abre um arquivo j existente e posiciona o "pointer" no incio do 
arquivo. Se o arquivo no existir, ocorrer um erro de I/O. O erro poder ser 
solucionado se for desativada  diretiva I do compilador, com a instruo ( SI-) 
e, em seguida, testar o erro com a funo ioresult para definir a estratgia na 
programao.

Ex: reset(ARQPROG);

          close() - Esvazia o buffer e fecha o arquivo. Faz com que todos os dados 
contidos no buffier temporrio sejam gravados no disco (descarrega o buffer). 
Alm disso, tambm fecha o arquivo.

Ex: close(ARQPROG);


          flush()- Esvazia um buffer de sada antes dele ser preenchido ( grava os 
dados em disco ).

Ex: flush(ARQPROG);

          seek() - Procura determinado registro num arquivo atravs do nmero do 
registro.

Ex: seek(ARQPROG,NumReg);

          read - L o registro apontado pelo SEEK, trazendo-o para o buffer, e 
posiciona o "pointer" no prximo registro.

Ex: read(ARQPROG,iIUFFER);

          write() - Grava o buffer no disco, no endereo apontado pelo seek e, em 
seguida, posiciona o "pointer" no prximo registro.

Ex: write(ARQPROG,BUFFER);

          ioresult - Informa um cdigo de erro quando so realizadas operaes de 
Entrada/Sada. Se ioresult no for igual a zero, significa que houve algum erro 
(geralmente  usado para testar a existncia ou inexistncia de um arquivo na 
hora de sua abertura).

          filesize() - Informa a quantidade de registros do arquivo.

Ex: seek(ARQPROG,filesize(ARQPROG)); --> Esta instruo posiciona o 
"pointer" no final do arquivo ARQPROG para executar incluso de novos 
registros. Como o primeiro registro de um arquivo em Pascal possui nmero 
zero, a instruo acima posiciona o "pointer" no prximo registro livre para 
incluso (aps o ltimo ocupado).

          filepos()- Informa a posio atual do "pointer" no arquivo. Indica qual  o 
nmero do registro corrente.

Ex: filepos(ARQPROG)

          Diretiva I de  Ativao do Compilador:

As diretivas de ativao ativam ou desativam recursos especiais do 
Turbo Pascal, como por exemplo, a diretiva I, que verifica de erros de 
Entrada/Sada.
Existem outras diretivas de ativao alm da I, que so conhecidas por 
este nome por que s possuem duas condies (ativada ou desativada).
O formato de escrita para ativar (+) ou desativar (-) uma diretiva,  um S 
seguido da letra da diretiva entre delimitadores de comentrios.

Ex: {$I+} e {$I-} ou {*$I+*} e {*$I-*}.

Um arquivo deve ser declarado da seguinte forma:

var
     [Var. Arquivo] : file of [Var, de Registro];

ObS: No turbo Pascal pode-se abrir no mximo 15 arquivos ao mesmo tempo.

Vejamos um exemplo prtico:

program Prog36;

type
    ARMA =record 
            TIPO                :  string[10];
            MARCA           :  string[6];
            SERIE             :  string[7];
            CALIBRE         :  real;
            ACABA            :  string[9];
            CAPACID        :  integer;
            NCANOS         :  byte;
    end;

var
     Bufferarrna : ARMA;
     ARQARMA : file of ARMA;

begin

     assign(ARQARMA,'CADASTRO.DAT');
     rewrite(ARQARMA);
     seek(ARQARMA,0);
     Bufferarrna.TIPO := 'REVOLVER';
     Bufferarrna.MARCA := 'TAURUS';
     Bufferarrna.SERIE := 'FJ53941';
     Buffcrarrna.CALIBRE := .38;
     Bufferarrna.ACABA := 'INOX';
     Bufferarrna.CAPACID := 6;
     Bufferarrna.NCANOS := 1;

     write(ARQARMA,Bufferarrna);
     close(ARQARMA);

end.

Aps a definio de Campos (Tipo, Marca, ...), Registro (... record), 
Buffer (Bufferarrna....) e Arquivo (---file of...), utiliza-se o comando assign para 
associar o nome do arquivo usado intemamente no programa (ARQARMA) ao 
nome do arquivo verdadeiro em disco (CADASTRO.DAT).

Observaes:

- O comando rewrite(ARQARMA) criou e manteve aberto o arquivo 
ARQARMA.

- O commando seek colocou o registro 0 sob a mira do "pointer" de 
indicao de registro. 

- Em seguida, houve as atribuies diretas aos campos do buffer 
(Bufferarrna), que trabalham como variveis. Os valores tambm poderiam ter 
sido atribudos via teclado, capturados pelos comandos read ou readln.

- O comando write gravou o registro 0 do arquivo ARQARMA com o 
contedo de Bufferarma.


Observao Importante:

O Turbo Pascal permite a gravao a partir do registro 0. Um registro 
NO pode ser acessado no caso da inexistncia do anterior, ou seja, o registro 
3 somente pode ser acessado se existir o registro 2. A nica excesso  para o 
registro 0.

REFERNCIA AOS CAMPOS - COMANDO WITH.

As referncias feitas aos campos de um registro tornam-se extensas, 
pois so compostas de [nome do buffer].[nome do campo]. Utilizando o 
comando with, podemos abreviar e escrevei" somente os nomes dos campos. 
O trecho do programa em que esta abreviao  permitida, ileve estar assim 
limitado:


with [nome do buffer] do

begin .
.
.
.
.
end;

Aproveitamos o exemplo seguinte para utilizar o comando with e 
tambm, para o processo de leitura atravs do apontamento do registro 
desejado com o comando seek e leitura com comando read.

Program Prog38;
type
     ARMA = record
               TIPO              :  string[10];
               MARCA         :  string[6];
               SERIE           :  string[7];
               CALIBRE      :  real;
               ACABA         :  string[9];
               CAPACID      :  integer;
               NCANOS       :  byte;
      end;

var
     Bufferarma : ARMA;
     ARQARMA : file of ARMA;

begin

     assign(ARQARMA,'CADASTRO.ARQ');
     reset(ARQARMA);
     seek(ARQARMA,0);
     read(ARQARMA,BUFFERARMA);

     with BUFFERARMA do
     begin
          writeIn(TIPO);
          writeIn(MARCA);
          writeIn(SERIE);
          writeIn(CALIBRE);
          writeIn(ACABA);
          writeIn(CAPACID);
          writeln(NCANOS);
     end;

     close(ARQARMA);

end.

Observaes:

- J que este programa l os dados gravados pelo programa anterior 
(Prog37), utilizou-se o comando reset para abrir o arquivo, por que o arquivo j 
existia anteriormente.

- Apontou-se para o registro 0 (gravado anteriormente no Prog37) 
atravs do comando seek. '

- Foi lido para o buffer o registro 0 atravs do comrnando read.

- Devido a utilizao do with Bufferarma do, foi possvel a impresso 
com a abreviatura das Variveis de Campo (usou-se apenas TIPO, em vez de 
Bufferarma.TIPO).

45
* * * FACE - FUMEC ** * LGICA DE PROGRAMAO * * *

