DCC-IME-USP FRANCISCO C. R. REVERBEL
SALA B-125 TEL.: 818 6289
E-MAIL: reverbel at ime.usp.br
Todo fim de semestre cada professor tem que calcular a média final das suas turmas. Este ano, o Departamento de Ciência da Computação da USP resolveu uniformizar este processo, contratando vocês para implementarem um programa para o cálculo das médias.
Cada dois de vocês devem escrever um programa em C que leia de um arquivo os dados de uma turma e imprima a média final de acordo com o critério também descrito no arquivo de entrada.
No arquivo de entrada estão os seguintes dados, nesta ordem:
Vocês podem assumir que o nome de cada aluno contém no máximo 30 caracteres. Mais especificamente vocês podem assumir que os 30 primeiros caracteres de cada linha com os dados de um aluno contêm um nome (e eventuais brancos depois) e na coluna 31 começam as notas de provas deste aluno. Cada nota deve ser um número real entre 0 e 10.
Exemplo de arquivo de entrada:
3 3 5 1 2 2 1 1 2 2 3 1 2 Cassandra Avestruz da Silva 5.0 6.6 4.2 10.0 9.0 8.0 7.0 6.0 Roberto Marinho 2.0 1.5 3.2 0.0 5.0 0.0 6.0 6.5 Ronaldinho Gaúcho 8.0 3.0 7.7 9.5 8.0 10.0 9.5 9.0
O seu programa deve pedir que o usuário digite o nome do arquivo de entrada e deve ter como saída um arquivo de nome "saida.txt" contendo as seguintes informações:
Exemplo de saída (para o arquivo de entrada já visto):
Nome p1 p2 p3 mp ep1 ep2 ep3 ep4 ep5 mep mf Cassandra Avestruz da Silva 5.0 6.6 4.2 5.3 10.0 9.0 8.0 7.0 6.0 7.4 6.7 Roberto Marinho 2.0 1.5 3.2 2.3 0.0 5.0 0.0 6.0 6.5 4.1 3.5 Ronaldinho Gaúcho 8.0 3.0 7.7 5.9 9.5 8.0 10.0 9.5 9.0 9.3 8.1 Medias 5.0 3.7 5.0 4.5 6.5 7.3 6.0 7.5 7.2 6.9 6.1 Aprovados: 2 Recuperacao: 1 Reprovados: 0
Leitura e gravação de um arquivo
Para fazer a leitura de um arquivo de entrada e a gravação da saída em um arquivo, utilize a seguinte receita no seu programa, dentro da função main():
/* Declaração das variáveis para leitura e gravação em arquivos */ char nome_arq_entrada[40]; /* para o nome do arquivo de entrada */ FILE *entrada, *saida; /* Primeiros comandos do seu programa */ /* Abertura do arquivo de entrada */ printf("Digite o nome do arquivo de entrada: "); scanf("%s", nome_arq_entrada); if ((entrada = fopen(nome_arq_entrada, "r")) == NULL) { printf("Arquivo de entrada nao encontrado!\n"); exit(1); } /* Abertura do arquivo de saída */ if ((saida = fopen("saida.txt", "w")) == NULL) { printf("Erro na abertura do arquivo de saida!\n"); exit(1); }
No restante do seu programa, toda vez que você quiser ler alguma coisa do arquivo de entrada, utilize a função fscanf e para escrever no arquivo de saída, utilize a função fprintf. Estas funções funcionam de forma semelhante ao scanf e ao printf, exceto que elas possuem um parâmetro a mais: o nome do arquivo onde está sendo feita a leitura ou a gravação. Sinta-se a vontade de imprimir tanto no arquivo (com o fprintf) quanto na tela (com o printf): isso pode lhe ajudar na fase de teste do seu programa, por exemplo na verificação de que a leitura do arquivo está funcionando corretamente, etc.
Para fazer a leitura do nome, utilize a função fgets, que tem como parâmetros (nesta ordem) o nome da string onde será guardada a string lida, o número de caracteres a serem lidos (no nosso caso, 30 - lembre-se de utilizar o comando #define MAX_NOME 30 no início do programa) e o nome do arquivo de onde a leitura deve ser feita.
Pequeno relatório
Junto com o seu EP, cada um dos dois participantes da equipe separadamente deve entregar um relatório de no máximo uma página, escrito a mão, onde conta o que achou do EP, quanto do trabalho você fez, quantas horas dedicou ao EP, quais partes achou mais difícil e o que acha que aprendeu de mais importante com este EP. A nota do EP será dada apenas aos participantes que entregarem este relatório.
Exemplos:
/* Lendo do arquivo de entrada */ fscanf(entrada, "%d %d %d ", &n, &p, &m); /* Verificando os valores que foram lidos - impressão na tela */ printf("n = %d p = %d m = %d\n", n, p, m); /* Leitura de um nome do arquivo de entrada */ fgets(nome, MAX_NOME, entrada); /* Gravando no arquivo de saida */ fprintf(saida, "%s %4.1f\n", nome, mf);
Observações: