Ementrio O ambiente de desenvolvimento A linguagem Pascal
Ementário • • • O ambiente de desenvolvimento A linguagem Pascal, Programação Orientada a Objetos Visual Components Library Banco de dados: abordagem I e II Componentes Quick. Report Dynamic Link Library Help Install. Shield Express Delphi e Pascal Avançado Programando para Internet
Tipos estruturados • armazenam diversos itens de uma só vez • isto significa: – em uma mesma estrutura de dados, é possível ter diversas variáveis de tipos de dados simples agrupadas set (conjunto) array (vetor, matriz) record (registro) file (arquivo) class (classe, object pascal)
Conjuntos (set of): grupo de elementos matemática var Letras: set of char; Opcao: char; begin Letras : = ['A'. . 'Z', 'a'. . 'z']; enumerando os elementos repeat writeln('Digite uma letra: '); readln(Opcao); until Opcao in Letras; . . . end. pertinência (membership)
Vetores (array) • Definição: – representa um conjunto de valores do mesmo tipo (estrutura homogênea), referenciáveis pelo mesmo nome e individualizadas entre si através de sua posição dentro desse conjunto (variáveis indexadas) • Matematicamente: – um array é um vetor (Vi) de um determinado tipo de dados, com uma seqüência de endereçamentos de memória para armazenar os conteúdos de suas diversas posições dentro do vetor
array’s, ou variáveis indexadas • O termo indexada provém da maneira como é feita a individualização dos elementos do conjunto de dados: por meio de índices. • Uma variável indexada pode ser definida como tendo um ou mais índices. – vetor, um único índice (unidimensionais) – matriz, dois índices (bidimensionais) – multidimensionais, pouco freqüentes
Definição de variáveis indexadas (array): var Nome. Da. Variável: array[dim 1, dim 2, . . . ] of Tipo. De. Dado; onde: Nome. Da. Variável array of é o nome simbólico pelo qual o conjunto (variável indexada) é identificado; palavra reservada seguida das dimensões da variável entre colchetes (“[“ e “]”), determina que se trata de uma variável indexada palavra reservada que indica o tipo de dados do conjunto dim 1, dim 2, . . . são os intervalos dos índices da variável em cada uma das dimensões, definem a quantidade de elementos do conjunto (dim 1 * dim 2 *. . . ) Tipo. De. Dado é o tipo de dado correspondente aos elementos da variável indexada
Dimensão (dim 1, dim 2, . . . ) • são faixas de valores que determinam os índices da variável estruturada vetor • segue a seguinte sintaxe, LI. . LF, onde LIlimite inicial, LF- limite final e. . indica faixa de valores, por exemplo: – 1. . 10 – 1. . N – 5. . 10 de 1 até 10, 10 valores de 1 até N, N valores de 5 até 10, 6 valores
Declaração de variáveis indexadas (array): const N = 100; var A, B: Salarios: Meses: Matriz: array[1. . 10] of integer; array[1. . N] of real; array[1. . 12] of string[15]; array[1. . 3, 1. . 5] of integer; Nos exemplos acima temos: A, B, são conjuntos de 10 componentes inteiros cada, ou seja, variáveis capazes de armazenar dez números inteiros simultaneamente; Salarios, com capacidade de armazenar um total de N (100) números reais; Meses, um conjunto unidimensional de 12 elementos, cada um deles capaz de armazenar uma string de até 15 caracteres; Matriz, um conjunto bidimensional (3 x 5) capaz de armazenar um total de 3 x 5 = 15 n°s inteiros.
array’s, características básicas • estrutura de dados homogênea • todos os elementos da estrutura são igualmente acessíveis – tempo e tipo de procedimento para acessar qualquer um dos elementos do array são iguais • cada elemento componente deste tipo de estrutura tem um nome próprio que é o nome do vetor seguido do seletor – Nome. Da. Variável. Vetor[ Seletor ]
array’s, individualizando valores: X [ Expressão ] onde: X nome da variável do tipo array Expressão seletor, pois define qual o elemento da estrutura que está sendo referenciado. Atenção: deve ser um valor pertencente ao intervalo do índice da variável. Observação: Os elementos de um vetor tem todas as características de uma variável comum e podem aparecer livremente em expressões e atribuições. A[10] : = A[1] * A[i + j] + A[(i * A[3])];
Exemplo de vetor (array) var A: array[1. . 10] of integer; begin A[1] A[2] A[3] A[4] A[5] end. : = : = : = 17; 33; 21; 67; 81; A[6] : = 10; A[7] : = 45; A[8] : = 29; A[9] : = 79; A[10] : = 98; A[ ? ] 1 2 3 4 5 6 7 8 9 10 17 33 21 67 81 10 45 29 79 98
Exemplo de vetor (array) var Corinthians: array[1. . 11] of string; begin Corinthians[1] : = 'Dida'; Corinthians[2] : = 'Daniel'; Corinthians[3] : = 'Fábio Luciano'; Corinthians[4] : = 'Adilson'; Corinthians[5] : = 'Vampeta'; Corinthians[6] : = 'Kleber'; Corinthians[7] : = 'Marcelinho Carioca'; Corinthians[8] : = 'Edu'; Corinthians[9] : = 'Luizão'; Corinthians[10] : = 'Edilson'; Corinthians[11] : = 'Ricardinho'; end.
1 Dida 2 Daniel 3 Fábio Luciano 4 Adilson Representação interna do vetor: 5 Vampeta 6 Kleber Corinthians[ ? ] 7 Marcelinho Carioca 8 Edu 9 Luizão 10 Edilson 11 Ricardinho
Vetores multidimensionais • vetor com duas dimensões = matriz – tabela de linhas e colunas – armazenam vetores dentro de vetores • matematicamente, representam as matrizes ( Ai, j ) var i, j : integer; A : array[1. . 2, 1. . 4] of string; coluna begin linha for i : = 1 to 2 do for j : = 1 to 4 do readln(A[i, j]); end.
Exemplo de vetor bidimensional (array) var A: array[1. . 2, 1. . 4] of integer; begin A[1, end. 1] 2] 3] 4] : = : = 17; 33; 21; 15; 1 A[ ? , ! ] A[2, 2 3 4 1 17 33 21 15 2 13 81 97 67 ? , linha 1] 2] 3] 4] : = : = 13; 81; 97; 67; !, coluna
Registro (record): Considere que seja informado o nome de um aluno e suas quatro notas bimestrais que deverão ser agrupadas em uma mesma estrutura. Cadastro de Notas Escolares Nome. . : _____________ Primeira Nota. : Segunda Nota. . : Terceira Nota. : Quarta Nota. . . : ________ Layout de um registro de aluno formado pelos campos: Nome, Primeira Nota, Segunda Nota, Terceira Nota e Quarta Nota.
Definições de registro (record) • representa um conjunto de valores logicamente relacionados, que podem ser de tipos diferentes (estrutura hetorogênea) • junção ou composição de tipos em um tipo composto • conjunto de informações agrupadas e relacionadas entre si • agrupamento de variáveis, não necessariamente do mesmo tipo, que guardam estreita relação lógica
record’s, características básicas • contém um número fixo de elementos chamados de campos • os campos podem ser de tipos diferentes (estrutura heterogênea) • cada campo tem um nome próprio chamado de “identificador de campo” • campo = unidade de registro
Exemplos de registros/ campos • Registros = informações do cadastro e Campos = informações do registro – os clientes de uma empresa • nome, endereço, e-mail, contato, . . . – os assinantes da lista telefônica • nome, telefone, endereço – os alunos da disciplina de Algoritmos • matrícula, nome, faltas, notas bimestrais, situação
Como declarar registros (record): Na estrutura da linguagem pascal, os tipos registro devem ser declarados antes das definições das variáveis na cláusula type, conforme a seguinte sintaxe: type <Identificador> = record <lista dos campos e seus tipos>; end; var <variável> : <Identificador>; onde: Identificador: nome do tipo registro criado, seguindo as mesmas regras para definição de nomes. lista dos campos e seu tipos: relação das variáveis que serão usadas como campos, bem como os seus tipos, podendo ser qualquer tipo existente no Pascal (integer, real, boolean, string, . . . ). variável: variável do tipo registro de acordo com um identificador de registro definido anteriormente
Lista dos campos e seus tipos: type <Identificador> = record <Campo 1> : <Tipo 1>; <Campo 2> : <Tipo 2>; . . . <Campo. N> : <Tipo. N>; end; var <variável> : <Identificador>; onde: Campo 1, Campo 2, . . . , Campo. N: representam nomes associados a cada campo do registro; Tipo 1, Tipo 2, . . . , Tipo. N: representam qualquer um dos tipos básicos ou tipo anteriormente definido.
Tomando como exemplo a proposta de se criar um registro denominado Rg. Aluno, cujos campos são Nome, Nota 1, Nota 2, Nota 3 e Nota 4, este seria assim declarado em Pascal: type Rg. Aluno = record Nome Nota 1 Nota 2 Nota 3 Nota 4 end; : : : string[35]; real; var Aluno: Rg. Aluno; Este exemplo corresponde à definição de um modelo de um registro (Rg. Aluno) e à criação de uma área de memória chamada Aluno, capaz de conter cinco subdivisões, ou campos: Nome, Nota 1, Nota 2, Nota 3 e Nota 4.
Para utilizar um campo específico do registro, deve-se diferenciar esse campo. Para tal utiliza-se o caracter “. ” (ponto) p/ estabelecer a separação do nome do registro do nome do campo. type Rg. Data = record Dia : byte; Mes : byte; Ano : integer; end; var Nascimento : Rg. Data; begin Nascimento. Dia : = 30; Nascimento. Mes : = 11; Nascimento. Ano : = 1965; end. para denotar tipos estruturados registro (record)
Instrução para abreviação (with - do): Abrevia o nome do registro freqüentemente referenciado em um conjunto de instruções. with <Palavra> do <Instruções>; onde: Palavra: instruções: nome da variável registro a ser abreviada. relação de instruções (begin end)que serão atingidas pela instrução de abreviação. Isto significa, sempre que o compilador que se trata de um registro ele usará a palavra abreviada para formar a instrução.
instrução para abreviação (with - do): with Palavra do Comando; type Data = record Dia : byte; Mes : byte; Ano : integer; end; var Nascimento : Data; begin with Nascimento begin Dia : = 30; Mes : = 11; Ano : = 1965; end. do { ou seja, { Nascimento. Dia : = 30; { Nascimento. Mes : = 11; { Nascimento. Ano : = 1965; } }
Definições e Conceitos Os conceitos de tabelas de memória através da utilização de vetores (array’s) e o conceito de utilização do tipo definido registro (record), formam a base para a utilização de um arquivo, pois um arquivo é na verdade uma tabela de informações gravada em um meio físico. Enquanto os vetores são tabelas manipuladas na memória RAM. Os vetores são manipulados através de um ou mais índices de controle enquanto os arquivos são manipulados por um ponteiro de registro. Array + Record = File
ESTRUTURA INTERNA DA TABELA (OU ARQUIVO) ponteiro de registro 0 R 1 1 R 2 2 R 3 . . . N-1 RN posição física do registros do arquivo marca de final de arquivo (End Of File)
Vantagens na Utilização de Arquivos • armazenamento em meios magnéticos – as informações são gravadas permanentemente em meio físico (memória secundária: disquete, HD, fitas magnéticas entre outros) • maior capacidade de armazenamento – armazena um número grande de registros, estando apenas limitado ao tamanho do meio físico utilizado para a sua gravação
Arquivos A memória principal do microcomputador é volátil, não permitindo que as informações fiquem armazenadas permanentemente, pois se o micro for desligado, as informações armazenadas são apagadas e se perdem. O mesmo ocorre com as tabelas (array's) criadas na memória do microcomputador: se acontecer algum problema com o micro durante a execução de um programa que cria ou modifica uma tabela, as informações contidas nesta tabela serão perdidas. A solução para este tipo de problema é utilizar uma estrutura de dados que permita a gravação de informações em dispositivos de memória secundária (disquete, HD, . . . ). No PASCAL a estrutura de dados que guarda informações em disco é chamada de ARQUIVO (FILE OF).
Definição de um Arquivo em PASCAL VAR <arquivo_texto> <arquivo_de_dados> onde: <arquivo_texto> : TEXTFILE; { ou } : FILE OF <tipo>; : arquivo seqüencial de caracteres (sem formatação), tipo texto (txt) <arquivo_de_dados> : arquivo com registros de um determinado tipo <tipo> : tipo dos elementos (registros) do arquivo (integer, char, real, string e principalmente record);
Definição do Arquivo “Pessoas. dat” type Rg. Pessoa = record St Nome Sexo Idade end; var : char; : string[35]; : char; : integer; Pessoas: file of Rg. Pessoa; Obs. O campo St é um campo lógico acrescentado para indicar a situação do componente (registro) no arquivo: L- a posição do arquivo está livre X- a posição está ocupada por um registro *- a posição está ocupada por um registro excluído (apagado)
Operações sobre Arquivos de Dados (FILE OF) Os comandos apresentados a seguir descrevem procedimentos disponíveis para manipulação (abertura, leitura ou escrita e fechamento) de arquivos. onde: Arq. Var- representa a variável arquivo (nome interno) Nom. Arq- é o nome do arquivo contido no diretório do disco (nome externo). Assign. File(Arq. Var, Nom. Arq); Rewrite(Arq. Var); Reset(Arq. Var); Flush(Arq. Var); Erase(Arq. Var); Read(Arq. Var, Var. Reg); Write(Arq. Var, Var. Reg); Seek(Arq. Var, Pos. Reg); Close. File(Arq. Var); Rename(Arq. Var, Nom. Arq);
Assign. File(Arq. Var, Nom. Arq); Associa um nome lógico de arquivo (Arq. Var) ao arquivo físico (Nom. Arq). Rewrite(Arq. Var); Cria novo arquivo em disco com o nome atribuído à variável Arq. Var. Reset(Arq. Var); Prepara um arquivo existente para processamento, disponível para leitura e escrita, e coloca o ponteiro de arquivo no início. Read(Arq. Var, Var. Reg); Lê um componente (registro) de um arquivo em disco, denotado por Arq. Var, transferindo-o para memória e avança o ponteiro do arquivo para o próximo componente.
Write(Arq. Var, Var. Reg); Grava no arquivo em disco, denotado por Arq. Var, o componente indicado por Var. Reg, e avança o ponteiro do arquivo para o próximo componente (registro). Seek(Arq. Var, Pos. Reg); Move o ponteiro do arquivo em disco, para a posição indicada por Pos. Reg. Close. File(Arq. Var); Fecha o arquivo em disco indicado por Arq. Var e o diretório do disco é atualizado.
Funções Padrão Aplicadas a Arquivos de Dados EOF(Arq. Var) É uma função lógica que retorna True (verdadeiro) caso o ponteiro do arquivo indicado por Arq. Var esteja no fim do arquivo, caso contrário, ela retorna False (falso). FILEPOS(Arq. Var) Retorna a posição corrente do ponteiro do arquivo indicado por Arq. Var. A posição do primeiro registro no arquivo é 0 (zero). FILESIZE(Arq. Var) Retorna o número de componentes (registros) do arquivo em disco indicado por Arq. Var. Ou seja, retorna com o tamanho do arquivo. Caso o arquivo esteja vazio a função retorna com o valor 0 (zero).
Utilizando Arquivos Antes da utilização de um arquivo o procedimento Assign. File deve ser chamado para atribuí-lo a uma variável do tipo arquivo. Antes de qualquer operação de entrada e saída (leitura ou gravação), o arquivo deve ser aberto utilizando uma das funções: Rewrite (cria) ou Reset (prepara). Após estas instruções o ponteiro do arquivo apontará para a posição 0 (zero), que indica a primeira posição do arquivo. Após realizar qualquer operação com o arquivo deve-se então fechar o arquivo através do procedimento Close. File, que atualiza o diretório para a próxima operação de entrada e saída.
{ Este trecho de programa lê um arquivo do primeiro registro até o último (marca de final de arquivo- EOF). } begin assignfile(Arq. Var, 'arquivo. dat'); lê os registros enquanto reset(Arq. Var); não for final de arquivo while not(eof(Arq. Var)) do begin read(Arq. Var, Var. Reg); . . . { operações com o registro lido } end; closefile(Arq. Var); end.
Verificando a Existência do Arquivo no Disco Um arquivo somente poderá ser aberto caso ele exista no diretório do disco. Na tentativa de abrir (instrução Reset) um arquivo que não existe, ocorrerá um erro em tempo de execução. A solução, para este tipo de problema, passaria pela verificação da existência ou não do arquivo através da diretiva de compilação para checagem de erros de entrada/ saída: {$I-} e {$I+}. A diretiva de compilação I, quando ativa: {$I+}, todas as operações de entrada e saída são checadas para erros de execução. Quando passiva: {$I-}, a responsabilidade é do programador, o qual pode se utilizar da função padrão IOResult que conterá um código relativo à operação efetuada. Nota: IOResult=0, operação de entrada ou saída realizada com sucesso.
{ Este trecho de programa verifica a existência ou não do arquivo em disco "Pessoas. dat". Se o arquivo não existe no diretório do disco então ele é criado (Rewrite), caso contrário, ele é aberto (Reset). } var Pessoas: file of Rg. Pessoa; begin Assign. File(Pessoas, 'Pessoas. dat'); {$I-} Reset(Pessoas); {$I+} if IOResult = 2 then begin writeln('Arquivo não existe e será criado !'); Rewrite(Pessoas); end else writeln('Arquivo foi aberto com sucesso. '); end.
Arquivos do Tipo Texto (TEXTFILE) Diferente de todos outros tipos de arquivo, um arquivo texto não é uma seqüência de registros de mesmo tipo. Embora os componentes básicos de um arquivo texto sejam caracteres, os quais são estruturados em linhas, sendo que cada linha é terminada por uma marca de fim-de-linha 1. Como o tamanho de cada linha pode ser variável, a posição de cada linha dentro do texto não pode ser calculada. Obs. Um arquivo texto só pode ser processado seqüencialmente e não se pode fazer operações de leitura e gravação simultaneamente. 1 Seqüência CR/LF, Carriege Return (equivale ao efeito da tecla ENTER) e Line Feed (movimento do ponteiro de registro para a próxima linha).
Operações sobre Arquivos Texto (1/2) Uma variável do tipo texto é declarada fazendo-se referência ao identificador padrão TEXTFILE. As operações subsequentes sobre o arquivo devem ser precedidas por uma chamada ao procedimento Assign. File e as operações de entrada e saída devem ser precedidas da chamada de Reset ou Rewrite/ Append.
Operações sobre Arquivos Texto (2/2) onde: Arq. Var Ch Linha - representa a variável arquivo (nome interno) - representa a variável tipo char. - representa a variável tipo string. Instruções Funções ---------------------------------Append(Arq. Var); EOF(Arq. Var) Read(Arq. Var, Ch); EOLN(Arq. Var) Readln(Arq. Var, Linha); Write(Arq. Var, Ch); Writeln(Arq. Var, Linha);
APPEND(Arq. Var); Abre um arquivo texto existente para estendê-lo (saídas adicionais). Arq. Var, identifica o arquivo a ser estendido. Nota: As instruções Reset (abre) e Rewrite (cria) também funcionam para arquivos do tipo texto. A instrução Seek e as funções File. Size e File. Pos não se aplicam para arquivos do tipo texto.
READ(Arq. Var, Ch); Lê um caracter no arquivo texto indicado por Arq. Var. Onde: Ch = identificador tipo caracter “char”. READLN(Arq. Var, Linha); Lê uma linha do arquivo indicado por Arq. Var e posiciona p/ ler a próxima linha. Uma linha é seqüência de caracteres terminada pela marca de fim-de-linha (CR/LF). Onde: Linha = identificador do tipo cadeia de caracteres “string”. WRITE(Arq. Var, Ch); Grava um caracter no arquivo texto indicado por Arq. Var. WRITELN(Arq. Var, Linha); Grava uma linha e coloca a marca de fim-de-linha no arquivo.
Funções Padrão Aplicadas a Arquivos Texto EOF(Arq. Var) Função lógica que retorna True caso o ponteiro do arquivo indique a leitura da marca de fim-de-arquivo, caso contrário, a função retorna False (falso). EOLN(Arq. Var) Função lógica que retorna True se é final de linha, ou seja, se o ponteiro do arquivo indica a leitura da marca de fim-de-linha (CR/LF). Caso contrário, a função retorna False (falso).
{ Este programa lê um arquivo texto em disco, caracter por caracter- usando a instrução read(Arq. Var, Ch), exibindo os caracteres lidos no video do computador. } program Operacoes_com_Arquivo_Texto; uses crt; var Ch: char; Txt: TEXT; { definição do arquivo tipo texto } begin clrscr; Assign(Txt, ’Musica. Txt'); Reset(Txt); while not Eof(Txt) do { lê o arquivo até o final } begin while not Eoln(Txt) do { lê uma linha completa do arquivo } begin Read(Txt, Ch); { lê um caracter do texto } write(Ch); delay(50); end; writeln; Readln(Txt); { posiciona na próxima linha do texto } end; Close(Txt); repeat until keypressed; end.
Através da Ajuda do Delphi é possível obter uma lista com as rotinas de Input / Output.
- Slides: 48