Vous êtes sur la page 1sur 41

2012

CTI UNESP Prof Ariane Scarelli

Identifique sua apostila Seu nome: ______________________________ Sua turma: _______________

[FPD PASCAL AP.03]


Curso Informtica. Disciplina FPD (Fundamentos de Processamento de Dados). Turmas 71A, 71B e 71C. 4 bimestre Apostila 3 de Linguagem de programao PASCAL. Contedo: ESTRUTURA DE DADOS E ARQUIVOS.

SUMRIO
III. MDULO AVANADO (continuao) ....................................................................... 1 8. Estrutura de Dados ....................................................................................................... 1 8.1. Conjuntos ................................................................................................................. 1 8.2. Registro (Record) ..................................................................................................... 2 8.2.1. Comando With/Do ............................................................................................. 5 9. Arquivos....................................................................................................................... 10 9.1. Arquivos com Tipo Definido .................................................................................... 11 9.1.1. Sub-rotinas para tratamento de Arquivos com Tipo Definido ........................... 12 Assign( ) ............................................................................................................. 12 Rewrite( ) ............................................................................................................ 13 Reset( ) ............................................................................................................... 13 Close( ) ............................................................................................................... 14 Write( )................................................................................................................ 14 Eof( ) (significa End of File) ................................................................................ 15 Read( ) ............................................................................................................... 15 Filesize( ) ............................................................................................................ 16 Filepos( )............................................................................................................. 16 Seek ( ) ............................................................................................................... 17 Erase ( ) .............................................................................................................. 18 Rename ( ).......................................................................................................... 18 9.1.2. Verificao de Erros de Entrada/Sada (E/S) .................................................. 19 IOResult ( ) ......................................................................................................... 19 9.2. Arquivos do Tipo Texto .......................................................................................... 24 9.2.1. Sub-rotinas para tratamento de Arquivos do Tipo TEXTO ............................... 25 Assign( ) ............................................................................................................. 25 Rewrite( ) ............................................................................................................ 25 Reset( ) ............................................................................................................... 25 Append( ) ............................................................................................................ 26 Close( ) ............................................................................................................... 26 Write/Writeln( ) .................................................................................................... 27 EOF( ) (significa End of File) .............................................................................. 27 Read/Readln( ) ................................................................................................... 27 EoLn( ) (significa End of Line) ............................................................................ 28 Erase( ) ............................................................................................................... 29 Rename( )........................................................................................................... 29 IV. ANEXOS ................................................................................................................... 30 ANEXO A Cdigos e Mensagens de Erros .................................................................... 30 V. APNDICES ................................................................................................................. 35 APNDICE A SET (Conjunto) ........................................................................................ 35

FPD - Pascal - Prof Ariane Scarelli

III. MDULO AVANADO (continuao)


Continuao do mdulo avanado da linguagem Pascal.

8. Estrutura de Dados
A linguagem Pascal possui as seguintes estruturas de dados: Variveis simples; Variveis compostas homogneas: Unidimensionais (vetores); Multidimensionais (matrizes); Variveis compostas por Conjuntos; Variveis compostas heterogneas: Registros (contm em sua estrutura vrios tipos de dados diferentes). Contm em sua estrutura um nico tipo de dado.

8.1. Conjuntos
Conjuntos so um grupo de nmeros ou caracteres. So utilizados principalmente para verificar se um nmero ou caractere pertence a um determinado universo, auxiliando bastante em ifs e cases, por exemplo. O tamanho do conjunto pode variar, mas no poder ultrapassar o mximo de 256 elementos. Sintaxe: [ elementos pertencentes ao conjunto ] ou [ limite_inferior .. limite_superior ]

Exemplos:

[1..5] [10,20,30,40,50] [a,e,i,o,u] [a .. z]

{conjunto composto pelos elementos 1, 2, 3, 4, 5} {observe que so separados por vrgulas} {observe que esto entre apstrofos caracteres} {todos os elementos de a at z pertencem ao conjunto}

H distino entre letras maisculas e minsculas.

Prof Ariane Scarelli

FPD/PASCALAp03

O operador lgico IN utilizado para verificar se um elemento est contido em um conjunto.

Exemplos 1 e 2: Para fazer teste de consistncia de dados:

program exemplo1; var iA:integer; begin writeln(Digite um valor no intervalo [0,10]); repeat readln(iA); until (iA in [0..10]); {anteriormente: (iA >= 0) and (iA <=10) } end. program exemplo2; var cVogal:char; begin writeln(Digite uma Vogal); repeat readln(cVogal); until (cVogal in [a,e,i,o,u]); end.

{se colocar [a.. u] sero consideradas todas as letras de a at u }

8.2. Registro (Record)


O Registro (Record) uma combinao de vrios tipos de dados para formar um novo tipo. Tambm pode-se defini-lo como um conjunto de dados de diferentes tipos, logicamente relacionado, sendo esta uma das principais vantagens de usar um record. uma outra forma de definir uma varivel em Pascal. Exemplo: Para armazenar as seguintes informaes de uma pessoa, pela forma tradicional, seria necessrio definir uma varivel para cada tipo de informao, ou seja: var sNome bIdade rAltura cSexo bNumDep sCargo : : : : : : string[30]; byte; real; char; byte; string[25];

Prof Ariane Scarelli

FPD/PASCALAp03

Declarando um record como varivel: var Pessoa : record sNome bIdade rAltura cSexo bNumDep sCargo end;

: : : : : :

string[50]; byte; real; char; byte; string[25];

Para definir mais de uma varivel como o mesmo tipo record pode-se utilizar o recurso de criar tipos definidos pelo usurio, atravs do comando TYPE, da forma: Declarando um record como tipo: type Pessoa = record sNome bIdade rAltura cSexo bNumDep sCargo end; : : : : : : string[30]; byte; real; char; byte; string[25];

var Depto1, Depto2 : Pessoa; Assim, tm-se duas variveis Depto1 e Depto2 que possuem o tipo Pessoa. Quando se trabalha com record, as partes componentes do mesmo recebem um nome prprio, o qual conhecido como campo. Desta forma, uma varivel record pode ter campos de qualquer tipo vlido do Pascal, sendo permitido, inclusive, que um record seja definido dentro de outro. Por exemplo, a varivel Depto1 rene 6 campos de dados, que na memria do computador tem a seguinte representao: Depto1

sNome

bIdade

rAltura

cSexo bNumDep sCargo

Para trabalhar com variveis do tipo record escreve-se primeiro o nome da varivel e, em seguida, o campo a ser referenciado, onde os identificadores so separados por um ponto ( . ), como nos exemplos abaixo:

Prof Ariane Scarelli

FPD/PASCALAp03

ler o nome: readln(Depto1.sNome); mostrar a altura: writeln(Depto1.rAltura); atribuir uma idade: Depto1.bIdade := 25; Nota: incorreto: readln(Depto1); writeln(Depto1); readln(sNome);

