Anda di halaman 1dari 73

Programao Imperativa

Unidade 11

UFS - DComp - Prof. Kenia Kodel

Alm dos tipos estruturados tipos definidos


pelo usurio (programador); tambm
existem os tipos primitivos ou pr-definidos.

Exemplos de tipos
primitivos...

J trabalhamos com tipos


definidos pelo usurio?
2

UFS - DComp - Prof. Kenia


Kodel

Definidos pelo
Programador

Strings &
Arrays

Escalares

Conjuntos
Estruturados

Registros &
Arquivos

Integer

Tipos

Ponteiros

Real

Primitivos

String
Boolean
Array

UFS - DComp - Prof. Kenia


Kodel

type
TpVetor: array[1..15]of byte;
var
Vetor: TpVetor;

Nos exemplos de matrizes


type
Dia = (dom,seg,ter,qua,qui,sex,sab);
Str20 = string[20];
var
Horario: array[7..22,dom..sab]of Str20;

UFS - DComp - Prof. Kenia Kodel

Nos exemplos de modularizao

Feita a declarao, estes tipos podem ser

aplicados em qualquer ponto do programa,


da mesma maneira que os tipos pr-definidos.

Em que seo de
programas Pascal
deve-se declarar
tipos?
5

UFS - DComp - Prof. Kenia


Kodel

type

<identificador>=<tipo>; |
<identificador>=(valor1,valor2,...);
Onde:

<identificador> o nome do tipo


<tipo> um tipo pr-definido, ou previamente
declarado
valorN valor que a varivel de respectivo tipo
pode assumir
6

UFS - DComp - Prof. Kenia


Kodel

type
<identificador>=<tipo>; |
<identificador>=(valor1,valor2,valor3,...);

Exemplos:
type

Str20=string[20];
TpLogico=(verdadeiro,falso);
TpSemana=(DOM,SEG,TER,QUA,QUI,SEX,SAB);

UFS - DComp - Prof. Kenia


Kodel

Exemplos:

type
Str20=string[20];
TpLogico=(verdadeiro,falso);
TpSemana=(DOM,SEG,TER,QUA,QUI,SEX,SAB);

Definidos os tipos, onde


aplic-los?

UFS - DComp - Prof. Kenia


Kodel

Importante observar que, assim como os tipos


primitivos, os tipos definidos pelo programador so
aplicados na declarao de variveis (seo var).
type
Str20=string[20];
TpLogico=(verdadeiro,falso);
TpSemana=(DOM,SEG,TER,QUA,QUI,SEX,SAB);
var
Nome: Str20;
Resposta: TpLogica;
Dia: TpSemana;

UFS - DComp - Prof. Kenia


Kodel

Os tipos definidos a partir dos tipos primitivos


(strings, arrays, registros, conjuntos, ponteiros e
outros) so denominados estruturados.

type
<identificador>=<tipo>;
Exemplo:
type
Str20= string[20];
TpNum = byte;
TpArray = array [1..100] of integer;

var
Nome: Str20;
Idade: TpNum;
Vetor: TpArray;
10

UFS - DComp - Prof. Kenia


Kodel

Outro Exemplo:
type
Str15 = string[15];
TpDias =(DOM,SEG,TER,QUA,QUI,SEX,SAB);
TpSemana =array[DOM..SAB]of Str15;

var
Semana: TpSemana; {Prioridades.}

Qual o esboo da
varivel semana?
11

UFS - DComp - Prof. Kenia


Kodel

Esboo da varivel Semana:


type
Str15 = string[15];
TpDias =(DOM,SEG,TER,QUA,QUI,SEX,SAB);
TpSemana = array[DOM..SAB] of Str15;

var
Semana: TpSemana;
DOM

SEG

TER

QUA

QUI

SEX

SAB

Semana
12

UFS - DComp - Prof. Kenia


Kodel

Esboo da varivel Semana:


type
Str15 = string[15];
TpDias =(DOM,SEG,TER,QUA,QUI,SEX,SAB);
TpSemana = array[DOM..SAB] of Str15;

var
Semana: TpSemana;

for D:=DOM to SAB do


Semana[D]:=definir;

DOM

SEG

TER

QUA

definir

definir

definir

definir

QUI

definir

SEX

SAB

definir

definir

Semana
13

UFS - DComp - Prof. Kenia


Kodel

Para definir o tipo conjunto, que pode ser manipulado


como conjunto matemtico, usado:
type
<identificador> = set of <tipo>;

Exemplos:

type
TpCaracteres = set of char;
TpAlgarismos = set of 0..9;
TpVogais = set of (A,E,I,O,U,a,e,i,o,u);

var
Letras: TpCaracteres;
Pares: TpAlgarismos;
Vogais: TpVogais;

14

UFS - DComp - Prof. Kenia


Kodel

Para manipulao dos dados mantidos em


conjuntos so disponibilizadas as operaes:
1. Unio +
2. Diferena
3. Interseo *
Exemplo - Unio:
type
Qual o contedo da
TpConj = set of byte;
varivel Nmeros?
var
Numeros
Numeros,
Pares: TpConj;
0, 1, 2, 3, 4, 5, 6, 7, 8
...
Pares:=[0,2,4,6,8];
Numeros:=Pares + [1,3,5,7];
15

UFS - DComp - Prof. Kenia


Kodel

Para manipulao dos dados mantidos em


conjuntos so disponibilizadas as operaes:
1. Unio +
2. Diferena
3. Interseo *
Exemplo - Diferena:
type
Qual o contedo da
TpConj = set of byte;
varivel Nmeros?
var
Numeros
Numeros,
Pares: TpConj;
2, 3
...
Numeros:=[1,2,3,4,5] - [1,4,5,9];

16

UFS - DComp - Prof. Kenia


Kodel

Para manipulao dos dados mantidos em


conjuntos so disponibilizadas as operaes:
1. Unio +
2. Diferena
3. Interseo *
Exemplo - Interseo:
Qual o contedo da
type
varivel Nmeros?
TpConj = set of byte;
var
Numeros
Numeros,
Pares: TpConj;
1, 4, 5
...
Numeros:=[1,2,3,4,5] * [1,4,5,9];

17

UFS - DComp - Prof. Kenia


Kodel

Para construir expresses relacionais


envolvendo dois conjuntos tem-se:
1. Igual =, verdadeiro se todos os elementos

so idnticos.
2. Diferente <>, verdadeiro se pelo menos um
elemento pertencer a um conjunto e no
pertencer a outro.
3. Est Contido <=, se Conj1<=Conj2,
verdadeiro se Conj1 est contido em Conj2.

4. Contm >=, se Conj1 >= Conj2,


verdadeiro se Conj1 contm Conj2.
18

UFS - DComp - Prof. Kenia


Kodel

Para construir expresses relacionais envolvendo

conjunto e elemento tem-se:


Pertence in, se E in Conj, verdadeiro se o
elemento E pertence a Conj.
No Pertence not in, se E not in Conj,
verdadeiro se o elemento E no pertence a

Conj.

J havamos usado
conjunto?
19

UFS - DComp - Prof. Kenia


Kodel

Para declarao de registro fazemos uso das

sees type e var do Pascal.


type
<IdentificaTipo> = record
<IdentificaCampo1>: <Tipo1>;
<IdentificaCampo2>: <Tipo2>;
...
end;
var
<IdentificaVariavel>: <IdentificaTipo>;

20

UFS - DComp - Prof. Kenia


Kodel

Onde:
type

nome do tipo registro


palavra reservada

<IdentificaTipo> = record
campos que compoem registros

<IdentificaCampo1>: <Tipo1>;
<IdentificaCampo2>: <Tipo2>;
...
tipos dos
campos
end;
Varivel do tipo registro
var
<IdentificaVariavel>: <IdentificaTipo>;
21

