18/19 de Maio de 2004Registos em Ficheiros1 Pedro Barahona DI/FCT/UNL Maio 2004.

Slides:



Advertisements
Apresentações semelhantes
Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 5.
Advertisements

Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 6.
Ludwig Krippahl, 2009 Programação para as Ciências Experimentais 2008/9 Teórica 4.
Introdução aos Computadores e à Programação DI-FCT-UNL-2005/2006 Introdução 1.1 Octave Cadeias e ficheiros.
27 Abril de 2006Recursividade e Iteração1 Processamento de Texto Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2005/2006.
Introdução aos Computadores e à Programação DI-FCT-UNL-2005/2006 Introdução 1.1 Octave Funções, Condições e Ciclos.
Entradas, Saídas e Análise de Dados Regressão Linear
Introdução aos Computadores e Programação DI-FCT-UNL-2003/2004 Programação 5.1 Octave Programação.
Ludwig Krippahl, 2008 Programação para as Ciências Experimentais 2007/8 Teórica 4.
Vectores (e Listas) : Pesquisa e Ordenação
17 Novembro 2006Algoritmos de Ordenação e Pesquisa Aplicação a Listas de Registos 1 Jorge Cruz DI/FCT/UNL Introdução aos Computadores e à Programação 1º
Introdução aos Computadores e à Programação DI-FCT-UNL-2006/2007 Ficheiros 5.1 Octave Ficheiros.
1 Funções Trajectória de Projéctil DI/FCT/UNL 1º Semestre 2004/2005.
Registos em Ficheiros - Estruturas Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2008/ Maio 20091Registos em.
Funções, Execução Condicional, Recursividade e Iteração
Recursividade e Iteração Factorial, Fibonacci e Maior Divisor Comum
11 de Maio de 2006Listas e Ordenação1 Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2005/2006.
17 Novembro 2005Leitura, Escrita e Processamento de Registos - Estruturas e Listas 1 Leitura, Escrita e Processamento de Registos Estruturas e Listas Jorge.
Processamento de Texto Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2008/ Maio 20081Processamento de Texto.
Entradas, Saídas e Análise de Dados Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/2008.
Miguel Maurício Introdução aos Computadores e Programação DI-FCT-UNL-2004/2005 Programação 5.1 Octave Programação.
Introdução aos Computadores e à Programação DI-FCT-UNL-2006/2007 Strings 4.1 Octave Strings.
Entradas, Saídas e Análise de Dados Leitura e Escrita de Ficheiros
1 Funções, Expressões e Excepções Trajectórias Óptimas DI/FCT/UNL 1º Semestre 2004/2005.
1 Processamento de Registos Listas e Estruturas DI/FCT/UNL 1º Semestre 2004/2005.
10 Novembro 2006Leitura, Escrita e Processamento de Registos - Estruturas e Listas 1 Leitura, Escrita e Processamento de Registos Estruturas e Listas Jorge.
Funções, Condições e Ciclos 3.1Introdução aos Computadores e à Programação DI-FCT-UNL-2006/2007 Octave Funções, Condições e Ciclos.
Introdução aos Computadores e à Programação
Pesquisa e Ordenação de Vectores
Introdução aos Computadores e Programação DI-FCT-UNL-2005/2006 Introdução 1.1 Octave Ficheiros (matrizes e registos)
5 de Maio de 2005Registos em Ficheiros1 Registos em Ficheiros - Estruturas Pedro Barahona DI/FCT/UNL Maio 2005.
2 de Junho de 2005Conclusão1 Pedro Barahona DI/FCT/UNL Junho 2005.
Registos em Ficheiros - Estruturas Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2007/ Maio 20081Registos em.
11 Novembro 2005Processamento de Texto1 Jorge Cruz DI/FCT/UNL Programação para as Ciências Experimentais 1º Semestre 2005/2006.
Caracteres, Cadeias (“Strings”) Registos em Ficheiros
Recursividade e Iteração (cont.) Processamento de Texto
Entradas, Saídas e Análise de Dados Regressão Linear
27 Abril 2007Processamento de Texto1 Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2006/2007.
Introdução aos Computadores e à Programação
Matrizes e Gráficos Trajectória de Projéctil Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 2º Semestre 2008/2009.
Prof. Luis Otavio Alvares
Prof: Erivelto Tschoeke, Msc. –
Tratamento de Ficheiros
PROGRAMAÇÃO ESTRUTURADA II
Ordenação e Pesquisa de Dados Marco Antonio Montebello Júnior
CADEIA DE CARACTERES (Strings)
Manipulação de Arquivos em C
Arquivos Continuação.
DAVID ANDERSON CARDOSO DANTAS
Recolha e Tratamento da Informação
Aula Prática 12 Operações com Arquivos Monitoria
20/21 Abril de 2004Funções, Expressões e Excepções1 Pedro Barahona DI/FCT/UNL Abril 2004.
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Introdução à programaçao em PERL Levi Lúcio, Vasco Amaral, Programação em PERL, FCA-Editora de Informática.
Capítulo V – Comandos de Entrada e Saída 5.1 – Equipamentos de entrada e saída 5.2 – Saída no vídeo-texto 5.3 – Entrada pelo teclado 5.4 – Entrada e saída.
Aula Prática 11 Operações com Arquivos Monitoria
Usando Perl para a extracção automática de informação a partir de corpus bruto / cru Tema 4A Pablo Gamallo Otero
Operações com Arquivos Monitoria A estrutura FILE  É como um tipo de dado, mas não é um tipo propriamente dito  Definido no arquivo cabeçalho.
Aula Prática 11 Operações com Arquivos Monitoria
11/12 de Maio de 2004Caracteres e cadeias1 Caracteres e Cadeias (“Strings”) Pedro Barahona DI/FCT/UNL Maio 2004.
Programação de Computadores I – Arquivos
Introdução aos Computadores e Programação DI-FCT-UNL-2003/2004
10 Novembro 2005Leitura e Escrita de Ficheiros Processamento de Texto 1 Jorge Cruz DI/FCT/UNL Introdução aos Computadores e à Programação 1º Semestre 2005/2006.
30 Novembro 2007Listas e Vectores: Pesquisa e Ordenação1 Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 1º Semestre 2007/2008.
20 de Abril de 2006Entradas, Saídas e Análise de Dados1 Pedro Barahona DI/FCT/UNL Introdução aos Computadoers e à Programação 2º Semestre 2005/2006.
23 Novembro 2007Registos em Ficheiros - Estruturas1 Pedro Barahona DI/FCT/UNL Introdução aos Computadores e à Programação 1º Semestre 2007/2008.
13/14 Abril de 2004Trajectória de um Projéctil1 Trajectória de Projéctil - Funções Pedro Barahona DI/FCT/UNL Março 2004.
Aula de Entrada / Saída Monitores: Alessandro Luna Leonardo Ribeiro Mardoqueu Vieira Mozart Araújo Filho.
Programação II Arquivos Autoria: Ernani Santos Modificação: Clebson Oliveira Adaptação: Claudia Boeres.
Fundamentos de Programação 1 Slides 18 Prof. SIMÃO Jean Marcelo SIMÃO Linguagem C “Arquivos Seqüências ou de Texto ”. 1.
Transcrição da apresentação:

18/19 de Maio de 2004Registos em Ficheiros1 Pedro Barahona DI/FCT/UNL Maio 2004

18/19 de Maio de 2004 Registos em Ficheiros 2 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 €.

18/19 de Maio de 2004 Registos em Ficheiros 3 Leitura de Ficheiros A primeira questão a resolver consiste no tratamento dos caracteres brancos em cadeias de caracteres. Isto porque há duas formas típicas de armazenamento dessas cadeias: –Comprimento Fixo: As cadeias têm sempre o mesmo número de caracteres (sendo usados espaços se necessário); –Comprimento Variável: As cadeias têm o número de caracteres necessários, sendo necessários caracteres separadores, tipicamente tabs (horizontais).

18/19 de Maio de 2004 Registos em Ficheiros 4 Leitura de Ficheiros Por exemplo, “Pedro Vieira” pode ser codificado –Comprimento Fixo: Com = 12 caracteres (incluindo o espaço), mais 13 espaços, para permitir cadeias 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 horozontal (‘\t’).

18/19 de Maio de 2004 Registos em Ficheiros 5 Leitura de 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ê nem caracteres brancos nem espaços. Assim, o nome “Pedro Vieira” seria lido não como 1, mas sim como 2 cadeias. Em geral, ter-se-ia de conhecer o número de nomes (próprios, apelidos e partículas de ligação). Isto pode ser evitado com o uso de espaços especiais (“non break spaces” - ASCII 160), que são lidos como quaisquer outros caracteres, mas são impressos como espaços.

18/19 de Maio de 2004 Registos em Ficheiros 6 Leitura de Ficheiros Caso seja necessário, pode converter-se um ficheiro noutro, convertendo-se todos os espaços em espaços especiais, com a função abaixo: function x = rem_sp(f_in_name, f_out_name); [f_in, msg] = fopen(f_in_name, "r"); [f_aux,msg] = fopen(f_out_name, "w"); [ch, count] = fscanf(f_in,"%1c","C"); while !feof(f_in) if ch == " " ch = setstr(160); endif; fprintf(f_aux, "%1c", ch); [ch, count] = fscanf(f_in,"%1c","C"); endwhile; fclose(f_in); fclose(f_aux); endfunction;

18/19 de Maio de 2004 Registos em Ficheiros 7 Leitura de Ficheiros Comprimento Fixo: Cada linha do ficheiro, assumindo-se que um nome é guardado com 25 caracteres, pode ser lida com as seguintes instruções de leitura padronizada, fscanf: [cod, count] = fscanf(fid,"%i","C"); [nome, count] = fscanf(fid,"%25c","C"); [venc, count] = fscanf(fid,"%f","C"); [data,count] = fscanf(fid,"%s","C"); ou numa só instrução [cod,nome,venc,data,count]=fscanf(fid,"%i%25c%f%s","C"); 610Paulo Fernandes Lopes /04/1996

18/19 de Maio de 2004 Registos em Ficheiros 8 Leitura de Ficheiros Comprimento Variável: Neste caso, quer o nome quer a data podem ser lidos com o template “%s” da instrução fscanf, podendo o registo de um empregado ser lido quer na forma [cod, count] = fscanf(fid,"%i","C"); [nome, count] = fscanf(fid,"%s","C"); [venc, count] = fscanf(fid,"%f","C"); [data,count] = fscanf(fid,"%s","C"); quer numa só instrução [cod,nome,venc,data,count]=fscanf(fid,"%i%s%f%s","C"); 610Paulo Fernandes Lopes /04/1996

18/19 de Maio de 2004 Registos em Ficheiros 9 Escrita de Ficheiros A escrita de ficheiros depende igualmente do formato utilizado para as strings. Em comprimento fixo, o registo pode ser escrito como fprintf(fid, "%3i", cod); fprintf(fid, "%-25s", nome); fprintf(fid, "%7.2f", venc); fprintf(fid, "%10s", data); fprintf(fid, "%c", “\n”); 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 /04/1996

18/19 de Maio de 2004 Registos em Ficheiros 10 Escrita de Ficheiros Em comprimento variável, 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, 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\t”) para evitar as convenções por omissão do Octave. 610Paulo Fernandes Lopes /04/1996

18/19 de Maio de 2004 Registos em Ficheiros 11 Selecção de Registos Podemos agora abordar o problema inicialmente colocado: ler um ficheiro de empregados e escrever outro, apenas com os empregados com vencimento superior a 1000 euros. Naturalmente o programa dependerá de os ficheiros serem lidos e escritos em formato fixo ou variável. Assumiremos que esta diferença apenas se reflectirá no campo “nome”, já que o campo “data” não contem espaços e pode ser lido em formato cadeia (“%s”) sem problema.

18/19 de Maio de 2004 Registos em Ficheiros 12 Selecção de Registos Eis a versão para formato fixo. [f_in, msg_in ] = fopen("empresa_in_fix.txt", "r"); [f_out, msg_out] = fopen("empresa_out_fix.txt", "w"); [cod,nome,venc,data,ct] = fscanf(f_in,"%i%25c%f%s","C"); while !feof(f_in) if venc > 1000 fprintf(f_out,"%3i%-25s%7.2f%c", cod,nome,venc,data); fprintf(f_out, "%c", "\n"); endif; [cod,nome,venc,data,ct] = fscanf(f_in,"%i%25c%f%s","C"); endwhile; fclose(f_in); fclose(f_out);

18/19 de Maio de 2004 Registos em Ficheiros 13 Selecção de Registos E eis a versão para formato variável. rem_sp("empresa_in_var.txt", "empresa_aux_var.txt"); [f_aux, msg] = fopen("empresa_aux_var.txt", "r"); [f_out, msg] = fopen("empresa_out_var.txt", "w"); [cod,nome, venc, data, count] = fscanf(f_aux,"%i%s%f%s","C"); while !feof(f_aux) if venc > 1000 fprintf(f_out, "%i\t%s\t%7.2f\t%s\n", cod,nome,venc,data); endif; [cod,nome, venc, data, count] = fscanf(f_aux,"%i%s%f%s","C"); endwhile; fclose(f_aux); fclose(f_out);

