Registos em Ficheiros - Estruturas. Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2009/2010

Documentos relacionados
Tarefa Orientada 13 Agrupamento e sumário de dados

Processamento de Texto. Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2006/2007

Fundamentos de Programação. Turma CI-240-EST. Josiney de Souza.

Aluísio Eustáquio da Silva

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA INTRODUÇÃO À ORGANIZAÇÃO DE COMPUTADORES

Guia de Estudo Folha de Cálculo Microsoft Excel

Algoritmos e Programação Estruturada

Javascript 101. Parte 2

Planeamento de um Posto de Abastecimento de Combustível

Aula de JavaScript 05/03/10

Os objetivos indicados aplicam-se a duas linguagens de programação: C e PHP

Linguagem C Tipos de Dados. void; escalares; sizeof Vectores; strings em C Estruturas Introdução ao pré-processador

Vectores e Matrizes Aplicações à Engenharia. Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2010/2011

Curso: Técnico de Informática Disciplina: Redes de Computadores. 1- Apresentação Binária

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

Geração de código intermediário. Novembro 2006

INF 1005 Programação I

1. NÍVEL CONVENCIONAL DE MÁQUINA

Bases de Dados. O ficheiro create-bank.sql contém um conjunto de instruções SQL para criar a base de dados de exemplo ilustrada na figura 1.

PROGRAMAÇÃO DE MICROPROCESSADORES 2011 / 2012

O que é o JavaScript?

Conjunto de instruções do CPU. Arquitectura de um computador. Definição das instruções (1) Definição das instruções (2)

Curso de Iniciação ao Access Basic (I) CONTEÚDOS

Estrutura de Dados Básica

Trabalhos Práticos. Programação II Curso: Engª Electrotécnica - Electrónica e Computadores

Licenciatura em Engenharia Informática Departamento de Engenharia Informática Instituto Superior de Engenharia do Porto

Tarefa Orientada 12 Junção Externa, Auto-Junção e União

AMBIENTE DE PROGRAMAÇÃO PYTHON

Estruturas II UFOP 1/1

Armazenamento de Dados. Prof. Antonio Almeida de Barros Junior

Figura 1 - O computador

Tarefa Orientada 16 Vistas

Criando um script simples

Algoritmos e Programação _ Departamento de Informática

COMPETÊNCIAS BÁSICAS EM TIC NAS EB1

Hugo Pedro Proença, 2007

CONCEITOS BÁSICOS PARA A CONSTRUÇÃO DE ALGORITMOS PARA COMPUTADORES. Isac Aguiar isacaguiar.com.br isacaguiar@gmail.com

OPERADORES E ESTRUTURAS DE CONTROLE

L 276/4 PT Jornal Oficial da União Europeia. DECISÃO N. o 190. de 18 de Junho de 2003

Base de dados I. Uma base de dados é um simples repositório de informação relacionado com um determinado assunto ou finalidade

Linguagem C: Estruturas de Controle. Prof. Leonardo Barreto Campos 1

Java Mail Server. Manual do Utilizador

Aula teórica 3. Tema 3.Computadores e linguagens Linguagens de Programação Compilação e linkagem LP Java. Preparado por eng.

Edwar Saliba Júnior. Dicas, Comandos e Exemplos Comparativos entre Linguagem Algorítmica e Linguagem C / C++

MANUAL DO UTILIZADOR

Estrutura de Dados. Introdução a Ponteiros. Prof. Gerson Borges Estrutura de Dados I 1

Python: Comandos Básicos. Claudio Esperança

Um compilador é um programa que lê um programa escrito numa dada linguagem, a linguagem objecto (fonte), e a traduz num programa equivalente

Bacharelado em Ciência e Tecnologia Processamento da Informação. Equivalência Portugol Java. Linguagem Java

Programação 2ºSemestre MEEC /2011. Programação 2º Semestre 2010/2011 Enunciado do projecto