Neste exemplo, a varivel Depto1 nica, ou seja, ela armazena somente um nome, uma idade, uma altura, um sexo, um nmero de dependentes e um cargo. Supondo que se deseja armazenar todas as pessoas que trabalham no Departamento 1, seria necessrio criar uma lista de pessoas. Para criar uma lista que identifique cada uma das informaes da varivel Depto1 para 20 pessoas que trabalham neste departamento, necessrio associar registros (records) aos vetores, lembrando que os vetores utilizam, obrigatoriamente, ndices para referenciar suas posies. Neste caso o nome do registro ser substitudo pelo nome do vetor acompanhado de seu ndice.

Redefinindo: var Depto1,Depto2: array [1..20] of Pessoa;

A representao na memria do computador fica:

Depto1 [1] [ 2 ] ............................... [ 20 ]

sNome bIdade rAltura cSexo bNumDep sCargo

Exemplos de como trabalhar com as posies do vetor: readln(Depto1[5].sNome); Depto1[2].rAltura := 1.72;

{ l o nome e armazena na posio 5 do vetor } { atribui a altura para a posio 2 do vetor }

Prof Ariane Scarelli

FPD/PASCALAp03

8.2.1. Comando With/Do


Este comando permite que se crie uma referncia para trabalhar com registros. Atravs do registro ou do vetor colocado com o comando with/do, pode-se referenciar os campos do registro: with begin uso dos campos do registro end; <nome_do_registro ou vetor> do

Exemplo: var aluno:record rMatricula : real; sNome : string[30]; end;

para utilizao do registro aluno no programa: with aluno do begin readln(rMatricula); readln(sNome); end; para um vetor: type aluno = record rMatricula : real; sNome : string[30]; end; var sala : array[1..35] of aluno; No programa: with begin readln(rMatricula); readln(sNome); end; Onde a varivel iInd tem um valor previamente definido ou pode ser substitudo por uma constante. sala[iInd] do

Prof Ariane Scarelli

FPD/PASCALAp03

Exemplos: Programa para cadastro de notas de alunos:

1 verso: um nico registro com 5 campos; program exemplo_versao_1; uses wincrt; type Reg_Aluno=record sNome : string[35]; rNumero, rNota1, rNota2, rNota3 :real; end; {********************************************************} procedure Tela; {********************************************************} begin clrscr; gotoxy(5,2); write('Cadastro de Notas'); gotoxy(5,5); write('Nmero aluno.: '); gotoxy(5,6); write('Nome aluno...: '); gotoxy(5,7); write('Primeira nota: '); gotoxy(5,8); write('Segunda nota.: '); gotoxy(5,9); write('Terceira nota: '); end; {******************** BP ********************************} var Aluno : Reg_Aluno; cResp : char; Conj_sim_nao, Conj_nao : set of char; begin Conj_sim_nao := ['s','S','n','N']; Conj_nao := ['n','N']; repeat Tela; gotoxy(20,5); readln(Aluno.rNumero); gotoxy(20,6); readln(Aluno.sNome); gotoxy(20,7); readln(Aluno.rNota1); gotoxy(20,8); readln(Aluno.rNota2); gotoxy(20,9); readln(Aluno.rNota3); gotoxy(5,12); write('Continua incluso? (S/N): '); repeat readln(cResp); until (cResp in Conj_sim_nao); until (cResp in Conj_nao); clrscr; gotoxy(10,10); write('Obrigado por usar nosso sistema!'); end.

Prof Ariane Scarelli

FPD/PASCALAp03

2 verso: um nico registro com 5 campos, utilizando o comando With/Do: program exemplo_versao_2; uses wincrt; type Reg_Aluno=record sNome : string[35]; rNumero, rNota1, rNota2, rNota3 :real; end; {********************************************************} procedure Tela; {********************************************************} begin clrscr; gotoxy(5,2); write('Cadastro de Notas'); gotoxy(5,5); write('Nmero aluno.: '); gotoxy(5,6); write('Nome aluno...: '); gotoxy(5,7); write('Primeira nota: '); gotoxy(5,8); write('Segunda nota.: '); gotoxy(5,9); write('Terceira nota: '); end; {******************** BP ********************************} var Aluno : Reg_Aluno; cResp : char; Conj_sim_nao, Conj_nao : set of char; begin Conj_sim_nao := ['s','S','n','N']; Conj_nao := ['n','N']; repeat Tela; with Aluno do begin gotoxy(20,5); readln(rNumero); gotoxy(20,6); readln(sNome); gotoxy(20,7); readln(rNota1); gotoxy(20,8); readln(rNota2); gotoxy(20,9); readln(rNota3); end; gotoxy(5,12); write('Continua incluso? (S/N): '); repeat readln(cResp); until (cResp in Conj_sim_nao); until (cResp in Conj_nao); clrscr; gotoxy(10,10); write('Obrigado por usar nosso sistema!'); end.

Prof Ariane Scarelli

FPD/PASCALAp03

3 verso: um conjunto de 10 registros com 5 campos cada, utilizando o comando With/Do : program exemplo_versao_3; uses wincrt; type Reg_Aluno = record sNome : string[35]; rNumero, rNota1, rNota2, rNota3 :real; end; Tipo_Classe_10 = array[1..10] of Reg_Aluno; {classe com 10 alunos} {********************************************************} procedure Tela; {********************************************************} begin clrscr; gotoxy(5,2) ; write('Cadastro de Notas'); gotoxy(5,4) ; write('...> Incluindo o'); {para controlar o n do registro corrente} gotoxy(5,6) ; write('Nmero aluno.: '); gotoxy(5,7) ; write('Nome aluno...: '); gotoxy(5,8) ; write('Primeira nota: '); gotoxy(5,9) ; write('Segunda nota.: '); gotoxy(5,10); write('Terceira nota: '); end; {********************************************************} procedure Inclui(var Aluno:Tipo_Classe_10); {********************************************************} var iInd : integer; cResp : char; Conj_sim_nao, Conj_nao : set of char; begin Conj_sim_nao := ['s','S','n','N']; Conj_nao := ['n','N']; for iInd:=1 to 10 do begin Tela; with Aluno[iInd] do begin gotoxy(21,4) ; write(iInd:2, ' registro <...'); gotoxy(20,6) ; readln(rNumero); gotoxy(20,7) ; readln(sNome); gotoxy(20,8) ; readln(rNota1); gotoxy(20,9) ; readln(rNota2); gotoxy(20,10); readln(rNota3); end; gotoxy(5,12); write('Continua incluso? (S/N): '); repeat readln(cResp); until (cResp in Conj_sim_nao); if (cResp in Conj_nao) then

Prof Ariane Scarelli

FPD/PASCALAp03

