© Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn -...

20
© Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva Botelho Matheus Bispo Arrais de Souza Murilo Raphael de Souza Lira Rafael Alberto Gomes Pereira Lima Rafael Brandão Lobo Rafael Loureiro de Carvalho Tiago Carneiro Pessoa Canto Vinicius Miranda Cesar [email protected]

Transcript of © Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn -...

Page 1: © Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti.

© Copyright 2008 Algoritmos e Estruturas de Dados1

IF672 - Algoritmos e Estruturas de Dados CIn - UFPE

Adriana Libório Fernandes LinsArthur Cavalcanti AlemÁtila Valgueiro Malta MoreiraFlavio Juvenal da Silva JúniorGustavo Cauê Silva BotelhoMatheus Bispo Arrais de Souza

Murilo Raphael de Souza LiraRafael Alberto Gomes Pereira LimaRafael Brandão LoboRafael Loureiro de CarvalhoTiago Carneiro Pessoa CantoVinicius Miranda Cesar

[email protected]

Page 2: © Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti.

© Copyright 2008 Algoritmos e Estruturas de Dados

Os dados de um programa passam por três etapas:

Sendo assim, a entrada e a saída de dados são partes fundamentais na construção de um programa.

Processamento

Entrada Saída

Informações iniciais

Resultados

2

Page 3: © Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti.

© Copyright 2008 Algoritmos e Estruturas de Dados

Na disciplina de Introdução à Programação, a entrada de dados era feita através do teclado e a saída através do monitor, usando-se a classe Console:

Programa

ClasseConsole

Teclado MonitorEntrada de Dados Saída de Dados

Métodosread

Métodosprint e println

3

Page 4: © Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti.

© Copyright 2008 Algoritmos e Estruturas de Dados

Na disciplina de Introdução à Programação, a entrada de dados era feita através do teclado e a saída através do monitor, usando-se a classe Console:

Programa

GUI

Teclado MonitorEntrada de Dados Saída de Dados

4

Page 5: © Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti.

© Copyright 2008 Algoritmos e Estruturas de Dados

Na disciplina de Algoritmos, entrada e saída de dados serão feitas através de arquivos:

Programa

Arquivo ArquivoEntrada de Dados Saída de Dados

Métodosread

Métodosprint

File Reader

Buffered Reader

File Writer

Print Writer

5

Page 6: © Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti.

© Copyright 2008 Algoritmos e Estruturas de Dados

Para simplificar a implementação das listas, foi criada a classe Arquivo, que contém todas as funções de E/S:

Programa

ClasseArquivo

ArquivoEntrada

ArquivoSaída

Entrada de Dados Saída de Dados

Métodosread

Métodosprint e println

6

Page 7: © Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti.

© Copyright 2008 Algoritmos e Estruturas de Dados

Motivação:

• Menor tempo de teste de um programa

• Menor preocupação com tratamento de erros de entrada (dados inválidos, incompletos, etc.)

• Processamento de séries de conjuntos de dados

• Processamento de grandes quantidades de dados.Ex: ordenar 10.000 números

7

Page 8: © Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti.

© Copyright 2008 Algoritmos e Estruturas de Dados

Arquivos podem ser abertos de dois modos: leitura e gravação. Um objeto da classe Arquivo é composto por dois arquivos:

• O arquivo de entrada (input) é aberto no modo leitura (read) e dele serão lidas as informações que programa irá utilizar.

• O arquivo de saída (output) é aberto para gravação (write) e nele serão gravados os resultados obtidos pelo programa.

8

Page 9: © Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti.

© Copyright 2008 Algoritmos e Estruturas de Dados

Ex: Ordenação de elementosArquivo.in Arquivo.out

Programa

Conjuntos de Entrada

43 2 4 1

Conjuntos de Saída

Conjunto #11 2 3 4

59 10 55 41 2

Conjunto #22 9 10 41 55

410 30 45 90

Conjunto #310 30 45 90

Fim doarquivo

9

Page 10: © Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti.

© Copyright 2008 Algoritmos e Estruturas de Dados

Para criar um par de arquivos entrada/saída, basta passar o nome dos arquivos escolhidos como argumentos do construtor da classe Arquivo:Arquivo arq = new Arquivo(“L1Q1.in”, “L1Q1.out”);

Se o arquivo de entrada não existir, uma exceção (RuntimeException) é lançada.

O arquivo de saída é sempre criado; caso ele já exista, seu conteúdo anterior é descartado.

10

Page 11: © Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti.

© Copyright 2008 Algoritmos e Estruturas de Dados

