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

scraps

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

16 mensagens neste tópico

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Continua... vai metendo as dúvidas... ninguém te vai fazer o trabalho  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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);                                  
            }
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

corrigido, muito obrigado.

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

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

: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??

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

_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");
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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")

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora