Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

scraps

[Ajuda] Avaliação final, cadeira de Programação (C)

Recommended Posts

scraps

Boas pessoal, o problema é o seguinte:

Enunciado do Problema

Pretende-se um programa em C, devidamente estruturado, que realize algumas

operações simples de gestão relacionadas com as notas dos alunos de Algoritmos e

Programação. A aplicação deve apresentar iterativamente um menu com a seguinte

lista de funcionalidades que o utilizador poderá escolher:

MENU

(1) Criar pauta final;

(2) Mostrar pauta com notas parciais;

(3) Mostrar pauta com notas finais;

(s) Sair;

Segue-se a descrição detalhada de cada uma das funcionalidades.

(1) Criar pauta final;

Quando seleccionada esta opção, a aplicação deve criar um ficheiro de texto com a

pauta de notas finais, que deverão ser calculadas com base nas notas parciais que

se encontrem num outro ficheiro de texto já existente (a classificação final é dada

por 20% de cada teste, mais 40% do trabalho prático). A aplicação deverá ser

concebida tendo em conta que a informação contida no ficheiro de notas parciais

encontra-se exactamente estruturada como se ilustra no primeiro exemplo que a

seguir se apresenta. Considere, por isso, que a única informação variável nesse

ficheiro é a quantidade de alunos avaliados e os dados referentes a cada aluno

(notas, número e nome). No ficheiro de notas finais, para além do número, nome e

classificação final de cada aluno, deve constar um cabeçalho e o número e

percentagem de aprovações, tal como se ilustra no segundo exemplo que é

apresentado.

(2) Mostrar pauta com notas parciais;

Mostra no ecrã o conteúdo do ficheiro que contém as notas parciais.

(3) Mostrar pauta com notas finais;

Mostra no ecrã o conteúdo do ficheiro que contém as notas finais.

(s) Sair;

Termina a aplicação.

Exemplo de conteúdo do ficheiro com as notas parciais (ficheiro já existente):

12 alunos avaliados

teste1 teste2 teste3 trabalhoPratico Numero Nome

10 6 12 10 12143 Joao Paulo

11 11 4 5 1233 Ana Rita

10 13 8 15 13343 Luis Manuel

15 18 15 10 3333 Catarina Maria

10 13 6 12 2347 Rui Jose

9 13 9 5 13423 Pedro Miguel

13 10 3 10 12312 Rui Pedro

10 14 11 0 16778 Carlos Antonio

13 14 7 7 5655 Ricardo Esteves

15 8 12 16 9457 Paulo Pedro

18 7 16 10 18763 Jose Pedro

8 3 5 11 13265 Isabel Maria

Exemplo de conteúdo do ficheiro com a pauta final (ficheiro que a aplicação deverá

criar):

Pauta de Aloritmos e Programacao

Numero Nome Classificacao

12143 Joao Paulo 10

1233 Ana Rita 7

13343 Luis Manuel 12

3333 Catarina Maria 14

2347 Rui Jose 11

13423 Pedro Miguel 8

12312 Rui Pedro 9

16778 Carlos Antonio 7

5655 Ricardo Esteves 10

9457 Paulo Pedro 13

18763 Jose Pedro 12

13265 Isabel Maria 8

Aprovacoes: 7 (58.3%)

Se alguem me poder ajudar com isto agradecia, é que eu pouco precebo disto :s

Cumps a todos

Share this post


Link to post
Share on other sites
scraps

void op1(){
     FILE *fp1,*fp2;
     if((fp1=fopen("np.txt", "r"))==NULL){
     printf("erro na abertura do ficheiro\n");}
     if((fp2=fopen("nf.txt","w"))==NULL){
     printf("erro na abertura do ficheiro\n");}                                   
     }



main(){
       char tecla, lixo;

       do
       {
       printf("[MENU]\n------------\n");
       printf("(1) Criar pauta final \n");
       printf("(2) Mostrar pauta com notas parciais \n");
       printf("(3) Mostrar pauta com notas finais \n");
       printf("(s) Sair\n");
       printf("\n");
       printf("Opcao: ");
       tecla = getchar();
       lixo = getchar();

       switch (tecla)
       {
       case '1' : op1(); break;
       case '2' : printf("escolheu Opcao 2\n"); break;
       case '3' : printf("escolheu Opcao 3\n"); break;
       case '4' : printf("escolheu Opcao 4\n"); break;
       case 's' : printf("escolheu Opcao Sair\n"); break;
       default : printf("Tecla Invalida");
       }
       printf("\n");
       }
       while (tecla != 's');
       system("pause");
}