A entrada de dados é feita através dos métodos de leitura, ou seja, métodos read habilitados para os tipos int, double e String. A sintaxe é similar à da classe Console:int n = arq.readInt();double d = arq.readDouble();String s = arq.readString();

Estes métodos ignoram todos os brancos, ou seja, espaços, quebras de linha (enter) ou tabulações (tab).

11

Page 12: © Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti.

© Copyright 2008 Algoritmos e Estruturas de Dados

Ex: Armazenamento em array

15 3 1 020 52

int array[] = new int[6];

for (int i = 0; i < 6; i++)array[i] = arq.readInt();

Aplicando o código à seguinte entrada temos:Arquivo.in

Programa

15 3 1 0 20 52

12

Page 13: © Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti.

© Copyright 2008 Algoritmos e Estruturas de Dados

Métodos de leitura ignoram os espaços em branco e quebras de linha. Para verificar se uma linha (ou o arquivo) chegou ao fim, usa-se:

boolean isEndOfLine(); boolean isEndOfFile();

Ex: Leitura de dados até o fim do arquivo

while (! arq.isEndOfFile() ) {int x = arq.readInt();...

}

Fim de linha

Fim de arquivo

13

Page 14: © Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti.

© Copyright 2008 Algoritmos e Estruturas de Dados

Para poder ler também os espaços e quebras de linha do arquivo, existem dois métodos adicionais:

String lin = arq.readLine();

Este método retorna também ‘ ’, ‘\n’, ‘\t’. Retorna ‘\0’ quando o fim do arquivo é alcançado.

char c = arq.readChar();

Retorna todos os caracteres até o fim da linha. Se a linha estiver em branco, retorna a string vazia (“”), e null quando o fim do arquivo é alcançado.

14

Page 15: © Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti.

© Copyright 2008 Algoritmos e Estruturas de Dados

void print(char c);void print(String s);void print(int n);void print(double d);void print(double d, int dec);

Da mesma maneira, a saída de dados é feita através dos metódos de gravação, ou seja, métodos print:

Os métodos acima imprimem os dados formatados de acordo com o padrão de Java. O último imprime um double com um número indicado de casas decimais.

15

Page 16: © Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti.

© Copyright 2008 Algoritmos e Estruturas de Dados

Para começar uma nova linha no arquivo de saída após a escrita de um dado, usa-se os métodos println:

void println();void println(char c);void println(String s);void println(int n);void println(double d);void println(double d, int dec);

Usar ‘\n’ ao invés dos métodos acima pode resultar em problemas na formatação do arquivo de saída.

16

Page 17: © Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti.

© Copyright 2008 Algoritmos e Estruturas de Dados

Exemplos:Arquivo.out

arq.print(‘a’); aarq.print(‘b’); b

arq.println();arq.println(‘c’);

c

arq.println(“Teste”);Teste

arq.println(123);123

arq.println(2.555, 2); 2.56

arq.println(10, 4); 10.0000

arq.print(12 + “ ”); 12arq.print(15 + “ ”);

15

arq.println(“xy”+ 10);

xy10

17

Page 18: © Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti.

© Copyright 2008 Algoritmos e Estruturas de Dados

Quando o arquivo não for mais necessário é preciso fechá-lo, ou seja, liberar os recursos utilizados por ele. Para isso, usa-se o método close:

arq.close();

Tanto o arquivo de entrada como o de saída são fechados e a memória ocupada por eles é liberada pelo garbage collector. Caso isto não seja feito, as informações podem não ser gravadas corretamente.

18

Page 19: © Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti.

© Copyright 2008 Algoritmos e Estruturas de Dados

Ex: Ler inteiros da entrada e imprimi-los na saída:public static void main(String[] args) {

Arquivo arq = new Arquivo(“LxQ1.in”, “LxQ1.out”);

while ( ! arq.isEndOfFile() ) { int n = arq.readInt(); arq.println( n ); }

arq.close();}

19

Page 20: © Copyright 2008 Algoritmos e Estruturas de Dados 1 IF672 - Algoritmos e Estruturas de Dados CIn - UFPE Adriana Libório Fernandes Lins Arthur Cavalcanti.

© Copyright 2008 Algoritmos e Estruturas de Dados

A melhor maneira de aprender a resolver problemas usando arquivos (incluindo a classe Arquivo em Java), é fazendo exercícios.

Na página, os exercícios estão disponíveis em:http://www.cin.ufpe.br/~if672/2009.1/aulasPraticas.htm

A lista 0 também já está na página, em:http://www.cin.ufpe.br/~if672/2009.1/listas.htm

20