Departamento de Ciência da Computação - IME-USP
Terceiro Exercício-Programa --- Data de entrega: até 03 de julho de 2001.
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.
Escreva, na linguagem C, um programa 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 29 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 seguido de brancos (haverá pelo menos um branco depois do nome) e que na coluna 31 começam as notas 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, você precisa abrir o arquivo de entrada e o arquivo de saida. Faça isso utilizando 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); }
Tendo feito isso, a variável entrada se referirá ao arquivo de entrada e a variável saida se referirá ao arquivo de saída. No restante do seu programa utilize a função fscanf para ler dados do arquivo de entrada e a função fprintf para escrever dados no arquivo de saída. Estas funções funcionam de forma semelhante ao scanf e ao printf, exceto que elas possuem um parâmetro a mais, que especifica o arquivo do qual o fscanf lê os dados ou no qual o fprintf escreve os dados. Para informar ao fscanf qual é o arquivo de entrada, passe como parâmetro a variável entrada. Para informar ao fprintf qual é o arquivo de saída, passe como parâmetro a variável saida.
Sinta-se a vontade para escrever tanto no arquivo (com o fprintf) quanto na tela (com o printf): escrever também na tela 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 um argumento que especifica o arquivo de onde a leitura deve ser feita.
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:
Todos os exercícios-programas devem ter o seguinte cabeçalho:
/********************************************************/ /* Fulano de Tal */ /* Exercicio-Programa xx */ /* Curso yy - Turma zz -- Professor: Ciclano de Tal */ /* Computador: ..... */ /* Compilador: ..... */ /********************************************************/