exit; end; end; {******************** BP ********************************} var Aluno : Tipo_Classe_10; {10 registros, ou seja, para 10 alunos} begin Inclui(Aluno); clrscr; gotoxy(10,10); write('Obrigado por usar nosso sistema!'); end. Exerccios: 84. Definir um record que tenha os seguintes campos: Numero de Matrcula, Nome, Curso, Semestre. 85. Faa um programa para ler as informaes do exerccio anterior, fazendo os testes de consistncia de dados descritos abaixo e, no final, mostre os dados do aluno: Matrcula: entre 10000 e 60000; Curso: s pode ser Farmcia ou Odontologia ou Medicina ou Fisioterapia; Semestre: 1 ou 2; 86. Ampliar as definies do exerccio anterior, acrescentando outro campo chamado Disciplinas que tambm ser um record e que ter os campos: Codigo Disciplina (integer), Nome Disciplina (string[20]), Mdia Final Disciplina (real, sendo um total de 3 disciplinas). 87. Faa um programa que utilize as definies do exerccio anterior e leia estas informaes para 10 alunos, mostrando, no final, todos os alunos cadastrados. 88. Elabore um programa para preencher uma tabela (lista) de 30 alunos com os dados: Nome, Mdia de trabalhos e Mdia de provas de todos os alunos. Em seguida, calcule e mostre: a) a mdia final de todos os alunos, sendo: se a mdia de provas >= 6, mdia final = 0.7*mdia de provas + 0.3*mdia de trabalhos; se mdia de provas < 6, mdia final = mdia de provas; b) o nome dos alunos que obtiveram a maior e a menor mdia final. 89. Uma indstria faz a folha mensal de pagamento de seus empregados baseada numa tabela com os dados dos funcionrios, como segue: Cadastro:

1
Cdigo Nome Depto

2
. . .

Qtde Horas Normais

Qtde Horas Extras

100

Prof Ariane Scarelli

FPD/PASCALAp03

Faa um programa que processe a tabela e imprima, para cada funcionrio, seu contracheque, cujo formato :
Cdigo.........................: 9999 Nome...: XXXXXXXXX40XXXXXXXX Depto...: XXX15XXX Salrio horas normais..: 999999.99 Salrio horas extras.....: 999999.99 Deduo INSS.............: 99999.99 Salrio Lquido.............: 999999.99

Onde: Salrio Horas Normais = 80 * nmero de horas normais Salrio Horas Extras = 100 * nmero de horas extras Salrio Bruto = salrio normal + salrio extra Desconto INSS = 8% do salrio bruto Salrio Lquido = salrio bruto - desconto

9. Arquivos
Para que os dados sejam armazenados necessrio ter estruturas de dados capazes de represent-los, como os registros (Record). Alm disso, estes dados devem ser gravados em dispositivos como pendrives, discos rgidos etc., para que possam ser recuperados (lidos) durante a execuo dos programas. Definio: Arquivo um conjunto de registros armazenados em um dispositivo de memria secundria (HD, por exemplo). A linguagem Pascal possui dois tipos de arquivos: Arquivos com Tipo Definido; Arquivos do Tipo Texto.

A estrutura geral de um arquivo tem uma posio fsica indicada por um nmero inteiro e os campos criados para este arquivo na estrutura de dados (Record). Por exemplo, um arquivo com dados de contas bancrias:

Prof Ariane Scarelli

FPD/PASCALAp03

10

Posio Fsica 1 2 3 4 . . . n

Nome Cliente Cristina Joyce Avelino Jos Carlos

Saldo R$ 7234,67 R$ 540,78 R$ 2190,40 R$ 768,01

Tipo Cliente Especial Normal Normal Especial

Joo Gilberto

R$ 1591,89

Especial

O conjunto de registros composto pelos dados de cada cliente que foram gravados no arquivo. A quantidade n depender do tamanho do dispositivo de gravao (memria suficiente).

9.1. Arquivos com Tipo Definido


Os arquivos com Tipo Definido possuem uma varivel de arquivo que identifica o tipo de dado que ser encontrado dentro do mesmo. Esta varivel pode ser do tipo Integer, Real, String, Byte, Record e outros prprios da linguagem ou definidos pelo usurio. Os arquivos so tratados pelo computador como uma grande varivel, ou seja, existe uma varivel do tipo arquivo que serve para referenciar a rea do dispositivo de gravao responsvel pelo armazenamento dos dados pertencentes a ele.

Passos para realizar operaes em um arquivo: referenciar o arquivo (file of); associar um nome externo (assign); criar e abrir o arquivo (rewrite) ou s abrir (reset); aplicar funes de manipulao de arquivos (filepos, filesize, read, write, seek, etc.); fechar o arquivo (close).

Para referenciar um arquivo com Tipo Definido cria-se uma varivel na seo de variveis (var) atravs da declarao file of, da forma:

Prof Ariane Scarelli

FPD/PASCALAp03

11

var nome_varivel_tipo_arquivo : file of tipo_de _dado;

Exemplos:

a) var
arq1 : file of string[50]; {armazenar dados string com tamanho mximo 50}

b) var
arq2 : file of integer; {armazenar apenas nmeros inteiros}

c) type aluno = record


rMatricula : real; sNome end; var arq3 : file of aluno; {armazenar registros do tipo aluno} : string[30];

9.1.1. Sub-rotinas para tratamento de Arquivos com Tipo Definido Assign( )


Procedimento que relaciona a varivel tipo arquivo (file of) com o nome de arquivo em disco (nome externo que aparecer no dispositivo de armazenamento), o qual ser usado no programa. Sintaxe: ASSIGN(nome_varivel_tipo_arquivo , nome_arquivo_em_disco);

Exemplo: program teste_assign; uses wincrt; type aluno = record rMatricula : real; sNome : string[30]; end; var arquivo : file of aluno; begin assign (arquivo, c:\Trabalho\TURMA.DAT); {faz somente a associao} end.

Prof Ariane Scarelli

FPD/PASCALAp03

12

Rewrite( )
Cria e abre um arquivo para Entrada e Sada de dados. Caso o arquivo no exista, o mesmo ser criado. Caso o arquivo j exista, todos os dados existentes nele sero apagados. Sintaxe : REWRITE( nome_varivel_tipo_arquivo);

Exemplo: program teste_rewrite; uses wincrt; type aluno = record rMatricula : real; sNome : string[30]; end; var arquivo : file of aluno; begin assign (arquivo, c:\Trabalho\TURMA.DAT); {faz somente a associao} rewrite (arquivo);{cria no HD, pasta Trabalho, o arquivo TURMA.DAT} end.

Reset( )
Abre um arquivo para Entrada e Sada de dados que j exista. Caso o arquivo no exista ocorrer um erro de execuo e o programa ser abortado. Se o arquivo j est aberto, ser fechado e aberto novamente. Sintaxe : RESET(nome_varivel_tipo_arquivo);

