next up previous
Next: About this document ...

Departamento de Ciência da Computação - IME-USP

MAC 115 - Introdução à Computação

INSTITUTO DE FÍSICA -- 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