Tenho isto ja

Share this post


Link to post
Share on other sites
scraps

nem foi esse o meu objectio :P

tipo ja tenho tudo feito, a  parte de ler os ficheiros criados etc, faltame a parte onde se inserem as notas finais, e em que compara com as parciais, alguem me diz por onde começar, que eu n tou mesmo a ver

Share this post


Link to post
Share on other sites
scraps

estou neste ponto

#include <stdio.h>
#include <stdlib.h>
#define MAXLIN 30
/*     (1) Criar pauta final;
Quando seleccionada esta opção, a aplicação deve criar um ficheiro de texto com a
pauta de notas finais, que deverão ser calculadas com base nas notas parciais que
se encontrem num outro ficheiro de texto já existente (a classificação final é dada
por 20% de cada teste, mais 40% do trabalho prático). A aplicação deverá ser
concebida tendo em conta que a informação contida no ficheiro de notas parciais
encontra-se exactamente estruturada como se ilustra no primeiro exemplo que a
seguir se apresenta. Considere, por isso, que a única informação variável nesse
ficheiro é a quantidade de alunos avaliados e os dados referentes a cada aluno
(notas, número e nome). No ficheiro de notas finais, para além do número, nome e
classificação final de cada aluno, deve constar um cabeçalho e o número e
percentagem de aprovações, tal como se ilustra no segundo exemplo que é
apresentado.*/

void criar_pauta(){
     FILE *fp1,*fp2;
     if((fp1=fopen("np.txt", "r"))==NULL){
     printf("erro na abertura do ficheiro\n");}
     if((fp2=fopen("nf.txt","w"))==NULL){
     printf("erro na abertura do ficheiro\n");}                                   
     }
void mostrar_pauta_parcial() {
  FILE *fp;   
  char l[MAXLIN];
  if((fp=fopen("np.txt", "r"))==NULL){
  printf("erro na abertura do ficheiro\n");}
    while( fgets(l, MAXLIN, fp) != NULL ){
    fputs(l, stdout);
  }
  fclose(fp);
}
void mostrar_pauta_final() {
  FILE *fp;   
  char l[MAXLIN];
  if((fp=fopen("nf.txt", "r"))==NULL){
  printf("erro na abertura do ficheiro\n");}
    while( fgets(l, MAXLIN, fp) != NULL ){
    fputs(l, stdout);
  }
  fclose(fp);
}
main(){
       char tecla, lixo;

       do
       {
       printf("[MENU]\n------------\n");
       printf("(1) Criar pauta final \n");
       printf("(2) Mostrar pauta com notas parciais \n");
       printf("(3) Mostrar pauta com notas finais \n");
       printf("(4) Limpar Ecran\n");
       printf("(s) Sair\n");
       printf("\n");
       printf("Opcao: ");
       tecla = getchar();
       lixo = getchar();

       switch (tecla)
       {
       case '1' : criar_pauta(); break;
       case '2' : mostrar_pauta_parcial();  break;
       case '3' : mostrar_pauta_final(); break;
       case '4' : system("cls");break;
       case 's' : printf("escolheu Opcao Sair\n"); break;
       default : printf("Tecla Invalida");
       }
       printf("\n");
       }
       while (tecla != 's');
       system("pause");
}

o meu problema está em implemetar a parte de codigo que está comentada... cumps

Share this post


Link to post
Share on other sites
Imoogi

acho q da pra fazer isso em Batch Script, eu ainda to estudando C e não sei muito bem, mas em Batch da pra fazer...

Share this post


Link to post
Share on other sites
scraps

eu isso nunca dei, por isso n deve dar p usar, o meu problema agora esta em ler o fixeiro das notas parciais, uma vez que as 2 primeiras linhas são cabçalho, como é que posso começar a lelas só a partir da segunda linha?

cumps

ficheiro a ler

12 alunos avaliados  <-ESTA LINHA É CABÇALHO

teste1 teste2 teste3 trabalhoPratico Numero Nome <- ESTA LINHA É CABÇALHO

10    6      12    10              12143 Joao Paulo <- SO QUERO OS VALORES A PARTIR DAQUI

11    11    4      5                1233 Ana Rita

10    13    8      15              13343 Luis Manuel

15    18    15    10                3333 Catarina Maria

10    13    6      12                2347 Rui Jose

9      13    9      5                13423 Pedro Miguel

13    10    3      10              12312 Rui Pedro

10    14    11    0                16778 Carlos Antonio

13    14    7      7                5655 Ricardo Esteves