Exemplo: program teste_reset; uses wincrt; type aluno = record rMatricula : real; sNome : string[30]; end; var arquivo : file of aluno; begin assign (arquivo, c:\Trabalho\TURMA.DAT); {faz somente a associao} reset (arquivo); {abre o arquivo TURMA.DAT que j foi criado pelo Rewrite} end.

Prof Ariane Scarelli

FPD/PASCALAp03

13

Close( )
Fecha um arquivo que tenha sido aberto com RESET / REWRITE. Todo arquivo (de leitura ou gravao) deve ser fechado aps a sua utilizao, que significa: Sintaxe desabilitar seu uso; assegurar que todos os dados contidos nos buffers temporrios sejam transferidos para o disco caso seja um arquivo de gravao; atualizar o diretrio do disco caso o arquivo seja novo; liberar a varivel tipo arquivo do nome externo associado pelo ASSIGN. : CLOSE( nome_varivel_tipo_arquivo);

Exemplo: program teste_close; uses wincrt; type aluno = record rMatricula : real; sNome : string[30]; end; var arquivo : file of aluno; begin assign (arquivo, c:\Trabalho\TURMA.DAT); {faz somente a associao} reset (arquivo); {abre o arquivo TURMA.DAT que j foi criado pelo Rewrite} close(arquivo); {fecha o arquivo} end.

Write( )
Assim como este comando usado para escrever dados no vdeo, tambm usado para gravar dados em arquivos. Sintaxe : WRITE (nome_varivel_tipo_arquivo, varivel a ser gravada)

Exemplo: program teste_write; uses wincrt; type aluno = record rMatricula: real; sNome : string[30]; end; var

Prof Ariane Scarelli

FPD/PASCALAp03

14

arquivo : file of aluno; reg :aluno; begin assign (arquivo, 'c:\Trabalho\TURMA.DAT'); {faz somente a associao} rewrite (arquivo); {cria e abre o arquivo TURMA.DAT => vazio} repeat writeln ('Digite a matrcula: '); {aparece no vdeo} readln (reg.rMatricula); {leitura via teclado} if (reg.rMatricula <> 0) then begin writeln ('Digite o nome: '); readln (reg.sNome); write (arquivo, reg); {grava os dados lidos pelo teclado no arquivo} end; until (reg.rMatricula = 0); {reprocessamento} close (arquivo); end.

Eof( ) (significa End of File)


Retorna TRUE caso a posio de fim de arquivo seja atingida, ou seja, aps o ltimo registro do arquivo, ou se o arquivo estiver vazio (sem registros); caso contrrio, retorna FALSE. Sintaxe : EOF (nome_varivel_tipo_arquivo)

Exemplo: vide aplicao no exemplo da rotina READ a seguir.

Read( )
Assim como usado para ler dados via teclado, tambm usado para ler dados do arquivo.

Sintaxe

: READ (nome_varivel_tipo_arquivo, varivel receptora dos dados)

Exemplo: program teste_read; uses wincrt; type aluno = record rMatricula : real; sNome : string[30]; end; var
Prof Ariane Scarelli FPD/PASCALAp03 15

arquivo : reg:aluno; begin

file of aluno;

assign (arquivo, 'c:\Trabalho\TURMA.DAT'); reset (arquivo); {no pode ser rewrite porque apaga os dados} while not eof(arquivo) do begin read(arquivo,reg); {l o registro e armazena em reg} with reg do {evita que se coloque reg.rMatricula, reg.sNome} begin writeln('Matricula: ',rMatricula); writeln('Nome : ',sNome); end; end; close (arquivo); end.

Filesize( )
Retorna quantos registros existem armazenados no arquivo. Sintaxe : varivel_receptora : = FILESIZE (nome_varivel_tipo_arquivo);

Exemplo: program teste_filesize; uses wincrt; type aluno = record rMatricula : real; sNome : string[30]; end; var arquivo : file of aluno; reg:aluno; iTamanho:integer; begin assign (arquivo, 'c:\Trabalho\TURMA.DAT'); reset (arquivo); {no pode ser rewrite porque apaga os dados} iTamanho:=filesize(arquivo); writeln(iTamanho);{apresentar o nmero de registros do arquivo} close (arquivo); end.

Filepos( )
Retorna um nmero inteiro indicando qual o registro corrente em um arquivo. Observando que o primeiro registro recebe o nmero zero.

Prof Ariane Scarelli

FPD/PASCALAp03

16

Sintaxe

: varivel_receptora : = FILEPOS (nome_varivel_tipo_arquivo);

Exemplo: program teste_filepos; uses wincrt; type aluno = record rMatricula : real; sNome : string[30]; end; var arquivo : file of aluno; reg:aluno; iCorrente:integer; begin assign (arquivo, 'c:\Trabalho\TURMA.DAT'); reset (arquivo); {no pode ser rewrite porque apaga os dados} iCorrente:=filepos(arquivo); writeln(iCorrente); {apresentar o valor 0 porque est no incio do arquivo} close (arquivo); end.

Seek ( )
Desloca o ponteiro do arquivo para o registro de nmero X. Sintaxe : SEEK ( nome_varivel_tipo_arquivo, Nmero X );

Para posicionar o ponteiro no final do arquivo, a fim de inserir um novo registro, deve-se fazer: SEEK( nome_varivel_tipo_arquivo, FILESIZE ( nome_varivel_tipo_arquivo ) );

Exemplo: program teste_seek; uses wincrt; type aluno = record rMatricula : real; sNome : string[30]; end; var arquivo : file of aluno; reg:aluno; begin assign (arquivo, 'c:\Trabalho\TURMA.DAT'); reset (arquivo); seek(arquivo,2); {posiciona no registro de endereo 2 comea no zero} read(arquivo,reg); {l o registro para depois ser mostrado}

Prof Ariane Scarelli

FPD/PASCALAp03

17

writeln('Matricula: ',reg.rMatricula); writeln('Nome : ',reg.sNome); close (arquivo); end.

Erase ( )
Remove o arquivo do disco e retira suas informaes do diretrio. importante notar que o arquivo a ser eliminado no pode estar aberto. Sintaxe : ERASE (nome_varivel_tipo_arquivo);

Exemplo: program teste_erase; uses wincrt; type aluno = record rMatricula : real; sNome : string[30]; end; var arquivo : file of aluno; reg:aluno; begin assign (arquivo, 'c:\Trabalho\TURMA.DAT'); {depois de associado, ser apagado. Importante: o arquivo tem que estar fechado} erase(arquivo); {apaga o arquivo do disco} end.

Rename ( )
Troca o nome do arquivo em disco. Sintaxe : RENAME (nome_varivel_tipo_arquivo, novo nome arquivo no disco);

Exemplo: program teste_rename; uses wincrt; type aluno = record rMatricula : real; sNome : string[30]; end; var arquivo : file of aluno; reg:aluno; begin assign (arquivo, 'c:\Trabalho\TURMA.DAT');

Prof Ariane Scarelli

FPD/PASCALAp03

18

{depois de associado, ser renomeado. Importante: o arquivo tem que estar fechado} rename(arquivo,c:\Trabalho\SALA.DAT); { renomeia o arquivo no disco } end.

9.1.2. Verificao de Erros de Entrada/Sada (E/S) IOResult ( )


Esta funo informa um cdigo referente ltima operao de E/S que foi realizada. Se o valor retornado for diferente de zero significa a ocorrncia de um erro. Sintaxe : IORESULT retorna um valor do tipo word. Observaes: Para que a funo IORESULT possa atuar, a diretiva de compilao {$i} tem que ser desabilitada. Esta diretiva habilita ou desabilita a gerao automtica de cdigo em relao s operaes de E/S. O default dela habilitada {$i+} e sua atuao junto s operaes local, ou seja, deve aparecer com o comando em que dever atuar. Habilitada {$i+} quando uma operao de E/S for realizada e gerar um cdigo de erro diferente de zero (problemas na operao), o programa encerrado em tempo de execuo; Desabilitada {$i-} os cdigos de erro gerados pelas operaes de E/S devem ser verificados atravs da funo IORESULT.

Exemplo: program teste_Ioresult; uses wincrt; var arquivo : file of integer; begin assign ( arquivo, 'c:\trabalho\VALORES.DAT' ); {$i-} reset(arquivo); {tenta abrir o arquivo VALORES.DAT} {$i+} if ( IORESULT = 0 ) then writeln( Arquivo existente ) {usar RESET} else writeln( Arquivo Inexistente ); {usar REWRITE} close(arquivo); end.

Prof Ariane Scarelli

FPD/PASCALAp03

19

Valor Retornado 0 2 3 4 5 15 100 101

Mensagem Correspondente arquivo existente arquivo no encontrado path no encontrado muitos arquivos abertos simultaneamente erro de acesso a arquivo drive invlido erro de leitura em disco erro de gravao em disco

Exemplo: programa de incluso com as rotinas apresentadas program exemplo_inclusao; uses wincrt; Const incluindo=0; type Registro = record rMatricula : real; sNome : string[30]; end; Arquivo = file of Registro; TipoOperacao = (Inclui,Mostra); {constantes enumerativas} {******************************************************************} function Existe_Arquivo( sNomeArq : string; var Arq: Arquivo ):boolean; {******************************************************************} begin assign(Arq,sNomeArq); {$I-} {para o tratamento do erro desliga o teste automtico} reset(Arq); {$I+} {religa o teste automtico} Existe_Arquivo:=(IOResult = 0); end; {******************************************************************} procedure Tela(Operacao:TipoOperacao); {******************************************************************} begin clrscr; gotoxy(10,2) ; write('Cadastro de Alunos'); if (Ord(Operacao)=incluindo) then begin gotoxy(10,5) ; write('...> Incluindo o'); end else {mostrando} begin gotoxy(10,5) ; write('...> Mostrando o');
Prof Ariane Scarelli FPD/PASCALAp03 20

end; gotoxy(10,7) ; write('Nmero de matrcula: '); gotoxy(10,8) ; write('Nome do aluno......: '); end; {******************************************************************} procedure Incluir(var Arq: Arquivo; var Reg:Registro); {******************************************************************} var cResp : char; iTam:longint; {uma var. LongInt ocupa 4 bytes de memria e sua faixa de -2.147.483.648 a 2.147.483.647} Conj_sim_nao, Conj_nao : set of char; begin Conj_sim_nao := ['s','S','n','N']; Conj_nao := ['n','N']; iTam:=filesize(Arq); {esta funo retorna sempre um valor do tipo LongInt} seek(Arq,iTam); repeat Tela(Inclui); inc(iTam); with Reg do begin gotoxy(31,5) ; write(iTam:3, ' registro <...'); gotoxy(31,7) ; readln(rMatricula); gotoxy(31,8) ; readln(sNome); end; repeat gotoxy(7,12); write('Confirma dados? (S/N): '); readln(cResp); until (cResp in Conj_sim_nao); if (upcase(cResp) = 'S') then write(Arq, Reg) else dec(iTam); repeat gotoxy(7,14); write('Continua incluso? (S/N): '); readln(cResp); until (cResp in Conj_sim_nao); until (cResp in Conj_nao); end; {******************************************************************} procedure Mostrar(var Arq: Arquivo; var Reg:Registro); {******************************************************************} var iInd,iQtdeReg:integer; cResp:char; begin reset(Arq); {fecha e abre o arquivo} iQtdeReg:=filesize(Arq); for iInd:=1 to iQtdeReg do begin Tela(Mostra);

Prof Ariane Scarelli

FPD/PASCALAp03

21

with Reg do begin read(Arq, Reg); gotoxy(27,5) ; write(iInd:3, ' aluno includo <...'); gotoxy(31,7) ; write(rMatricula:3:0); gotoxy(31,8) ; write(sNome); end; gotoxy(7,14); write('Aperte qualquer tecla para continuar'+ ' ou ESC para encerrar consulta...'); cResp:=readkey; if ord(cResp) = 27 then {ORD retorna o cdigo ASCII da tecla. ESC 27} exit; end; end; (****************************************************************** Bloco Principal *******************************************************************) var Arq_Alu : Arquivo; Reg_Alu : Registro; begin if Existe_Arquivo('c:\Trabalho\TURMA.DAT',Arq_Alu) then begin Reset(Arq_Alu); seek(Arq_Alu, filesize(Arq_Alu)); {posiciona no fim do arquivo para continuar a insero de dados} end else Rewrite(Arq_Alu); Incluir(Arq_Alu, Reg_Alu); {para conferir se gravou ok} Mostrar(Arq_Alu, Reg_Alu); clrscr; gotoxy(15,10); write('Obrigado por usar nosso sistema!'); close(Arq_Alu); end. Exerccios: 90. Crie um arquivo com tipo definido formado somente por nmeros inteiros de 1 a 1.000. Grave os registros em um arquivo chamado NUMEROS.DAT. 91. Faa a leitura do arquivo NUMEROS.DAT e escreva no vdeo somente os nmeros mpares.

Prof Ariane Scarelli

FPD/PASCALAp03

22