Algoritmos e Programação (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br

Algoritmos e Programação

Informática de Gestão 1º ano / 1º semestre Ano letivo: 2014/2015. Visual Basic VBA

INTRODUÇÃO À LINGUAGEM C++

Usando o Excel ESTATÍSTICA. A Janela do Excel Barra de título. Barra de menus. Barra de ferramentas padrão e de formatação.

Tarefa Orientada 14 Subconsultas

Algoritmo. Linguagem natural: o Ambígua o Imprecisa o Incompleta. Pseudocódigo: o Portugol (livro texto) o Visualg (linguagem) Fluxograma

Microsoft Access INTRODUÇÃO. Sumário INTRODUÇÃO INTRODUÇÃO INTRODUÇÃO INTRODUÇÃO. O que é Banco de Dados?

Informática I. Aula 6. Aula 6-12/09/2007 1

SISTEMA DA NOTA FISCAL PAULISTANA

MC102 Algoritmos e programação de computadores Aula 3: Variáveis

Figure 2 - Nós folhas de uma árvore binária representando caracteres ASCII

ALGORITMOS PARTE 01. Fabricio de Sousa Pinto

INTRODUÇÃO ÀS LINGUAGENS DE PROGRAMAÇÃO

1 Resumo: Strings e vetores de caracteres. Departamento de Ciência da Computação IME/USP

Algoritmos e Estruturas de Dados I 01/2013. Estruturas Condicionais e de Repetição (parte 2) Pedro O.S. Vaz de Melo

Prova de Aferição de Matemática

Como enviar e receber correio eletrónico utilizando o Gmail

O código JavaScript deve ser colocado entre tags de comentário para ficar escondido no caso de navegadores antigos que não reconhecem a linguagem.

20 Caracteres - Tipo char

Nota técnica nº 1 Importar mapas de quantidades em Excel

Unidade 5: Sistemas de Representação

No final desta sessão o formando deverá ser capaz de aceder ao Word e iniciar um novo documento.

Introdução aos Algoritmos e Estruturas de Dados 2011/2012

Tarefa Orientada 11 Junção Interna

Programação de Computadores

Conceitos básicos da linguagem C

Comandos Sequenciais if else, e Switch

[RÓTULO:] MNEMÔNICO [OPERANDOS] [;COMENTÁRIO]

JSP - ORIENTADO A OBJETOS

Ambientes de exemplo do Comunicar com Símbolos

5 - Vetores e Matrizes Linguagem C CAPÍTULO 5 VETORES E MATRIZES

Manual de Administração Intranet BNI

Programação WEB I Estruturas de controle e repetição

2 echo "PHP e outros.";

Conceitos Importantes:

Introdução às Linguagens de Programação

Akropole Catequista. Todos os Ficheiros no Akropole Catequista trabalham com uma simples barra de edição, com 4 botões:

Guia para a declaração de despesas no Programa SUDOE

Aula 4 Pseudocódigo Tipos de Dados, Expressões e Variáveis

Aula 01 - Formatações prontas e condicionais. Aula 01 - Formatações prontas e condicionais. Sumário. Formatar como Tabela

A lógica de programação ajuda a facilitar o desenvolvimento dos futuros programas que você desenvolverá.

estiglp-11/ csharp e Fsharp 1 Relatório Linguagens de programação 11/12 João Caixinha nº5946

ECD1200 Equipamento de Consulta de Dados KIT DE DESENVOLVIMENTO

Orientação a Objetos

Introdução. Manipulação de arquivos em C. Estrutura de Dados II Prof Jairo Francisco de Souza

Faculdade de Ciências da Universidade de Lisboa CURSO DE GPS. Módulo x. (Aula Prática) Reliance - Ashtech. Suas Aplicações Em SIG.

Transcrição:

Registos em Ficheiros - Estruturas Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2009/2010 4 Maio 2011 Registos em Ficheiros - Estruturas 1

Leitura de Ficheiros Texto Muitos ficheiros apresentam informação na base de texto, pelo que a sua leitura pode ser feita quer através do formato caracter (%) quer através do formato string (%s). O formato caracter lê todos os caracteres do ficheiro, nomeadamente os caracteres de controle como os tabs e mudanças de linha. A função ler_texto lê o texto do ficheiro file_in e retorna-o na string txt: function txt = ler_chars(fname); [fid,msg] = fopen(fname,"r"); txt= ""; while!feof(fid) [wrd,count] = fscanf(fid,"%c","c"); txt = [txt,wrd]; endwhile; endfunction; 4 Maio 2011 Registos em Ficheiros - Estruturas 2

Leitura de Ficheiros Texto O formato string permite separar todas as palavras, nomeadamente criando uma matriz cujas linhas correspondem às palavras do texto (completadas por espaços). De notar que os separadores de palavras correspondem aos espaços e aos caracteres de controle, não incluindo os caracteres de pontuação habitualmente considerados numa linguagem natural (pontos, vírgulas,...). Notar ainda que os caracteres de mudança de linha não são retornados A função ler_palavras lê o texto do ficheiro fname e retorna-o na matriz txt: function txt = ler_palavras(fname); [fid,msg] = fopen(fname,"r"); txt= ""; while!feof(fid) [wrd,count] = fscanf(fid,"%s","c"); txt = [txt;wrd]; endwhile; fclose(fid); endfunction; 4 Maio 2011 Registos em Ficheiros - Estruturas 3

Leitura de Ficheiros Texto Finalmente, os ficheiros podem ser lidos linha a linha, com a instrução fgetl. Esta instrução lê uma string de um ficheiro até ao caracter mudança de linha ( \n ), não se detendo em espaços ou outros caracteres de controle como os tabs. De notar o tratamento de linhas brancas : linhas apenas com espaços são retornadas, embora as linhas sem caracteres o sejam. A função ler_linhas lê o texto do ficheiro fname e retorna-o na matriz txt, linha a linha: function txt = ler_linhas(fname); [fid,msg] = fopen(fname,"r"); txt= ""; while!feof(fid) line = fgetl(fid); txt = [txt;line]; endwhile; endfunction; 4 Maio 2011 Registos em Ficheiros - Estruturas 4

Registos em Ficheiros Muita informação alfanumérica está registada em ficheiros, na forma de registos. Por exemplo, numa base de dados da empresa, são mantidos ficheiros com informação sobre os empregados da empresa. Muitas aplicações (de gestão) consistem em ler ficheiros e criar outros com a informação devidamente processada. Por exemplo: ler um ficheiro de empregados e escrever outro, apenas com os empregados com vencimento superior a 1000. cod nome vencimento data 610 Paulo Fernandes Lopes 2341.36 15/04/1996 825 Pedro Vieira 989.24 25/06/1999 316 Marta Costa Martins 1389.17 05/01/1992 34 Rui Vasco Pereira 5310.32 15/04/1996 723 Jorge Barata 767.26 03/09/2002 4 Maio 2011 Registos em Ficheiros - Estruturas 5

Estruturas Embora Vectores e Matrizes sejam muito úteis quando os dados são todos do mesmo tipo (no Octave, de qualquer tipo numérico), nestes casos, a informação que se pretende agrupar com um só identificador não é do mesmo tipo. Neste caso, a informação referente a cada empregado da empresa deve conter os seguintes itens: Um código (tipicamente um número inteiro) Um nome (uma cadeia de caracteres) Um vencimento (um decimal) Uma data de entrada (uma cadeia, ou 3 campos numéricos, para o dia, mês e ano) cod nome venc data 610 Paulo Fernandes Lopes 2341.36 15/04/1996 4 Maio 2011 Registos em Ficheiros - Estruturas 6

Estruturas As várias linguagens de programação permitem o agrupamento destes dados heterogéneos, com um mesmo identificador de uma forma variada (records no Pascal, Struct em C,...) O Octave adopta uma designação semelhante à do C, denominando estes agrupamentos como estruturas. Consideremos pois o caso do empregado abaixo, em que gostaríamos de agregar toda a informação numa única variável, do tipo estrutura, que denotaremos como emp. cod nome venc data 610 Paulo Fernandes Lopes 2341.36 15/04/1996 4 Maio 2011 Registos em Ficheiros - Estruturas 7

Estruturas Uma vez definidos os nomes dos campos da estrutura, podemos atribuir-lhe os valores pretendidos. O acesso a um campo da estrutura é feito fazendo suceder ao nome da estrutura o nome do campo pretendido, separado por um ponto (. ). Por exemplo, a atribuição dos 4 valores dos campos pode ser feita pelas seguintes atribuições: emp.cod = 610; emp.nome = Paulo Fernandes Lopes ; emp.venc = 2341.36; emp.data= 15/04/1996 ; emp = cod nome venc data 610 Paulo Fernandes Lopes 2341.36 15/04/1996 4 Maio 2011 Registos em Ficheiros - Estruturas 8

Estruturas Uma vez agrupados os vários items de informação numa só variável do tipo estrutura, podemos referir alguns campos depois de verificar outros. Por exemplo, dados vários empregados com o tipo referido, indicar qual o nome dos que ganham mais de 1000 euros. Na sintaxe do Octave, tal poderia ser feito através da instrução condicional if emp.venc > 1000 then disp(emp.nome) endif No entanto este tipo de processamento só é verdadeiramente útil se tivermos a possibilidade de aceder a todos os empregados de uma forma genérica. 4 Maio 2011 Registos em Ficheiros - Estruturas 9

Por exemplo, se tivessemos uma tabela com várias linhas, com códigos na primeira coluna e vencimentos na 2ª coluna, poderíamos apresentar os códigos dos empregados com vencimento superior a 1000 euros através da seguinte instrução iterativa: for i = 1:n if tabela(i,2) > 1000 disp(tabela(i,1)) endif endfor; Por analogia, o que é necessário é poder aceder a uma sequência de (1 a n) estruturas do tipo da do empregado. Tabelas 1 2 1 610 2341.36 2 825 989.24 3 316 1389.17 4 34 5310.32 5 723 767.26......... Na maioria das linguagens de programação, essa analogia é imediata, já que se podem especificar vectores de estruturas. Tal é o caso do Octave, mas apenas a partir da versão 3.X (as anteriores usavam o conceito de lista, entretanto descontinuado). 4 Maio 2011 Registos em Ficheiros - Estruturas 10

Nestas linguagens, podemos representar o conjunto de empregados através de um vector, emps, em que cada elemento é uma estrutura (de empregado) com os campos definidos como anteriormente. Vectores de Estruturas ind cod nome vencimento data 1 610 Paulo Fernandes Lopes 2341.36 15/04/1996 2 825 Pedro Vieira 989.24 25/06/1999 3 316 Marta Costa Martins 1389.17 05/01/1992 4 34 Rui Vasco Pereira 5310.32 15/04/1996 5 723 Jorge Barata 767.26 03/09/2002 Agora, para obter os códigos dos empregados com vencimento superior a 1000 euros bastará usar uma seguinte instrução iterativa, análoga à anterior for i = 1:n if emps(i).vencimento > 1000 disp(emps(i).nome) endif endfor; for i = 1:n if tabela(i,2) > 1000 disp(tabela(i,1)) endif endfor; 4 Maio 2011 Registos em Ficheiros - Estruturas 11

Registos em Ficheiros Sendo os registo geralmente guardados em ficheiros texto, há que saber ler esta informação, para as estruturas adequadas.. Apesar de, tipicamente, existirem (pelo menos) duas formas de armazenamento dessas sequências, a leitura de ficheiros e empregados pode ser feito de uma forma genérica. Na função genérica abaixo, o parâmetro mode é passado para a função ler_emp/ 2, que depende do formato de armazenamento utilizado. function Emps = ler_emps(fname, mode); [fid, msg] = fopen(fname, "r"); i = 0; [emp, ok] = ler_emp(fid, mode); while ok i = i+1; Emps(i) = emp; [emp, ok] = ler_emp(fid, mode); endwhile; fclose(fid); endfunction; 4 Maio 2011 Registos em Ficheiros - Estruturas 12

Registos em Ficheiros Para ler cada registo, há que saber a forma como são codificadas essas sequências. Tipicamente, existem duas formas de armazenamento dessas sequências: Comprimento Fixo: As sequências têm sempre o mesmo número de caracteres (sendo usados espaços se necessário); Comprimento Variável: As sequências têm o número de caracteres necessários, sendo necessários caracteres separadores, tipicamente tabs (horizontais). cod nome vencimento data 610 Paulo Fernandes Lopes 2341.36 15/04/1996 825 Pedro Vieira 989.24 25/06/1999 316 Marta Costa Martins 1389.17 05/01/1992 34 Rui Vasco Pereira 5310.32 15/04/1996 723 Jorge Barata 767.26 03/09/2002 4 Maio 2011 Registos em Ficheiros - Estruturas 13

Registos em Ficheiros Por exemplo, o nome Pedro Vieira, no ficheiro abaixo, pode ser codificado Comprimento Fixo: Com 5+1+6 = 12 caracteres (incluindo o espaço), mais 13 espaços, para permitir sequências de comprimento 25, que podem armazenar nomes com até 25 caracteres (incluindo espaços); Comprimento Variável: Apenas com os 12 caracteres necessários, sendo separado do vencimento por um tab horizontal ( \t ). cod nome vencimento data 610 Paulo Fernandes Lopes 2341.36 15/04/1996 825 Pedro Vieira 989.24 25/06/1999 316 Marta Costa Martins 1389.17 05/01/1992 34 Rui Vasco Pereira 5310.32 15/04/1996 723 Jorge Barata 767.26 03/09/2002 4 Maio 2011 Registos em Ficheiros - Estruturas 14

Registos em Ficheiros Em Octave (e em C) os dois tipos de codificação requerem instruções de leitura padronizada (com templates) diferentes. Comprimento Fixo: Utiliza-se um template %nc em que n é o número de caracteres a ler; Comprimento Variável: Utiliza-se um template %s ; Neste último caso, levanta-se um problema: o template %s, não lê espaços nem caracteres brancos. Assim, o nome Pedro Vieira seria lido não como 1, mas sim como 2 sequências, mas em geral, o número de nomes (próprios e apelidos) não é conhecido. Isto pode ser evitado com o uso de espaços especiais ( non break spaces - ASCII 160), que são considerados como quaisquer outros caracteres, mas impressos como espaços. Mas esta solução tem outros inconvenientes, nomeadamente obrigando a um tratamento especial na separação de palavras. 4 Maio 2011 Registos em Ficheiros - Estruturas 15

Leitura de Registos em Ficheiros Comprimento Variável: Neste caso, aconselha-se a leitura de um registo de cada vez (através da instrução fgetl/1) e obter os vários campos das linhas assim obtidas. A separação dos vários campos pode fazer-se pela instrução split/2, assumindose o caracter tab ( \t ) como separador dos campos. Obtem-se assim uma matriz de texto, em que cada campo aparece numa linha própria. Comprimento Fixo: Agora, todos os registos do ficheiro podem ser lidos com instruções de leitura padronizada, fscanf, usando-se os padrões apropriados. A função de leitura de um registo é apresentada de seguida em ambos os formatos de codificação, sendo de registar a diferente forma de identificar o fim do ficheiro (e um registo vazio). 4 Maio 2011 Registos em Ficheiros - Estruturas 16

Leitura de Registos em Ficheiros A função abaixo prevê os dois métodos de leitura, distinguindo-os pelo valor do parâmetro modo: 1/variável e 2/ fixo. De notar booleano ok para sinalizar se uma estrutura emp é de facto lida (e retornada) A inicialização de emp, para o caso de a leitura não se fazer (esta inicialização é opcional, mas evita mensagens de aviso que o parâmetro de saída emp não existe). function [emp,ok] = ler_emp(fid, mode); emp = ""; if mode == 1 % nomes com comprimento variável... else % nomes com comprimento fixo... endif endfunction; 4 Maio 2011 Registos em Ficheiros - Estruturas 17

No modo variável, a função Leitura de Registos em Ficheiros 1. lê uma linha de cada vez (caso já não exista, a função fgetl/1 retorna o valor -1); 2. converte-a numa matriz de caracteres L, partindo-a nos caracteres tab ( \t ) com a instrução split; 3. Atribui as linhsa da matriz aos respectivos campos, convertendo-as em números (instrução str2num) ou retirando os espaços fnais (instrução deblank).... if mode == 1 % nomes com comprimento variável line = fgetl(fid); ok = (line!= -1); if ok M = split(line,"\t"); emp.cod = str2num(m(1,:)); emp.nome = deblank(m(2,:)); emp.venc = str2num(m(3,:)); emp.data = deblank(m(4,:)); endif; endif;... 4 Maio 2011 Registos em Ficheiros - Estruturas 18

Leitura de Registos em Ficheiros No modo fixo, a função lê os quatro campos de uma só instrução fscanf. A separação dos campos é feita por tabs, excepto entre o nome e o vencimento. Neste caso, a separação é implícita, ao serem lidos exactamente 25 caracteres para o nome. De notar, que o booleano ok é verdadeiro sse os 4 campos forem lidos. function [emp,ok] = ler_emp(fid, mode); emp = ""; if mode == 1 % nomes com comprimento variável... else % nomes com comprimento fixo [emp.cod, emp.nome, emp.venc, emp.data, count] = fscanf(fid,"%i%25c%f%s","c"); ok = (count == 4); endif endfunction; 4 Maio 2011 Registos em Ficheiros - Estruturas 19

Eis a função completa: Leitura de Registos em Ficheiros function [emp,ok] = ler_emp(fid, mode); emp = ""; if mode == 1 % nomes com comprimento variável line = fgetl(fid); ok = (line!= -1); if ok M = split(line,"\t"); emp.cod = str2num(m(1,:)); emp.nome = deblank(m(2,:)); emp.venc = str2num(m(3,:)); emp.data = deblank(m(4,:)); endif; else % nomes com comprimento fixo [emp.cod, emp.nome, emp.venc, emp.data, count] = fscanf(fid,"%i%25c%f%s","c"); ok = (count == 4); endif endfunction; 4 Maio 2011 Registos em Ficheiros - Estruturas 20

Comprimento fixo: Escrita de Registos em Ficheiros A escrita de ficheiros depende igualmente do formato utilizado para as strings. Em comprimento fixo, um registo pode ser escrito como fprintf(fid, "%3i", cod); fprintf(fid, "%-25s", nome); fprintf(fid, "%7.2f", venc); fprintf(fid, "%10s\n", data); ou numa só instrução, como anteriormente. Notar ainda que 1. O sinal (em %-25s) justifica, à esquerda, o campo nome. 2. Após o último campo deve ser escrito um caracter ( \n ), para mudança de linha 610Paulo Fernandes Lopes 2341.3615/04/1996 4 Maio 2011 Registos em Ficheiros - Estruturas 21

Comprimento variável: Escrita de Registos em Ficheiros Neste caso o registo de um empregado pode ser escrito como fprintf(fid, "%i\t", cod); fprintf(fid, "%s\t", nome); fprintf(fid, %7.2f\t", venc); fprintf(fid, "%s\n", data); ou numa só instrução, como anteriormente. Notar agora que 1. Após cada campo, deve ser escrito o tab ( \t ) de separação, excepto no último campo, após o que se escreve o caracter ( \n ) 2. Alguns templates podem ser fixos, (por exemplo, "%7.2f ) para evitar as convenções por omissão do Octave. 610 Paulo Fernandes Lopes 2341.36 15/04/1996 4 Maio 2011 Registos em Ficheiros - Estruturas 22

Eis a função completa: Escrita de Registos em Ficheiros function [] = escreve_emps(emps,fname, mode); [fid, msg] = fopen(fname, "w"); if mode == 1 for i = 1:length(Emps) fprintf(fid, "%i\t", Emps(i).cod); fprintf(fid, "%s\t", Emps(i).nome); fprintf(fid, "%7.2f\t", Emps(i).venc); fprintf(fid, "%s\n", Emps(i).data); endfor; else for i = 1:length(Emps) fprintf(fid, %6i", Emps(i).cod); fprintf(fid, "%-25s", Emps(i).nome); fprintf(fid, %8.3f", Emps(i).venc); fprintf(fid, "%11s\n", Emps(i).data); endfor; endif; fclose(fid); endfunction; 4 Maio 2011 Registos em Ficheiros - Estruturas 23