回 帖 发 新 帖 刷新版面

主题:如何用C编译学生成绩管理系统

请高手赐教

回复列表 (共8个回复)

沙发

先说说你自己的思路吧:)

板凳

先设定学生的姓名和分数;在设顶总分和平均分

3 楼

考虑系统,需要有个整体思路,然后再逐渐细化。
学生成绩管理系统,那当然就是管理成绩的——并且还是学生的。
所以学生基本信息和成绩都是需要的。但成绩是什么成绩呢?当然还需要科目啦:)

4 楼

林哥不好意思 这一段时间 我住院没有时间上网

5 楼


#include "stdio.h"
#include "math.h"
#define N 100  /*学生人数,假设少于100*/
#define M 30      /*课程门数,假设少于30*/

void input();
void asfun();
void tasfun();
void sortfun();
void output();

int n, m;           /*实际学生人数,实际课程人数*/

/*每个学生的数据*/
struct stt
{int num;              /*学号*/
  char name[10];        /*姓名*/
  float score[M];     /*每门课程成绩*/
} sta[N];

char sname[M][16];                      /*每门课程的名称*/
float avs1[M], sus1[M];                 /*每门课程的平均分、方差*/
float total[N], avs2[N], sus2;     /*每个学生的总分、平均分、方差*/
int sort[N];                                  /*排序结果*/

main()
{clrscr();
  input();
  asfun();
  tasfun();
  sortfun();
  output();
}

 /*获取数据*/
void input()     
{char  ch; 
  int i,j;    
  char *ps;         /*数据文件名*/
  FILE *fps;         /*数据文件指针*/
  printf("Please choice  (K-input by keyboard    F-get from disc file)\n");
  ch=getch();  
  switch(ch)
    {case 'K':
     case 'k':
      {printf("Input the number of student:   ");
        scanf("%d",&n);
        printf("Input the number of subject:   ");
        scanf("%d",&m);
           if(n<=0||n>1000||m<=0||m>30)
           {printf("wrong data!");
           exit(0);
           }

        printf("input the name of %d subjiects:\n",m);
        for(j=0;j<m;j++)
        scanf("%s",sname[j]);
            
        for(i=0;i<n;i++)
            {printf("input NO%d student's number,name,score of %d subjiects:\n",i+1,m);
            scanf("%d%s",&sta[i].num, sta[i].name);
            for(j=0;j<m;j++)
                scanf("%f",&sta[i].score[j]);
            }
         
        ps="SCORE.DAT";   /*送磁盘文件保存*/
        if((fps=fopen(ps,"wb"))==NULL)
            {printf("file creation error!");
             exit(0);
            }
        /*将数据写入磁盘文件*/
        fwrite(&n,2,1,fps);
        fwrite(&m,2,1,fps);
        fwrite(sname,16,m,fps);
        fwrite(sta,sizeof(struct stt),n,fps);
        fclose(fps);
        break;
        }
            
        case 'F':
        case 'f':
        {printf("Please input data filename:");
        scanf("%s",ps);
        if((fps=fopen(ps,"rb"))==NULL)
        {printf("file open error!");
          exit(0);
        }
        /*从文件中读取数据*/
        fread(&n,2,1,fps);
        fread(&m,2,1,fps);
        fread(sname,16,m,fps);
        fread(sta,sizeof(struct stt),n,fps);
        fclose(fps);
        break;
    }
    
    default:
    {printf(" make a wrong data sources choice !");
      exit(0);
    }
}
}
        

/*计算每门课程的平均分和方差*/
void asfun()
{int i,j;
 float t[M], ts[M];     /*每门课程学生成绩的分数的和、平方和*/
 for(j=0;j<m;j++)
    {t[j]=0; ts[j]=0;
      for(i=0;i<n;i++)
        {t[j]+=sta[i].score[j];
        ts[j]+=sta[i].score[j]*sta[i].score[j];
        }
         avs1[j]=t[j]/n;
     sus1[j]=ts[j]/n-avs1[j]*avs1[j];
    }
}

6 楼



/*计算每个学生的总分、平均分和方差*/       
void tasfun()
{int i, j;
 float ta=0, ts=0;   /*全班平均成绩之和,之平方和*/
 for(i=0;i<n;i++)
    {total[i]=0;
      for(j=0;j<m;j++)
         total[i]+=sta[i].score[j];
      avs2[i]=total[i]/n;
      ta+=avs2[i]; ts+=avs2[i]*avs2[i];
    }
    sus2=ts/n-(ta/n)*(ta/n);
}

/*按总分排名*/
void sortfun()
{int i, j,k;
  int m;           /*存放未筛选过的学生的名次*/
  for(i=0;i<n;i++)
    {k=i;
     m=1;
      for(j=0;j<n;j++)
           if(total[j]>total[k])  m++;
      sort[i]=m;
    }
 for(i=0;i<n;i++)
    {k=0;
      for(j=0;j<n;j++)
     if(sort[j]==i+1)
         { sort[j]+=k;
           k++;
         }
    }
        
}
    
/*输出数据*/
void output()
{int i, l, j;
  int is;          /*装名次为i+1的学生的排序号*/
  char *pt;
  FILE *fpt;
  clrscr();
  printf("score data of %d students and %d subjects as follows:\n",n,m);
   printf("\n");
  /*输出第一行*/
   printf("number    name  ");
   for(j=0;j<m;j++)
   printf("%8s",sname[j]);
   printf("        total score      average score     rank\n");
    /*按名次输出每个学生对应第一行的内容*/
    for(i=0;i<n;i++)
    {for(l=0;l<n;l++)
        if(sort[l]==i+1)  is=l;
      printf("%d%12s",sta[is].num,sta[is].name);
      for(j=0;j<m;j++)
      printf("%11.2f",sta[is].score[j]);
      printf("%9.2f%17.2f%16d\n",total[is], avs2[is], sort[is]);
    }
    printf("\n");
    /*输出课程平均分该行*/
    printf("average score");
    for(j=0;j<m;j++)
        printf("%11.2f",avs1[j]);
    printf("\n");
    /*输出课程方差该行*/
    printf("     variance");
    for(j=0;j<m;j++)    
    printf("%11.2f",sus1[j]);
    printf("%27.2f\n",sus2);
    printf("\n");
    /*将数据写入磁盘文件*/
    pt="STUDENT.DAT";  /*输出数据送磁盘*/
    if((fpt=fopen(pt,"wb"))==NULL)
    {printf("file creation error");
        exit(0);
    }
    fwrite(&n,2,1,fpt);
    fwrite(&m,2,1,fpt);
    fwrite(sname,16,m,fpt);
    for(i=0;i<n;i++)
        {fwrite(&sta[i],sizeof(struct stt),1,fpt);
          fwrite(&total[i],4,1,fpt);
          fwrite(&avs2[i],4,1,fpt);
          fwrite(&sort[i],2,1,fpt);
        }
    fwrite(avs1,4,m,fpt);
    fwrite(&sus2,4,1,fpt);
    fclose(fpt);
        getch();
    }

7 楼

呵呵,近来忙,看漏贴了:)现在恢复得怎样?

8 楼

一个你可以自己试着想想怎样做,需要用到什么技巧或是什么函数,再有就是直接看别人给你的代码,然后想想为什么要这样做,最后都明白了想想还能不能再优化:)这样你才会有进步:)

我来回复

您尚未登录,请登录后再回复。点此登录或注册