92. Crie um arquivo com Nome, Salrio e Nmero de dependentes de n funcionrios (at que se digite N para a pergunta: Deseja continuar?) com tipo definido chamado EMPRESA.DAT. 93. Faa a leitura do arquivo EMPRESA.DAT e escreva no vdeo o Nome e o Salrio dos funcionrios que ganham mais de US$ 500,00. Acesse o valor do dlar do dia para a converso. 94. Abra o arquivo EMPRESA.DAT e escreva o seu contedo de trs para frente, ou seja, do ltimo registro at o primeiro. Utilize os comandos SEEK, FILEPOS e FILESIZE. 95. Abra arquivo EMPRESA.DAT e altere o salrio dos funcionrios que possuem mais que 3 dependentes para US$ 1.050,00. 96. Abra o arquivo EMPRESA.DAT e aumente em 15% o salrio de todos os funcionrios que ganham menos de US$1.000,00. 97. Crie um arquivo com tipo definido chamado PRODUTOS.DAT com o Nome do produto. O cdigo do produto ser o prprio nmero fsico do registro. Aps a criao cadastre n produtos. 98. Crie um arquivo com tipo definido chamado FORNECED.DAT com Nome do Fornecedor. O cdigo do fornecedor ser o prprio endereo fsico do registro. Aps a criao cadastre n fornecedores. 99. Crie um arquivo com tipo definido chamado ESTOQUE.DAT com as seguintes informaes: Cdigo do Fornecedor e Cdigo do Produto, os quais devero existir nos arquivos PRODUTOS.DAT e FORNECED.DAT. Cadastre as informaes. 100. Usando os arquivos criados nos exerccios anteriores, mostre na tela um relatrio com o e armazene estas informaes em um arquivo

Nome do Fornecedor e os nomes dos produtos que cada um fornece. Como o lay-out abaixo: FORNECEDOR Kalunga PRODUTOS Mesa de 1m Luminria X Ventilador Y Gaveterio Cadeira Giratria Papel 75g/m2 Cartucho Color Serie A Caixa de Clips 101. Apague todos os dados do arquivo criado no exerccio 90. O arquivo dever continuar

Jalovi

existindo no disco. 102. Apague do disco o arquivo criado no exerccio 90.

Prof Ariane Scarelli

FPD/PASCALAp03

23

9.2. Arquivos do Tipo Texto


Os arquivos do Tipo Texto possuem uma estrutura de armazenamento de dados seqencial, deve-se comear pelo incio e processar seu contedo sequencialmente, no podendo ser feita como em arquivos com Tipo Definido usando o SEEK (posicionamento direto). So compostos por linhas que terminam com um retorno de carro e avano de linha (CR/LF), e que contm caracteres, palavras e sentenas na forma de texto. A combinao CR/LF corresponde aos valores 13 e 10, respectivamente, na tabela ASCII e conhecida como delimitador de final de linha.

Exemplo de dados armazenados em um arquivo Tipo Texto:

Ana Carla Sanchez Jos Alceu Liz de Mali <CR/LF> Silvia Nogueira

R. das Flores, 504 Av. do Estado, 1980 Alameda G, 4

236-4545<CR/LF> (11) 33459-8989<CR/LF> 543-8976<CR/LF>

R. Armando Ruiz, 56

234-9090<CR/LF>

Observe que mesmo a linha em branco possui o delimitador <CR/LF>.

Para referenciar um arquivo Tipo Texto cria-se uma varivel na seo de variveis (var) do tipo TEXT, da forma:

var nome_varivel_tipo_texto : text;

Exemplo: var arq : text; {a varivel arq referenciar uma rea no disco para o arquivo texto}

Prof Ariane Scarelli

FPD/PASCALAp03

24

9.2.1. Sub-rotinas para tratamento de Arquivos do Tipo TEXTO Assign( )


Funciona como no arquivo com Tipo Definido. (vide pgina 31). Exemplo: program teste_assign; var arquivo : text; begin assign (arquivo, a:FRASES.DAT);{faz somente a associao} end.

Rewrite( )
Cria e abre um arquivo texto somente para escrita (gravao). Caso o arquivo no exista, o mesmo ser criado. Caso o arquivo j exista, todos os dados existentes nele sero apagados. Sintaxe Exemplo: program teste_rewrite; var arquivo begin assign (arquivo, a:FRASES.DAT); {faz somente a associao} rewrite (arquivo); {cria no disquete o arquivo FRASES.DAT} end. : text; : REWRITE( nome_varivel_tipo_arquivo);

Reset( )
Abre um arquivo texto somente para leitura. Caso o arquivo no exista ocorrer um erro de execuo e o programa ser abortado. Se o arquivo j estiver aberto, ser fechado e aberto novamente. Sintaxe : RESET(nome_varivel_tipo_arquivo);

Prof Ariane Scarelli

FPD/PASCALAp03

25

Exemplo: program teste_reset; var arquivo : text; begin assign (arquivo, a:FRASES.DAT); { faz somente a associao} reset (arquivo); {abre o arquivo FRASES.DAT que j foi criado pelo Rewrite} end.

Append( )
Prepara um arquivo j existente para receber novos dados aps sua ltima informao, ou seja, permite que novas linhas sejam inseridas no final do arquivo. Caso este arquivo no exista ocorrer um erro de execuo e o programa ser abortado. um procedimento especfico para arquivos Tipo Texto. Sintaxe Exemplo: program teste_append; var arquivo : text; begin assign (arquivo, a:FRASES.DAT); {faz somente a associao} append (arquivo); {prepara o arquivo FRASES.DAT para receber novas informaes} end. : APPEND(nome_varivel_tipo_texto);

Close( )
Funciona como no arquivo com Tipo Definido. (vide pgina 32). Exemplo: program teste_close; var arquivo begin assign (arquivo, a:FRASES.DAT); {faz somente a associao} reset (arquivo); close(arquivo); {fecha o arquivo} end. : text;

Prof Ariane Scarelli

FPD/PASCALAp03

26

Write/Writeln( )
Assim como usado para escrever dados no vdeo, tambm usado para gravar informaes nos arquivos. Sintaxes: WRITE ( nome_varivel_tipo_texto, nome_varivel_a_ser_gravada); WRITELN ( nome_varivel_tipo_texto, nome_varivel_a_ser_gravada); O comando WRITELN grava a linha de dados no arquivo e inclui um delimitador no final de cada linha gravada. Deve ser usado somente em arquivos do Tipo Texto.

Exemplo: program teste_write; uses wincrt; var arquivo : text; lin: string[60]; cResp:char; begin assign (arquivo, 'a:FRASES.DAT'); rewrite (arquivo); {cria e abre o arquivo FRASES.DAT => vazio} repeat writeln ('Digite uma frase: '); {aparece no vdeo} readln (lin); {leitura via teclado} writeln (arquivo, lin); {grava os dados lidos pelo teclado no arquivo} writeln(Deseja continuar? ); {aparece no vdeo} readln (cResp); {leitura via teclado} until (upcase(cResp) = N); {reprocessamento} close (arquivo); end.

EOF( ) (significa End of File)


Funciona como no arquivo com Tipo Definido. (vide pgina 20).

Read/Readln( )
Assim como usado para ler dados via teclado, tambm usado para ler informaes dos arquivos. Sintaxes:

Prof Ariane Scarelli

FPD/PASCALAp03

27