18/19 de Maio de 2004 Registos em Ficheiros 14 Processamento de Registos Podemos agora considerar outro tipo de processamento de informação, que não envolve necessariamente a escrita de novos ficheiros, correspondente a: –Cálculo de totais e médias (de vencimentos, por exemplo) –Determinação de máximos e mínimos (de vencimentos, ou antiguidades) Vamos ilustrar estes problemas com programas para determinação dos vencimentos totais e médios dos empregados da empresa, bem como da determinação do empregado mais antigo. Em ambos os casos apenas apresentamos a versão para formato variável. De notar a instrução printf, que permite escrever no terminal mensagens formatadas (com os formatos usados em ficheiros).

18/19 de Maio de 2004 Registos em Ficheiros 15 Processamento de Registos O tratamento de vencimentos utiliza um contador (variável i) de registos lidos e uma variável (total) para determinação do total dos vencimentos (sendo a média igual ao quociente total/i). rem_sp("empresa_in_var.txt", "empresa_aux_var.txt"); [f_aux, msg] = fopen("empresa_aux_var.txt", "r"); [f_out, msg] = fopen("empresa_out_var.txt", "w"); [cod,nome, venc, data, count] = fscanf(f_aux,"%i%s%f%s","C"); i = 0; total = 0; while !feof(f_aux) i = i+1; total = total +venc; [cod,nome, venc, data, count] = fscanf(f_aux,"%i%s%f%s","C"); endwhile; printf("o total dos vencimentos é de %7.2f \n", total); printf("a média dos vencimentos é de %7.2f \n",total/i); fclose(f_aux); fclose(f_out);

18/19 de Maio de 2004 Registos em Ficheiros 16 Processamento de Registos O tratamento de datas, implica reconhecer quando uma data é anterior a outra, o que é feito com a função anterior que compara duas datas, sendo armazenada a data menor. rem_sp("empresa_in_var.txt", "empresa_aux_var.txt"); [f_aux, msg] = fopen("empresa_aux_var.txt", "r"); [f_out, msg] = fopen("empresa_out_var.txt", "w"); [cod,nome, venc, data, count] = fscanf(f_aux,"%i%s%f%s","C"); data_menor =“01/01/2100”; while !feof(f_aux) if anterior(data,m_data) data_menor = data; endif; [cod,nome, venc, data, count] = fscanf(f_aux,"%i%s%f%s","C"); endwhile; printf("a entrada mais antiga foi em %s\n",data_menor); fclose(f_aux); fclose(f_out);

18/19 de Maio de 2004 Registos em Ficheiros 17 Processamento de Registos A comparação de datas é feita através da comparação dos seus anos, meses e dias, tendo o cuidado de converter as cadeias de caracteres em números. function d = anterior(data1,data2); % data no formato dd/mm/aaaa ano1 = str2num(substr(data1,7,4)); ano2 = str2num(substr(data2,7,4)); if ano1 ano2 d = 0; else mes1 = str2num(substr(data1,4,2)); mes2 = str2num(substr(data2,4,2)); if mes1 mes2 d = 0; else dia1 = str2num(substr(data1,1,2)); dia2 = str2num(substr(data2,1,2)); if dia1 < dia2 d = 1; else d = 0; endif; end function;

18/19 de Maio de 2004 Registos em Ficheiros 18 Processamento de Registos Neste último caso, a informação transmitida não é muito interessante. Provavelmente estaremos mais interessados em saber quem é o empregado mais antigo, ou seja, qual o nome do empregado com data de entrada mais antiga. Este problema pode ser resolvido com uma pequena adaptação do código, guardando não só a data mais antiga como o nome while !feof(f_aux) if anterior(data,m_data) data_menor = data; antigo = nome endif; [cod,nome, venc, data, count] =... endwhile; printf("o empregado mais antigo é %s \n", antigo); printf("com data de entrada %s \n", data_menor);

18/19 de Maio de 2004 Registos em Ficheiros 19 Processamento de Registos Todos estes programas obrigam a ler um ficheiro, cada vez que se pretende responder a uma questão. No entanto, a leitura de ficheiros, mesmo em “discos rápidos” é tipicamente milhares de vezes mais lenta que a leitura a partir de dados em memória. Haverá pois vantagem em copiar um ficheiro de registos para memória e passar a responder às questões a partir de aí. Veremos como responder a esta questão em geral e, no caso do Octave, como tal poderá ser feitos com estruturas e listas.