next up previous
Next: About this document ...

Departamento de Ci�ncia da Computa��o - IME-USP

MAC 115 - Introdu��o � Computa��o

INSTITUTO ASTRON�MICO E GEOF�SICO -- SEGUNDO SEMESTRE DE 2001

Terceiro Exerc�cio-Programa --- Data de entrega: at� 03 de julho de 2001.

Fazendo m�dia $\bigcirc\!\!\!\!\!\lower.02cm\hbox{\vbox{\offinterlineskip\hbox{$\>\!..$}\vskip.07cm\hbox{$\ \!\!\scriptscriptstyle\smile$}}}$

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:

  1. Voc� mesmo pode criar o seu arquivo de entrada usando o pr�prio lccwin como editor. Abra um arquivo com nome, por exemplo, notas.txt e digite os dados do exemplo acima. Salve o seu arquivo (n�o execute, pois isso n�o � um programa em C!). Volte ao arquivo do seu EP para digitar ou executar o seu programa.
  2. O seu programa n�o precisa fazer consist�ncia de dados, ou seja, n�o precisa verificar se os valores dados satisfazem as restri��es que impussemos. Mais especificamente, voc� n�o precisa verificar se os nomes de fato tem no m�ximo 30 caracteres, se as notas de fato est�o entre 0 e 10, etc. Assuma que o arquivo satisfaz estas restri��es.
  3. Note que o crit�rio acima difere do nosso crit�rio de aprova��o, que exige que o aluno tenha m�dia de EP e m�dia de prova pelo menos 5.0 para ser aprovado.
  4. IMPORTANTE!!!!!!!! Para n�o ter problemas na leitura dos dados, deixe sempre um espa�o em branco depois do formato de leitura de cada n�mero. Isso � essencial para voc� n�o ter problemas com a leitura dos nomes. Assim, escreva fscanf(entrada, %d %d %d ", &n, &p, &m); -- note o branco depois do �ltimo %d -- ao inv�s de fscanf(entrada, %d %d %d", &n, &p, &m);.




OBSERVA��ES IMPORTANTES SOBRE OS EXERC�CIOS-PROGRAMAS

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

1)
O exerc�cio-programa � estritamente individual. Exerc�cios copiados (com ou sem eventuais disfarces) receber�o nota ZERO.

2)
Exerc�cios atrasados n�o ser�o aceitos.

3)
Exercícios com erros de sintaxe (ou seja, erros de compila��o) receber�o nota ZERO.

4)
muito importante que seu programa tenha coment�rios e esteja bem indentado, ou seja, digitado de maneira a ressaltar a estrutura de subordina��o dos comandos do programa (conforme visto em aula). A avalia��o dos exerc�cios-programas levar� isto em conta.

5)
Você deve entregar num envelope (preferencialmente de plástico transparente):

6)
Cada programa deve ser executado tantas vezes quantas forem necess�rias para testar todos os casos poss�veis para as entradas. A escolha desses dados tamb�m influir� na sua nota.

7)
Guarde com você até o final do semestre, em seus disquetes, os arquivos de seus programas, pois eles podem ser solicitados pelo professor caso surja alguma dúvida. Guarde também as listagens que lhe serão devolvidas, nas quais está marcada a nota que você recebeu.




next up previous
Next: About this document ...
Francisco Reverbel
2001-06-12