READ ( nome_varivel_tipo_texto, nome_varivel_receptora_de_dados); O comando READ l a linha de dados do arquivo que est sendo apontada por seu ponteiro interno e a transfere para a varivel receptora. Em seguida, posiciona o ponteiro do arquivo imediatamente aps o ltimo caractere lido, no movendo o ponteiro para a prxima linha do arquivo. Se um delimitador (CR/LF) for encontrado, a leitura ser interrompida at que o ponteiro de arquivo seja movido para a prxima linha pelo comando READLN.

READLN ( nome_varivel_tipo_texto, nome_varivel_receptora_de_dados);

O comando READLN l a linha de dados do arquivo que est sendo apontada por seu ponteiro interno e a transfere para a varivel receptora. Em seguida, o ponteiro do arquivo ignora os demais caracteres da linha e move-se para o incio da linha seguinte.

Exemplo: program teste_read; uses wincrt; var arquivo : text; lin: string[60]; cResp:char; begin assign (arquivo, 'a:FRASES.DAT'); reset (arquivo); {no pode ser rewrite porque apaga os dados} while not eof(arquivo) do begin readln(arquivo,lin); {l o registro e armazena em lin} writeln(lin); {mostra no vdeo} end; close (arquivo); end.

EoLn( ) (significa End of Line)


uma funo booleana que retorna verdadeiro quando o ponteiro do arquivo chega ao final de uma linha ou final do arquivo e falso quando contrrio. Somente pode ser usada para arquivos Tipo Texto. Sintaxe: EOLN ( nome_varivel_tipo_texto);

Prof Ariane Scarelli

FPD/PASCALAp03

28

Erase( )
Funciona como no arquivo com Tipo Definido. (vide pgina no ndice).

Rename( )
Funciona como no arquivo com Tipo Definido. (vide pgina no ndice).

Exerccios: 103. Elabore um programa que crie um arquivo texto formado por nmeros inteiros de 1 a 1000. O

arquivo deve se chamar TEXTNUM.DAT. 104. 105. Faa a leitura do arquivo anterior e mostre no vdeo somente os nmeros pares. Faa um programa que crie dois arquivos do tipo Texto chamados NUMPAR.DAT e

NUMIMPAR.DAT. Leia o arquivo TEXTNUM.DAT e grave os nmeros pares no arquivo NUMPAR.DAT, gravando no final uma mensagem de FIM do Arquivo de Nmeros PARES e os nmeros mpares grave no arquivo NUMIMPAR.DAT, gravando no final uma mensagem de FIM do Arquivo de Nmeros MPARES. Depois disso, apague do disco o arquivo TEXTNUM.DAT e mostre, chamando uma procedure (sendo a passagem do nome do arquivo feita por referncia), os dois outros arquivos. Observao: se o arquivo TEXTNUM.DAT no existir no disco, d uma mensagem que o exerccio 103 deve ser executado e encerre o programa.

Prof Ariane Scarelli

FPD/PASCALAp03

29

IV. ANEXOS
ANEXO A Cdigos e Mensagens de Erros Cdigos e Mensagens de Erros de Execuo e Compilao (extrado do Help do Borland Pascal) Run-Time Error Messages To go to the Help screen for a particular run-time error, choose the highlighted error number from this list (click it, or Tab to it and press Enter). Error # 1 2 3 4 5 6 12 15 16 17 100 101 102 103 104 105 106 200 201 202 203 204 205 206 207 210 211 212 213 214 215 216 Error Message Invalid function number File not found Path not found Too many open files File access denied Invalid file handle Invalid file access code Invalid drive number Cannot remove current directory Cannot rename across drives Disk read error Disk write error File not assigned File not open File not open for input File not open for output Invalid numeric format Division by zero Range check error Stack overflow error Heap overflow error Invalid pointer operation Floating point overflow Floating point underflow Invalid floating point operation Object not initialized Call to abstract method Stream registration error Collection index out of range Collection overflow error Arithmetic overflow error General protection fault

Prof Ariane Scarelli

FPD/PASCALAp03

30

Compiler Error Messages To go to the Help screen for a particular compiler error, choose the highlighted error number from this list.

Error # 1 2 3 4 5 6 7 8 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

Error Message Out of memory Identifier expected Unknown identifier Duplicate identifier Syntax error Error in real constant Error in integer constant String constant exceeds line Unexpected end of file Line too long Type identifier expected Too many open files Invalid filename File not found Disk full Invalid compiler directive Too many files Undefined type in pointer definition Variable identifier expected Error in type Structure too large Set base type out of range File components may not be files or objects Invalid string length Type mismatch Invalid subrange base type Lower bound greater than upper bound Ordinal type expected Integer constant expected Constant expected Integer or real constant expected Pointer type identifier expected Invalid function result type Label identifier expected BEGIN expected END expected Integer expression expected Ordinal expression expected Boolean expression expected Operand types do not match operator Error in expression

Prof Ariane Scarelli

FPD/PASCALAp03

31

43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91

Illegal assignment Field identifier expected Object file too large Undefined external Invalid object file record Code segment too large Data segment too large DO expected Invalid PUBLIC definition Invalid EXTRN definition Too many EXTRN definitions OF expected INTERFACE expected Invalid relocatable reference THEN expected TO or DOWNTO expected Undefined forward Invalid typecast Division by zero Invalid file type Cannot Read or Write variables of this type Pointer variable expected String variable expected String expression expected Circular unit reference Unit name mismatch Unit version mismatch Internal stack overflow Unit file format error IMPLEMENTATION expected Constant and case types do not match Record or object variable expected Constant out of range File variable expected Pointer expression expected Integer or real expression expected Label not within current block Label already defined Undefined label in preceding statement part Invalid @ argument UNIT expected ";" expected ":" expected "," expected "(" expected ")" expected "=" expected ":=" expected

Prof Ariane Scarelli

FPD/PASCALAp03

32

92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 112 113 114 116 117 118 119 121 122 123 124 126 127 128 129 130 131 133 134 135 136 137 138 139 140 141 142 143 144

"[" or "(." expected "]" or ".)" expected "." expected ".." expected Too many variables Invalid FOR control variable Integer variable expected File and procedure types are not allowed here String length mismatch Invalid ordering of fields String constant expected Integer or real variable expected Ordinal variable expected INLINE error Character expression expected Too many relocation items Overflow in arithmetic operation No enclosing FOR, WHILE, or REPEAT statement Debug information table overflow CASE constant out of range Error in statement Cannot call an interrupt procedure Must be in 8087 mode to compile this Target address not found Include files are not allowed here No inherited methods are accessible here Invalid qualifier Invalid variable reference Too many symbols Statement part too large Files must be var parameters Too many conditional symbols Misplaced conditional directive ENDIF directive missing Error in initial conditional defines Header does not match previous definition Cannot evaluate this expression Expression incorrectly terminated Invalid format specifier Invalid indirect reference Structured variables are not allowed here Cannot evaluate without System unit Cannot access symbol table Invalid floating-point operation Cannot compile overlays to memory Pointer or procedural variable expected Invalid procedure or function reference Cannot overlay this unit

