23
© Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof, phas, rp2 }@cin.ufpe.br Luis Filipe Prado Dandara Márcio Ricardo Alves Gadelha de Araújo Paulo Sérgio Borges de Oliveira Filho Pedro Henrique Atanásio e Silva Renato Parente 1 Arthur de Lima Padilha Danilo do Nascimento Queiroz Diego Wesley de Carvalho Spíndola Filipe Martins de Melo Júlio Domingues Ferraz

© Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

Embed Size (px)

Citation preview

Page 1: © Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

© Copyright 2008 Algoritmos e Estruturas de Dados

IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE

{ alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof, phas, rp2}@cin.ufpe.br

Luis Filipe Prado Dandara

Márcio Ricardo Alves Gadelha de Araújo

Paulo Sérgio Borges de Oliveira Filho

Pedro Henrique Atanásio e Silva

Renato Parente

1

Arthur de Lima Padilha

Danilo do Nascimento Queiroz

Diego Wesley de Carvalho Spíndola

Filipe Martins de Melo

Júlio Domingues Ferraz

Page 2: © Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

© 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 IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

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 Monitor

Entrada de Dados Saída de Dados

Métodosread

Métodosprint e println

3© Copyright 2008 Algoritmos e

Estruturas de Dados

Page 4: © Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

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 Monitor

Entrada de Dados Saída de Dados

4© Copyright 2008 Algoritmos e

Estruturas de Dados

Page 5: © Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

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

Programa

EstruturaFILE

ArquivoEntrada

ArquivoSaída

Entrada de Dados Saída de Dados

Funçãofscanf

Funçãofprintf

5© Copyright 2008 Algoritmos e

Estruturas de Dados

Page 6: © Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

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

6© Copyright 2008 Algoritmos e

Estruturas de Dados

Page 7: © Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

© Copyright 2008 Algoritmos e Estruturas de Dados

Arquivos podem ser abertos de dois modos: leitura e gravação. Um programa em C com entrada e saída em arquivos é composto por duas estruturas FILE:

• 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 gravadas os resultados obtidos pelo programa.

7

Page 8: © Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

© 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

8

Page 9: © Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

© Copyright 2008 Algoritmos e Estruturas de Dados

Para abrir um arquivo para leitura, usa-se o modo “r”:

FILE *entrada = fopen(“teste.in”, “r”);

Em caso de erro (ex: o arquivo de entrada não existe), a função fopen retorna NULL.

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

E para abrir um arquivo para gravação, usa-se “w”:

FILE *saida = fopen(“teste.out”, “w”);

9

Page 10: © Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

© Copyright 2008 Algoritmos e Estruturas de Dados

A entrada de dados é feita através da função fscanf:int n1; double n2; char str[20];

fscanf(entrada, “%d”, &n1);fscanf(entrada, “%lf”, &n2); fscanf(entrada, “%s”, str);

O primeiro argumento é o arquivo a ser lido. O segundo é uma string contendo o formato das variáveis que estão nos argumentos seguintes.

Não se esqueça do & antes de cada variável (com exceção das strings).

10

Page 11: © Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

© Copyright 2008 Algoritmos e Estruturas de Dados

fprintf(saida, “%d”, 3);fprintf(saida, “%lf”, 5.3); fprintf(saida, “%s %d”, “Nota:”, 7);fprintf(saida, “Algoritmos”);

Da mesma maneira, a saída de dados é feita através da função fprintf (o & não é usado):

A quebra de linha é feita através do símbolo “\n”:

fprintf(saida, “%d\n”, 2);fprintf(saida, “\n%lf”, -2.7); fprintf(saida, “\n%s\n”, “Algoritmos”);fprintf(saida, “\nNota:\n%d\n”, 8);

11

Page 12: © Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

© Copyright 2008 Algoritmos e Estruturas de Dados

Os símbolos usados em fscanf e fprintf são:

%d um número inteiro decimal%lf um double (algo como “long-floating point”)%s uma string (array de chars - não se usa o &)\n uma quebra de linha

Outros símbolos também são utilizados nestas funções, mas para Algoritmos, apenas estes são suficientes.

Se o fim do arquivo for alcançado, fscanf retorna EOF. Caso contrário, retorna o número de argumentos lidos.

12

Page 13: © Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

© 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 a função fclose:

fclose(entrada);fclose(saida);