15    8      12    16                9457 Paulo Pedro

18    7      16    10              18763 Jose Pedro

8      3      5      11              13265 Isabel Maria

Share this post


Link to post
Share on other sites
Baderous

Podes ler as duas 1ªs linhas com fsncaf e ignorar.

    fscanf(fp,"%*d %*s %*s");
    fscanf(fp,"%*s %*s %*s %*s %*s %*s");

Share this post


Link to post
Share on other sites
scraps

pondo isso ele ignora as duas primeiras, mas depois imprime sempre o mesmo nome, tipo tenho este ciclo

            while  (fgets(linha,200,fp1)){
                   fscanf(fp1,"%*d %*s %*s");
                   fscanf(fp1,"%*s %*s %*s %*s %*s %*s");
                   fscanf(fp1, "%d %d %d %d %d %s %s", &teste1, &teste2, &teste3, &trabalho, &numero,&nome,&aplido);
                   printf(">>%d %d %d %d %d %s %s\n", teste1,teste2,teste3,trabalho,numero,nome,aplido);                                  
            }
}

Share this post


Link to post
Share on other sites
scraps

corrigido, muito obrigado.

agora que formula posso usar para atribuir 20% a cada teste + 40% trabalho = nota final??

cumps

Share this post


Link to post
Share on other sites
scraps

:P

ja consegui fazer tudo, ate ao ponto de gravar para o ficheiro, agora há aqui um problema, ele gravame duas vezes a ultima linha, tem a ver com alguma coisa mal no ciclo de leitura\escrita, fica aqui.

void criar_pauta(){
     int teste1,teste2,teste3,trabalho; //variaveis que vão receber as notas
     int numero; //variavel que va receber o numero
     char nome[20],aplido[20]; // variaveis que vão receber os 2 nomes do aluno
     int i;
     char linha[200];
     float nota;
     
     FILE *fp1,*fp2;
     if((fp1=fopen("np.txt", "r"))==NULL){
     printf("erro na abertura do ficheiro\n");}
     if((fp2=fopen("nf.txt","w"))==NULL){
     printf ("erro na abertura do ficheiro\n");}
     fprintf(fp2,"Pauta de Aloritmos e Programacao\n");
     fprintf(fp2,"Numero   Nome      Classificacao\n");  
      fscanf(fp1,"%*d %*s %*s");
      fscanf(fp1,"%*s %*s %*s %*s %*s %*s");     
            while  (fgets(linha,200,fp1)){
                   fscanf(fp1, "%d %d %d %d %d %s %s", &teste1, &teste2, &teste3, &trabalho, &numero,&nome,&aplido);
                   nota=0.6*((teste1+teste2+teste3)/3)+0.4*(trabalho);
                   printf("-> %.2f ,%d , %s %s \n",nota,numero,nome,aplido);
                   fprintf(fp2,"%d %.2f  %s %s\n",numero,nota,nome,aplido);                                  
            }
}

alguma sugestão??

Share this post


Link to post
Share on other sites
TheDark

Possivelmente tens uma linha vazia no final do ficheiro que lês. Verifica o valor retornado pelo fscanf que está dentro do while. Se não corresponder ao número de variáveis que pretendes ler, é porque a linha não contém a informação que pretendes, e não deves voltar a escrever.


Desaparecido.

Share this post


Link to post
Share on other sites
scraps

_O_ extamente era isso, obrigado

olha presisava de saber duas coisas.

1- como passa os ficheiros como parametros para dentro das funções(para fazer a abertura apenas no main() e depois passar os paramentros)

2- presisava que o meu menu, estivesse dentro de uma função, alguma sugestão? é que colucnado la pelo modo que me parece normal ele dame erro na evocação das funções.

Fica aqui o codigo