UFS - DComp - Prof. Kenia


Kodel

Exemplo:

TpRegCliente = record
Nome:
string[20];
Telefone:
string[10];
Financiamento:
real;
Tipo:
char;
Fidelidade:
byte;
end;

var
RegCliente: TpRegCliente;

Nome

Telefone

7932574455

Financiamento

Tipo

17.000,00

UFS - DComp - Prof. Kenia Kodel

type

Fidelidade

8
RegCliente
22

Onde:

nome do tipo registro

type

palavra reservada

TpRegPesquisador = record
campos que compoem registros

Nome:
string[20];
Telefone:
string[10];
Financiamento:
real;
Tipo:
char;
Fidelidade:
byte;
end;
var
RegCliente: TpRegCliente;

tipos dos campos

varivel do tipo registro

23

UFS - DComp - Prof. Kenia


Kodel

type

TpRegExtrato = record
Dia: byte;
Operacao: string[10];
Valor: real;
Tipo: char;
end;

Dia

13

Operacao

Valor

Tipo

var
RegExtrato: TpRegExtrato;

Transferncia

700,00
C

UFS - DComp - Prof. Kenia Kodel

Se necessrio compor um registro, por


exemplo, para manter a
movimentao bancria de uma
dado ms-ano?

RegExtrato

24

type
TpRegCliente = record
Nome:
string[20];
Telefone:
string[10]
Financiamento:
real;
Tipo:
char;
Fidelidade:
byte;
end;
var
RegCliente: TpRegCliente;

UFS - DComp - Prof. Kenia Kodel

Considerando o exemplo temos:

Qual a varivel deste exemplo?


Qual o tipo da referida varivel?
Quais os campos de composio do tipo e da varivel?
25

type
TpRegCliente = record
Nome:
string[20];
Telefone:
string[10]
Financiamento:
real;
Tipo:
char;
Fidelidade:
byte;
end;
var
RegCliente: TpRegCliente;

UFS - DComp - Prof. Kenia Kodel

Considerando o exemplo temos:

Neste temos uma varivel RegCliente, do tipo


TpRegCliente, composta pelos campos:
Nome, Telefone, Financiamento, Tipo e
Fidelidade.
26

a atribuio
de
registros de um mesmo tipo,
os registros so manipulados
TpRegExtrato = record
campo a campo. Para tanto
Dia: byte;
deve ser usado o nome do
Operacao: string[10];
registro seguido de ponto e
Valor: real;
do nome do campo a
Tipo: char;
manipular.
end;
J a manipulao dos
campos dos registros so
var
efetuadas em conformidade
Reg1, Reg2: TpRegExtrato;
com os tipos destes.
Reg1:=Reg2;

writeln(Reg1);

Reg1.Valor:=2000/3;

readln(Reg2.Dia);

readln(Reg2);

UFS - DComp - Prof. Kenia Kodel

Exceto

type

Reg1.Tipo=Reg2.Tipo;

27

TpRegExtrato = record
Dia: byte;
Operacao: string[10];
Valor: real;
Tipo: char;
end;

var
Reg1, Reg2: TpRegExtrato;

UFS - DComp - Prof. Kenia Kodel

type

Os 4 dados: dia, operao, valor e tipo


poderiam ser mantidos num vetor com 4 posies?
28

TpRegExtrato = record
Dia: byte;
Operacao: string[10];
Valor: real;
Tipo: char;
end;

var
Reg1, Reg2: TpRegExtrato;

UFS - DComp - Prof. Kenia Kodel

type

Os 4 dados: dia, operao, valor e tipo no podem ser


mantidos num vetor porque no so homogneos.
Dados heterogneos devem ser mantidos em registros.
29

Um registro consiste num


type
TpRegExtrato = record
Dia: byte;
Operacao: string[10];
Valor: real;
Tipo: char;
end;

var
Reg1, Reg2: TpRegExtrato;

