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: ..... */ /********************************************************/