#include <stdio.h>
#include <stdlib.h>
#define MAXLIN 30
void menu (char op){
     
}
void criar_pauta(){
     int teste1,teste2,teste3,trabalho; //variaveis que vão receber as notas
     int numero; //variavel que va receber o numero
     char nome[20],aplido[20]; // variaveis que vão receber os 2 nomes do aluno
     
     int i;//variavel de controlo
     
     char linha[200]; //variavel que controla o tamanho das linhas
     
     float nota;      //variavel onde vai ser calculada a nota final
    
     int aprovados=0,total_alunos=0;//variavel para contar alunos aprovados e total de alunos
     float prec_aprov;//variavel para calcular precentagem de positivas
     
     FILE *fp1,*fp2;
     if((fp1=fopen("np.txt", "r"))==NULL){ //abre ficheiro
     printf("erro na abertura do ficheiro\n");}
     if((fp2=fopen("nf.txt","w"))==NULL){ //cria ficheiro limpo para escrita
     printf ("erro na abertura do ficheiro\n");}
     fprintf(fp2,"Pauta de Aloritmos e Programacao\n");// cria cabçalho do ficheiro de notas finais
     fprintf(fp2,"Numero   Nome      Classificacao\n");  
     fscanf(fp1,"%*d %*s %*s");//lê cabçalho e salvaguarda o ciclo de dados incorretos
     fscanf(fp1,"%*s %*s %*s %*s %*s %*s");     
     while  (fgets(linha,200,fp1)){//ciclo para ler todas as linhas do ficheiro de notas parciais
            fscanf(fp1, "%d %d %d %d %d %s %s", &teste1, &teste2, &teste3, &trabalho, &numero,&nome,&aplido);//lê linhas para as variaveis
            nota=0.6*((teste1+teste2+teste3)/3)+0.4*(trabalho);//calcula nota final, com base nos criteris establecidos
            if (nota>=10)//controla positivas
               aprovados++;
            total_alunos++;
            fprintf(fp2,"%d     %.2f     %s %s\n",numero,nota,nome,aplido);//grava linha a linha a nota nr e nome                                 
            }
     prec_aprov=(aprovados*100)/total_alunos;//calcula precentagem de positivas
     printf("\nAprovados: %d %.2f%\n",aprovados,prec_aprov);
     fprintf(fp2,"\nAprovados: %d %.2f %\n",aprovados,prec_aprov);//grava no ficheiro precentagem de positivas
     fclose(fp2);
}
     
void mostrar_pauta_parcial() {
     FILE *fp;   
     char l[MAXLIN];
     if((fp=fopen("np.txt", "r"))==NULL){
     printf("erro na abertura do ficheiro\n");}
     while( fgets(l, MAXLIN, fp) != NULL ){
            fputs(l, stdout);
            }
     fclose(fp);
}
void mostrar_pauta_final() {
     FILE *fp;   
     char l[MAXLIN];
     if((fp=fopen("nf.txt", "r"))==NULL){
     printf("erro na abertura do ficheiro\n");}
     while( fgets(l, MAXLIN, fp) != NULL ){
            fputs(l, stdout);
     }
     fclose(fp);
}
main(){
       FILE *fPauta_Final,*fPauta_Parcial;
       if((fPauta_Parcial=fopen("np.txt", "r"))==NULL){
       printf("erro na abertura do ficheiro\n");}
       if((fPauta_Final=fopen("nf.txt", "w"))==NULL){
       printf("erro na abertura do ficheiro\n");}
       
       char tecla, lixo;//variaveis para ler tecla no menu, variavel lixo criada para salvaguardar o [ENTER]
       do
       {
       printf("[MENU]\n=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~\n");//menu
       printf("(1) Criar pauta final \n");
       printf("(2) Mostrar pauta com notas parciais \n");
       printf("(3) Mostrar pauta com notas finais \n");
       printf("(l) Limpar Ecran\n");
       printf("(s) Sair\n");
       printf("=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=\n");
       printf("\n");
       printf("Opcao: ");
       tecla = getchar();//lê tecla
       lixo = getchar();//lê [ENTER]
       
       switch (tecla)
       {
       case '1' : criar_pauta(); break;
       case '2' : mostrar_pauta_parcial();  break;
       case '3' : mostrar_pauta_final(); break;
       case 'l' : system("cls");break;//limpa ecrã
       case 'L' : system("cls");break;
       case 's' : exit(1); break;//sai do programa
       case 'S' : exit(1); break;
       default : printf("Tecla Invalida");
       }
       printf("\n");
       }
       while (tecla != 's');
       system("pause");
}

Share this post


Link to post
Share on other sites
TheDark

1 - é só colocares um FILE * como parâmetro na definição da função, do género void mostrar_pauta_parcial(FILE *fp), e depois ao chamares a função passas o FILE * correspondente: mostrar_pauta_parcial(fPauta_Parcial)

2 - Passa a função menu para imediatamente antes da função main, e deve ficar tudo bem.

Não podes chamar funções antes de as declarares ou implementares.

Outra coisa: não precisas de ter duas vezes o mesmo código no switch para cada letra minúscula e maiúscula. Por exemplo no caso do 'L', se fizeres

case 'l':
case 'L': system("cls"); break;

ao escreveres o l minúsculo o código entra no case 'l', não pára, prossegue para o case 'L', e executa o system("cls")


Desaparecido.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.