item de composio de
programas de computador
til ao armazenamento dos
dados.

Diferentes dos arrays, so

heterogneos, ou
seja,
podem armazenar dados
de diversos tipos.

Na

situao
problema
apresentada, por exemplo,
tem-se
um
registro
composto por 2 dados
numricos
e
2
alfanumricos.
30

UFS - DComp - Prof. Kenia


Kodel

Para
facilitar
a
manipulao
de
registros,
possibilitando que no seja necessrio repetir
exaustivamente o nome do registro, o Pascal
disponibiliza o comando with.
Assim, o trecho de cdigo:
writeln(Reg1.Dia,Reg1.Operacao,Reg1.Valor,Reg1.Tipo);

Com with, pode ser reescrito:


with Reg1 do
writeln(Reg1.Dia,Reg1.Operacao,Reg1.Valor,Reg1.Tipo);

with Reg1 do
writeln(Dia,Operacao,Valor,Tipo);
31

UFS - DComp - Prof. Kenia


Kodel

Outro Exemplo:

type
TpRegCliente = record
Nome:
string[20];
Telefone:
string[10]
Financiamento:
real;
Tipo:
char;
Fidelidade:
byte;
end;
var
RegAux: TpRegCliente;

with RegAux do
begin
writeln(Nome);
writeln(Telefone);
Financiamento:=200000;
end;
32

UFS - DComp - Prof. Kenia


Kodel

Exemplo:
with RegAux do
begin
writeln(Nome);
writeln(Telefone);
Fianciamento:=200.000;
end;
Sintaxe

with <IdentificaVariavelTipoRegistro> do
<comandos>;
33

UFS - DComp - Prof. Kenia


Kodel

Sintaxe
with <IdentificaVariavelDoTipoRegistro> do
<comandos>;

Onde:

<IdentificaVarivelDoTipoRe