Prof Ariane Scarelli

FPD/PASCALAp03

33

145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170

Too many nested scopes in .TXT File access denied Object type expected Local object types are not allowed VIRTUAL expected Method identifier expected Virtual constructors are not allowed Constructor identifier expected Destructor identifier expected Fail only allowed within constructors Invalid combination of opcode and operands Memory reference expected Cannot add or subtract relocatable symbols Invalid register combination 286/287 instructions are not enabled Invalid symbol reference Code generation error ASM expected Duplicate dynamic method index Duplicate resource identifier Duplicate or invalid export index Procedure or function identifier expected Cannot export this symbol Duplicate export name Executable file header too large Too many segments

Prof Ariane Scarelli

FPD/PASCALAp03

34

V. APNDICES
APNDICE A SET (Conjunto)
SET permite a construo de tipos conjuntos, que podem ser referenciados e manipulados como qualquer operao de conjunto disponvel em matemtica. A descrio de um tipo conjunto tem a seguinte forma: SET of <tipo_base>

Um conjunto pode consistir em zero ou mais elementos do mesmo tipo_base que, obrigatoriamente, dever ser um tipo simples escalar, no real no string.

Na clusula Type: De conjuntos formados a partir dos tipos j existentes no Pascal, como integer (de 0 a 255), char, ou subconjuntos destes tipos:

Type Caracs = set of char; Digitos = set of 0..9; Maiusculas = set of A..Z;
De conjuntos formados a partir de constantes chamadas enumerativas:

Type Vogais = set of (a,e,i,o,u); Carros = set of (vw,gm,ford,peugeot,fiat);


Os conjuntos de constantes enumerativas devem ser definidos sempre entre parnteses e sem apstrofos. Cada elemento ser como o ndice de um vetor, mas comeando por zero. A declarao dos conjuntos definidos em type ser feita na rea de varives var:

Var Simbolo:Caracs; Numero:Digitos; Letra_Maiu:Maisculas; Vogal:Vogais;

Prof Ariane Scarelli

FPD/PASCALAp03

35

Marcas:Carros;
A construo de um conjunto no formado de constantes enumerativas feita a partir do construtor [ ] e de seu contedo: [1,3,7,11,13] {conjunto de alguns inteiros} [0..15] {conjunto de inteiros entre 0 e 15} [A..Z,a..z] {conjunto das letras de A a z, maisculas e minsculas} [s,S,n,N] {conjunto de caracteres para consistncia} [azul,verde,vermelho,branco] {conjunto de cores}

Ficando ento da seguinte maneira, seja no BP ou em qualquer sub-rotina:

Begin Smbolo := [A..Z,a..z]; Numero := [0..15];

O conjunto [A..z] composto das letras de A a z, maisculas (65 a 90) e minsculas (97 a 122) mais os cdigos 91 a 96 da tabela ASCII, que no so letras.

Exemplos: Para fazer teste de consistncia de dados: program exemploA; uses wincrt; type Numeros=0..10; var iA : integer; zero_a_dez : SET of Numeros; begin zero_a_dez := [0..10]; writeln(Digite um valor no intervalo [0,10]); repeat readln(iA); until (iA in zero_a_dez); end.

Prof Ariane Scarelli

FPD/PASCALAp03

36

program exemploB; uses wincrt; type simbolos=set of char; var cVogal:char; Letras:simbolos; begin Letras:=['a','e','i','o','u']; writeln('Digite uma Vogal'); repeat readln(cVogal); until (cVogal in Letras); end.

Operaes com conjuntos Atribuio


O operador de atribuio o mesmo utilizado para tipos simples. Exemplos: Resposta := [s,S,n,N]; Nmeros := [0,5,10]; Simbolos := [A..F]

Unio
Representado pelo sinal +, a unio entre dois conjuntos resulta num terceiro conjunto, formado pelos elementos dos dois conjuntos. a:=[1,2,3]; b:=[2,3,4,5]; c:=a+b ; resulta c:=[1,2,3,4,5]

Interseo
Representada pelo sinal *, a interseo entre dois conjuntos resulta num terceiro conjunto, formado pelos elementos comuns a ambos. a:=[1,2,3]; b:=[2,3,4,5]; c:=a*b ; resulta c:=[2,3]

Diferena
Representada pelo sinal -, a diferena entre dois conjuntos resulta num terceiro conjunto, cujos elementos esto num deles mas no no outro.

Prof Ariane Scarelli

FPD/PASCALAp03

37

a:=[1,2,3,6];

b:=[2,3,4,5];

c:=a-b ; c:=b-a ;

resulta c:=[1,6] resulta c:=[4,5]

Operadores relacionais
a=b a <> b todos os elementos esto em ambos (idnticos) alguns ou todos os elementos dos conjuntos no esto em ambos (no idnticos) a <= b a >= b a IN b todos os elementos de a esto em b todos os elementos de b esto em a a um elemento do conjunto b, de mesmo tipo base

Exemplo: Programa para ler uma frase de at 30 caracteres, determinar e mostrar o nmero de vogais, consoantes e brancos.

program pesquisa; uses wincrt; type alfabeto = 'A'..'Z'; letras = set of alfabeto; var sFrase:string[30]; iInd,iContVog,iContCons,iContBra:integer; Vogais,Consoantes:letras; begin iContVog:=0; iContCons:=0; iContBra:=0; Vogais:=['A','E','I','O','U']; Consoantes:=['A'..'Z']-Vogais; writeln('Digite uma frase de, no mximo, 30 caracteres'); readln(sFrase); for iInd:=1 to 30 do begin sFrase[iInd] := upcase(sFrase[iInd]); if (sFrase[iInd] = ' ') then inc(iContBra)
Prof Ariane Scarelli FPD/PASCALAp03 38

{para definir subconjuntos que estejam em alfabeto}

else if (sFrase[iInd] in Vogais) then inc(iContVog) else if (sFrase[iInd] in Consoantes) then {para evitar que sejam contados outros caracteres} inc(iContCons); end; writeln('Quantidade de Vogais: ',iContVog); writeln('Quantidade de Consoantes: ',iContCons); writeln('Quantidade de Brancos: ',iContBra); end.

Exerccios: i. Faa um programa, com reprocessamento, que leia um caractere e escreva se letra maiscula, letra minscula, espao em branco, nmero ou caractere especial. Encerre o programa quando o caractere digitado for $. ii. Faa um programa que leia dois nmeros de zero a nove (faa consistncia de dados) e um sinal (que s poder ser + - * /), faa a operao e mostre o resultado. Utilize conjuntos para fazer os testes de consistncia de dados. Faa reprocessamento, encerrando o programa somente aps o usurio responder no, pergunta: Deseja efetuar outro clculo? (S/N).

Prof Ariane Scarelli

FPD/PASCALAp03

39

Vous aimerez peut-être aussi