Assim, os arquivos de entrada e de saída são fechados, e a memória ocupada por eles é liberada para que possa ser usada novamente pelo sistema.

13

Page 14: © Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

© Copyright 2008 Algoritmos e Estruturas de Dados

Outra opção para manipular arquivos de entrada/saída em C/C++ é utilizar a função freopen.freopen(“L0Q1.in”, “r”, stdin);freopen(“L0Q1.out”, “w”, stdout);

Os exemplos acima estão redirecionando a entrada e saída padrão, respectivamente, para o arquivo L0Q1.in e L0Q1.out.

Desta forma, podem-se utilizar as funções scanf e printf (ou cin e cout) para acessar e imprimir dados no arquivo.

14

Page 15: © Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

© Copyright 2008 Algoritmos e Estruturas de Dados

Em C++, podemos manipular a E/S de arquivos com maior facilidade do que em C. Para isto, utiliza-se as classes ifstream e ofstream de <fstream>.

Para lermos do arquivo de entrada, precisamos criar uma instância de ifstream:ifstream entrada(“teste.in”);

Essa instância de ifstream só tem permissão para leitura de “teste.in”.

15

Page 16: © Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

© Copyright 2008 Algoritmos e Estruturas de Dados

Para podermos gravar num arquivo, criamos uma instância de ofstream:

ofstream saida(“teste.out”);

Essa instância de ofstream tem permissão para gravar em teste.out.

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

16

Page 17: © Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

© Copyright 2008 Algoritmos e Estruturas de Dados

A entrada de dados é feita através do operador de extração em streams: >> .int n1; double n2; char str[20];

entrada >> n1;

entrada >> n2;

entrada >> str;

Simples assim! Ainda poderíamos obter o mesmo resultado fazendo:int n1; double n2; char str[20];

entrada >> n1 >> n2 >> str;17

Page 18: © Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

© Copyright 2008 Algoritmos e Estruturas de Dados

1. int n1; double n2; char str[20];

2. entrada >> n1 >> n2 >> str;

Quando a 2ª linha é executada, o que acontece é :

1º valor lido de teste.in vai para n1;

2º valor lido de teste.in >> n2;

3º valor lido de teste.in >> str.

Apesar de facilitar e deixar o código limpo, o programador tem que tomar o cuidado de não enviar à uma variável algum tipo de dado diferente do que a mesma possa armazenar.

18

Page 19: © Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

© Copyright 2008 Algoritmos e Estruturas de Dados

int qualquer; // poderia ser qualquer tipo...

while(entrada >> qualquer){ // leitura dos dados da entrada

}

// chegou aqui == leu todo o arquivo

Enquanto se lê os dados da entrada, o programa precisa “saber” se ainda tem dados para extrair. Para isto faz-se o seguinte:

Isto acontece porque a operação “entrada >> qualquer” retorna um valor != 0 enquanto tiver algo pra se ler de teste.in e colocar no inteiro qualquer. Se já foi lido todos os dados, a operação retorna 0(false).

19

Page 20: © Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

© Copyright 2008 Algoritmos e Estruturas de Dados

A saída de dados é feita através dos operadores de inserção em streams: << .int n1 = 3; double n2 = 2.5;

char str[20] = “Algoritmos”;

saida << n1;

saida << ‘ ‘;

saida << n2;

saida << “ “;

saida << str;

saida << ‘\n’; 20

Page 21: © Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

© Copyright 2008 Algoritmos e Estruturas de Dados

3 2.5 Algoritmos

// cursor aqui, por conta do ‘\n’

Obteríamos a mesma linha fazendo apenas:

Será impressa a seguinte linha em teste.out:

saida << n1 << ‘ ‘ << n2 << “ “ << str << ‘\n’;

Simples assim!

21

Page 22: © Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

© 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 a função close():

entrada.close();saida.close();

Assim, os arquivos de entrada e de saída são fechados, e a memória ocupada por eles é liberada para que possa ser usada novamente pelo sistema.

22

Page 23: © Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,

© Copyright 2008 Algoritmos e Estruturas de Dados

A melhor maneira de aprender a resolver problemas usando arquivos (incluindo uso de arquivos em C/C++), é fazendo exercícios.

Na página, os exercícios estão disponíveis em:

http://moreno2.cin.ufpe.br/~if672/2008.2/aulasPraticas.htm

A lista 0 também já está na página, em:

http://www.cin.ufpe.br/~if672/2008.2/listas.htm

23