gistro> o nome do registro (da varivel


de tipo registro.

<Comando>

instrues envolvendo os
campos do registro supracitado sem a
necessidade de serem precedidas pelo nome
deste.
34

UFS - DComp - Prof. Kenia


Kodel

Os registros podem compor arrays. Exemplo:

type
TpReg = record
Nome:
string[20];
Telefone:
string[10]
Financiamento:
real;
Tipo:
char;
Fidelidade:
byte;
end;
var
Melhores: array[1..20] of TpRegCliente;
Reg: TpReg;

Neste caso, por exemplo, para exibir o campo Nome do registro


mantido na posio 3 do vetor deve-se usar:
writeln( Melhores[3].Nome);

Para ler os nomes e telefones dos clientes especiais (melhores):


for I:=1 t 20 do begin
readln(Melhores[I].Nome);
readln(Melhores[I].Telefone); end;

UFS - DComp - Prof. Kenia Kodel

35

Os arquivos tambm so colees de

registros; mas residem em memria


secundria, ou seja, memria no voltil.
Portanto so diferentes dos itens de
armazenamento de dados estudados at
ento: registros, vetores, matrizes; os quais
no preservam os dados neles
depositados, aps o trmino da execuo
dos programas que os definem.

UFS - DComp - Prof. Kenia Kodel

36

Sob o ponto de vista lgico, os arquivos


so colees de registros e so
declarados:
var
<Nome>: file of <TipoRegistro>;
Onde:
o Nome nome do arquivo (interno);
o TipoRegistro tipo dos registros que
comporo o arquivo.

UFS - DComp - Prof. Kenia Kodel

37

Considerando, por exemplo, a necessidade de


cadastrar os pacientes a serem atendidos por um
determinado mdico.

Onde as consultas so

marcadas com antecedncia de meses.


Para cadastro dos dados dos
pacientes, um array de
registros poderia ser usado?
UFS - DComp - Prof. Kenia Kodel

38

type
TpRegMed = record
Nome: string[20];
Convenio,
Fone: string[10];
Pago: real;
Retorno: boolean;
end;
var
ArqPacientes: file of TpRegMed;

Considerando a definio dada temos que


ArqPacientes um arquivo composto por registros
formados por cinco campos: nome, convnio,
fone, (valor) pago e retorno.
UFS - DComp - Prof. Kenia Kodel

39

type
TpRegMed = record
Nome: string[20];
Convenio,
Fone: string[10];
Pago: real;
Retorno: boolean;
end;
var
ArqPacientes: file of TpRegMed;
0

...
N

Nome

Convnio

Fone

Pago

Retorno

Maria

BoaSaude

322

18,50

true

ArqPacientes

UFS - DComp - Prof. Kenia Kodel

40

Para gerenciamento dos dados mantidos em


arquivos, so necessrios comandos especficos; de
manipulao de arquivos.
Um destes refere-se associao a nome externo.
O assign o procedimento que possibilita a
associao do nome externo do arquivo ao seu
nome lgico (interno).
Os arquivos so elementos que existem
independente da existncia do programa que o
manipula. Portanto, apresentam nome externo,
atravs do qual, por exemplo, outros programas os
identificam.

UFS - DComp - Prof. Kenia Kodel

41

Atravs do nome externo o arquivo mantm-se


disponvel para outros programas.

assign(var <arqinterno>; <arqexterno>: string);


Onde:
<arqinterno> o nome lgico do arquivo, nome
interno
<arqexterno> o nome externo do arquivo

UFS - DComp - Prof. Kenia Kodel

42

Exemplo:
assign(ArqPacientes,Consultas.dat);

Com a execuo do programa que manipula


ArqPacientes, considerando os efeitos da instruo
dada acima, o arquivo Consultas.dat criado e/ou
alterado.
Mesmo aps a concluso do referido programa, o
arquivo Consultas.dat existir, preservando os dados
neste mantidos.

UFS - DComp - Prof. Kenia Kodel

43

Exemplo:
assign(ArqPacientes,C18nov08.dat);
...
assign(ArqPacientes,C20nov08.dat);

Um nico arquivo lgico pode ser associado a


diversos arquivos externos (um por vez),
dependendo da situao problema a ser
solucionada.
Antes da definio do nome externo do arquivo
pode ser descrito o caminho de localizao
deste: C:\Hospital DaSaude\Dr
CuraTudo\Consultas.dat

UFS - DComp - Prof. Kenia Kodel

44

Para manipulao de dados mantidos em


arquivos preciso abir estes (arquivos).
Em Pascal h dois comandos para abrir arquivos:

reset(var <Arquivo>);
rewrite(var <Arquivo>);

O reset um procedimento til para abrir


arquivos j existentes. Preserva os dados
mantidos neste.
Com o reset, caso o arquivo no exista, ocorre
um erro de execuo.

UFS - DComp - Prof. Kenia Kodel

45

Como j dito, tem-se:

reset(var <Arquivo>);
rewrite(var <Arquivo>);

As caractersticas do reset j foram vistas.


O rewrite um procedimento til para criar e
abrir novos arquivos.
Caso o arquivo j exista, o rewrite provoca a
perda dos dados mantidos neste.

UFS - DComp - Prof. Kenia Kodel

46

reset(ArqPacientes);
rewrite(ArqPacientes);

Na prtica, se usamos apenas o reset para abrir


os arquivos manipulados por um programa; na
primeira vez que o usurio executar a aplicao,
como o cadastro no existe, o reset provocaria
erro de execuo.

UFS - DComp - Prof. Kenia Kodel

47

reset(ArqPacientes);
rewrite(ArqPacientes);

E se usamos, na prtica, apenas o rewrite, para


abrir os arquivos manipulados por um programa;
a primeira vez que o usurio executar a
aplicao, como o cadastro no existe, o
rewrite provoca a criao do arquivo; mas em
todas as outras vezes, que o arquivo (cadastro)
deve apenas ser aberto, o rewrite, provoca a
perda dos dados.

UFS - DComp - Prof. Kenia Kodel

48

reset(ArqPacientes);
rewrite(ArqPacientes);

Precisamos ento: sendo a primeira vez que o


usurio est executando o programa (o cadastro
ainda no existe), o rewrite deve ser usado para
criar o arquivo. E, em todas as outras vezes (o
cadastro j existe e deve ser preservado) usar o
reset.

UFS - DComp - Prof. Kenia Kodel

49

procedure AbrirArquivo(Arquivo: TipoArquivo;


NomeArq: string);
begin
assign(Arquivo,NomeArq);
{$I-} reset(Arquivo); {I+}
if IOResult <> 0 then
rewrite(Arquivo);
end;

Neste tenta-se abrir o arquivo com reset, presumindo que


o Arquivo j exista.
Caso o arquivo no exista, com {$I-} efetuado o
desligamento da diretiva de compilao fazendo com que
o erro no seja tratado atravs de mensagem ao usurio,
mas que seja atribudo um cdigo de erro varivel
predefinida IOResult.
UFS - DComp - Prof. Kenia Kodel

50

procedure AbrirArquivo(Arquivo: TipoArquivo;


NomeArq: string);
begin
assign(Arquivo,NomeArq);
{$I-} reset(Arquivo); {I+}
if IOResult <> 0 then
rewrite(Arquivo);
end;
Se a IOResult for diferente de zero porque houve erro
na tentativa de abrir o arquivo. Se houve erro porque o
arquivo no existia, ento este deve ser criado usando o
rewrite.
Se a IOResult for igual a zero porque no houve erro na
tentativa de abrir o arquivo. Ou seja, o arquivo j existia e
foi devidamente aberto com reset. Neste caso o
rewrite no precisa ser usado.
UFS - DComp - Prof. Kenia Kodel

51

procedure AbrirArquivo(Arquivo: TipoArquivo;


NomeArq: string);
begin
assign(Arquivo,NomeArq);
{$I-} reset(Arquivo); {I+}
if IOResult <> 0 then
rewrite(Arquivo);
end;
Importante destacar que a abertura de um arquivo requer a
associao prvia deste a um nome externo.
Em aplicaes que manipulam arquivo, a abertura deste
deve ser efetuada no incio da aplicao, e uma nica vez,
no deve ser feita ento, por exemplo, em laos (de
operaes).
UFS - DComp - Prof. Kenia Kodel

52

close(var <Arquivo>);

Atravs do comando close possvel fechar um arquivo.


Vale esclarecer que a ausncia do close no
identificada nem no processo de compilao, nem no de

execuo . Porm pode provocar danos nos dados


mantidos no arquivo.

O processo de fechar um arquivo deve ser efetuada ao

final da manipulao deste e uma nica vez. Assim,


tambm, no deve ser mantido em laos de operaes.
UFS - DComp - Prof. Kenia Kodel

53

Para armazenamento, usar:


write(var <Arquivo>,<Registro>);
Para leitura, usar:
read(var <Arquivo>,var <Registro>);

Exemplo, a instruo write(Arq,R); provoca o


armazenamento do registro R no arquivo Arq. Mas, resta
esclarecer em que posio.

O read e o write so aplicados ao registro da posio


corrente do arquivo.

Para gerenciamento de um arquivo mantido um ponteiro


numrico que indica a posio (corrente) do registro a ser
manipulado.
UFS - DComp - Prof. Kenia Kodel

54

Para armazenamento, usar:


write(var <Arquivo>,<Registro>);
Para leitura, usar:
read(var <Arquivo>,var <Registro>);

Inicialmente, logo aps a abertura de um arquivo, o


ponteiro lgico setado na posio zero deste.

Havendo leituras (read) ou gravaes (write), esta

operao efetuada sobre o registros que encontra-se na


posio corrente e o apontador atualizado em uma
posio.
UFS - DComp - Prof. Kenia Kodel

55

Em geral, no processo de incluso de novos registros, estes


devem ser adicionados ao final do arquivo, aps o ltimo
registro. Para tanto, til a funo eof.
eof(<Arquivo>):boolean;

eof uma funo que retorna true quando encontrado


o fim do arquivo.

Caso seja necessrio manipular um registro que encontrase numa dada posio do arquivo, til procedimento
seek.
seek(var <Arquivo>; <posio>: longint);
Considerando seek(Arq,50); o ponteiro posicionado na
posio 50 do arquivo Arq; ento a prxima operao de
leitura ou armazenamento ser efetuada sobre o registro
que se encontra nesta posio.

UFS - DComp - Prof. Kenia Kodel

56

Para identificar em que posio se encontra o ponteiro de


um arquivo h a funo filepos.

filepos(<Arquivo>):longint;

E para identificar quantos registros compem o arquivo


til a funo filesize.

filesize(<Arquivo>): longint;

Vale esclarecer que o nmero de registros que compem

um arquivo tambm denominado tamanho do arquivo.

UFS - DComp - Prof. Kenia Kodel

57

Arquivos devem ser aplicados em aplicaes


computacionais que manipulam dados que devem ser
mantidos permanentemente:

agenda telefnica

estoque

cadastros

Vale considerar que a memria permanente tem tambm


grande capacidade de armazenamento de dados, mas

lenta em relao memria principal.

UFS - DComp - Prof. Kenia Kodel

58

Implementar
programa de
cadastro dos
medicamentos
de uma farmcia.
UFS - DComp - Prof. Kenia Kodel

59

type
Str20 = string[20];
TpReg = record
Nome: Str20;
Preco: real;
Estoque: integer;
end;
var
ArqFarma: file of TpReg;
RegFarma: TpReg;

{Quantidade em estoque}

Opcao: char;
CadastroVazio,
Existe: boolean;
Pos: longint;

UFS - DComp - Prof. Kenia Kodel

60

begin
CadastroVazio:=false;
assign(ArqFarma,'Farmas.dat');
{$I-} reset(ArqFarma); {$I+}
if IOResult <> 0 then rewrite(ArqFarma);
repeat
clrscr; writeln('*** farma ***'); writeln;
writeln(' 1 - incluir');
writeln(' 2 - excluir');
writeln(' 3 - editar estoque');
writeln(' 4 - consultar');
writeln(' 5 - listar todos');
writeln(' 6 - encerrar');
writeln; writeln('Opcao:');
repeat Opcao:=readkey;
until Opcao in ['1','2','3','4','5','6'];
if Opcao in ['2','3','4','5'] then
VerifiqueVazio(CadastroVazio);
if not CadastroVazio then
case Opcao of
'1': incluir;
'2': excluir;
'3': alterar;
'4': consultar;
'5': listarTodos; end;
until Opcao = '6';
close(ArqFarma); end.
UFS - DComp - Prof. Kenia Kodel

61

procedure VerifiqueVazio(var inicio: boolean);


begin
inicio:=false;
if filesize(ArqFarma)=0 then begin
inicio:=true;
clrscr;
writeln('impossivel realizar operao, cadastro vazio');

writeln('pressione qualquer tecla');


readln;
end;
end;

UFS - DComp - Prof. Kenia Kodel

62

procedure incluir;
var
R: char;
begin
repeat
clrscr;
writeln('*** inclusao ***');
writeln;
with RegFarma do begin
writeln('Nome: ');
readln(Nome);
writeln('Preco: ');
readln(Preco);
writeln('Estoque: ');
readln(Estoque);
end;
seek(ArqFarma,filesize(ArqFarma));
write(ArqFarma,RegFarma);
writeln;
writeln('Deseja efetuar nova inclusao? S/N ');
repeat
R:=upcase(readkey);
until (R='S') or (R='N');
until R='N';
end;
UFS - DComp - Prof. Kenia Kodel

63

procedure listarTodos;
begin
clrscr; writeln('*** lista todos ***');
writeln;
writeln('Nome':20,'Preco':12,'Estoque':10);
seek(ArqFarma,0);
while not eof(ArqFarma) do begin
read(ArqFarma,RegFarma);
if RegFarma.Nome <> 'XXX' then
with RegFarma do
writeln(Nome:20,Preco:10:2,Estoque:10);
end;
writeln;
writeln('pressione qualquer tecla');
readkey;
end;
UFS - DComp - Prof. Kenia Kodel

64

procedure consultar;
var
Remedio: Str20;
R: char;
begin
repeat
clrscr; writeln('*** consulta ***');
writeln;
writeln('Nome: ');
readln(Remedio);
localizar(Remedio,Existe,Pos);
if Existe then
with RegFarma do begin
writeln('Nome: ',Nome);
writeln('Preco: ',Preco);
writeln('Estoque: ',Estoque); end
else
writeln('*** medicamento inexistente ***');
writeln;
writeln('Deseja efetuar nova consulta? S/N ');
repeat
R:=upcase(readkey);
until (R='S') or (R='N');
until R = 'N';
end;
UFS - DComp - Prof. Kenia Kodel

65

procedure localizar(N: Str20;


var Achou: boolean;
var Posicao: longint);
begin
Achou:=false;
Posicao:=-1;
seek(ArqFarma,0);
while not eof(ArqFarma) do begin
read(ArqFarma,RegFarma);
if RegFarma.Nome = N then begin
Achou:=true;
Posicao:=filepos(ArqFarma)-1; end;
end;
end;

Por que continuar a busca mesmo j tendo


localizado o elemento desejado?
UFS - DComp - Prof. Kenia Kodel

66

Implementar

procedimento
de excluso
(lgica).

UFS - DComp - Prof. Kenia Kodel

67

procedure incluir;
var
R: char;
begin
repeat
Ajustar
clrscr;
procedimento de
writeln('*** inclusao ***');
writeln;
incluso de forma a
with RegFarma do begin
evitar redundncia
writeln('Nome: ');
readln(Nome);
de dados.
writeln('Preco: ');
readln(Preco);
writeln('Estoque: ');
readln(Estoque);
end;
seek(ArqFarma,filesize(ArqFarma));
write(ArqFarma,RegFarma);
writeln;
writeln('Deseja efetuar nova inclusao? S/N ');
repeat
R:=upcase(readkey);
until (R='S') or (R='N');
until R='N';
end;
UFS - DComp - Prof. Kenia Kodel

68

Implementar
procedimento
de alterao

(ajuste do
estoque).

UFS - DComp - Prof. Kenia Kodel

69

Verifique
Vazio

Consulta
Total

Incluso
Cadastro
Farmcia
[Principal]

Consulta

Excluso

Alterao

Analisando a situao
problema, que outras
alteraes (edies)
so provavelmente
necessrias?

UFS - DComp - Prof. Kenia Kodel

70

Verifique
Vazio?

Consulta
Total?

Incluso?
Controle
de Notas
[Principal]

Consulta?

Excluso?

Alterao?

Criar programa Pascal


para manter as notas
dos alunos da turma
de Programao
Imperativa: 3 notas
(de 0 a 10).
UFS - DComp - Prof. Kenia Kodel

71

Criar trecho de cdigo Pascal para


manter o ranking de um jogo.
Neste so mantidos nome do
jogador e pontuao (o que
tambm corresponde
entrada). Um nome no pode
aparecer mais de uma vez no
jogo. O ranking composto
por at 5 jogadores.
UFS - DComp - Prof. Kenia Kodel

72

73

COMPLEMENTAR ESTUDOS:
Fundamentos da Programao de Computadores
Ana Fernanda Gomes Ascencio
Edilene Aparecida Veneruchi de Campos

Captulos: Registro &


Arquivo

UFS - DComp - Prof. Kenia Kodel

ARQUIVOS

73

Anda mungkin juga menyukai