Upload
internet
View
102
Download
0
Embed Size (px)
Citation preview
© 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
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
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
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
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
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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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