学生管理系统(C语言)

大一的课程设计了,翻出来放上来供参考,也致曾经初学代码熬夜的我~

第一个功能(将文件中的数据存放到链表中,计算文件中的学生个数存放到a中)
第二个功能(键盘录入学生信息)
第三个功能(计算每门课程的总分和平均分)
第四个功能(计算每个学生的总分及平均分)
第五个功能(按每个学生的总分由高到低排出名次表)
第六个功能(按每个学生的总分由低到高排出名次表)
第七个功能(按学号由小到大排出成绩表)
第八个功能(按姓名的字典顺序排出成绩表)
第九个功能(按学号查询学生排名及其考试成绩)
第十个功能(按姓名查询学生排名及其考试成绩考虑学生重名)
第十一个功能(输出每一科目优秀、良好、中等、及格、不及格人数)
第十二个功能(输出每个学生的学号、姓名、各科考试成绩、总分和平均分)
第十三个功能(将每个学生的个人信息和成绩写入文件,可由键盘输入文件名)

#include<stdio.h>
#include<stdlib.h>
#include<string.h> 
int a,b;         //定义全局变量记录学生数量与科目数量 
enum tsex{male,female};
struct student{
 char name[20];
 enum tsex sex;
 int num;
 int score[6];
 int sum;
 float ave;
 struct student *next;
}; 
struct student*creat(void);     //创建一个链表并返回首地址 
struct student*g1(void);     //实现第一个功能(将文件中的数据存放到链表中,计算文件中的学生个数存放到a中)
struct student*g2(void);     //实现第二个功能(键盘录入学生信息) 
void g3(struct student *);     //实现第三个功能(计算每门课程的总分和平均分) 
struct student*g4(struct student *);  //实现第四个功能(计算每个学生的总分及平均分)
struct student*g5(struct student *);  //实现第五个功能(按每个学生的总分由高到低排出名次表)
struct student*g7(struct student *);  //实现第六个功能(按每个学生的总分由低到高排出名次表)
struct student*g6(struct student *);   //实现第七个功能(按学号由小到大排出成绩表)
struct student*g8(struct student *);  //实现第八个功能(按姓名的字典顺序排出成绩表)
void g9(struct student *);     //实现第九个功能(按学号查询学生排名及其考试成绩)
void g10(struct student *);     //实现第十个功能(按姓名查询学生排名及其考试成绩考虑学生重名)
void g11(struct student *);     //实现第十一个功能(输出每一科目优秀、良好、中等、及格、不及格人数)
void g12(struct student *);     //实现第十二个功能(输出每个学生的学号、姓名、各科考试成绩、总分和平均分)
void g13(struct student *);     //实现第十三个功能(将每个学生的个人信息和成绩写入文件,可由键盘输入文件名)
int main(){
 int k,z;
 struct student *head;
 while(1){
    printf("┌-------------------------------------------------------------- ┐\n");
 printf("│                  欢迎使用学生成绩管理系统V3.0                      │\n");
 printf("│                                                                  │\n");
 printf("│  ┏┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┓  │\n");
 printf("│  ┇请输入您要选择的功能:                                         ┇  │\n");
 printf("│  ┇ 1.Read from a file                                         ┇  │\n");
 printf("│  ┇ 2.Append record manually                                   ┇  │\n");
 printf("│  ┇ 3.Calculate total and average score of every course        ┇  │\n");
 printf("│  ┇ 4.Calculate total and average score of every student       ┇  │\n");
 printf("│  ┇ 5.Sort in descending order by total score of every student ┇  │\n");
 printf("│  ┇ 6.Sort in ascending order by total score of every stuednet ┇  │\n");
 printf("│  ┇ 7.Sort in ascending order by number                        ┇  │\n");
 printf("│  ┇ 8.Sort in dictionary order by name                         ┇  │\n");
 printf("│  ┇ 9.Search by number                                         ┇  │\n");
 printf("│  ┇ 10.Search by name                                          ┇  │\n");
 printf("│  ┇ 11.Statistic analysis for every course                     ┇  │\n");
 printf("│  ┇ 12.List record                                             ┇  │\n");
 printf("│  ┇ 13.Write to a file                                         ┇  │\n");
 printf("│  ┇ 0.Exit                                                     ┇  │\n");
 printf("│  ┗┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┛  │\n");
 printf("│                                             Made By:Gong         │\n");
 printf("│                                                     Wan          │\n");
 printf("│                                                     Tian         │\n"); 
 printf("│                                                                  │\n");
 printf("│                                                                  │\n");
 printf("└------------------------------------------------------------------┘\n");
 printf("\n·请输入您要选择的功能:");
 scanf("%d",&k);
 while(k<0||k>13){
  printf("\n·您输入的信息有误,请重新输入:");
  fflush(stdin);
  scanf("%d",&k);
 }
 switch(k){
  case 1:{
   head=g1();
   break;
  }
  case 2:{
   head=g2();
   break;
  }
  case 3:{
   g3(head);
   break;
  }
  case 4:{
   head=g4(head); 
   break;
  }
  case 5:{
   head=g5(head);
   break;
  }
  case 6:{
   head=g6(head);
   break;
  }
  case 7:{
   head=g7(head);
   break;
  }
  case 8:{
   head=g8(head);
   break;
  }
  case 9:{
   g9(head);
   break;
  }
  case 10:{
   g10(head);
   break;
  }
  case 11:{
   g11(head);
   break;
  }
  case 12:{
   g12(head);
   break;
  }
  case 13:{
   g13(head);
   break;
  }
  case 0:{
   printf("\n\n感谢使用学生管理系统v3.0 ^.^ \n\n");
   exit(0);
      }
 }
 printf("您是否要退出系统(0.退出 1.不退出):");
 scanf("%d",&z); 
 switch(z){
  case 0:{
   printf("\n\n感谢使用学生管理系统v3.0 ^.^ \n\n");
   exit(0);
   break;
  }
  case 1:{
   break;
  }
 }
}
 return 0;
}
struct student*creat(void){
 int k;
 struct student *head,*end,*p;
 end=NULL;
 for(k=1;k<=a;k++){
  p=(struct student*)malloc(sizeof(struct student));
  p->next=NULL;
  if(end==NULL){
   head=p;
   end=p;
  }
  else{
   end->next=p;
   end=p;
  }
  end->next=NULL;
 }
 return head;
}
struct student*g1(void){
 FILE *fp;
 int i;
 int x;        //接受代表性别的数 
 char n,track[50]; 
 struct student *top,*q;
 a=1;
 printf("\n\n·请输入您要选择的学生信息文件的路径与文件名:");
 scanf("%s",track);
 while((fp=fopen(track,"r"))==NULL){
  printf("\n\n·文件打开失败,请重新输入您要选择的学生信息文件的路径与文件名:");
        fflush(stdin);
        scanf("%s",track);
 }
 while(!feof(fp)){     //判断文件中人数,同时将每个人信息保存到数组中。(feof)函数判断文件是否读完 
  n=fgetc(fp);
  if(n=='\n')
       a++;}
 rewind(fp);      //(rewind)函数将指针重新指向文件开头 
 top=creat();      //调用函数创建链表 ,并返回首地址 
 for(q=top;q!=NULL;q=q->next){
  fscanf(fp,"%s",&(q->name));
  fscanf(fp,"%d",&x);
  switch(x){
   case 1:q->sex=female;break;
   case 2:q->sex=male;break;
  }
  fscanf(fp,"%d",&(q->num));
  for(i=0;i<6;i++){
   fscanf(fp,"%d",&(q->score[i]));
  }
 }
 b=6;
 fclose(fp);
 printf("\n\n·您选择的文件中学生的数量为:%d\n",a); 
 return top;
} 
struct student*g2(void){
 int i,j,k;
 struct student *top,*q;
 i=1;
 printf("\n\n·请输入您想要输入的学生个数:");
 scanf("%d",&a);
 printf("\n\n·请输入您想要输入的科目个数:");
 scanf("%d",&b);
 top=creat();
 for(q=top;q!=NULL;q=q->next,i++){
  printf("·请输入第%d个学生的姓名:",i);
  scanf("%s",&(q->name));
  printf("·请选择学生的性别(1.female 2.male):");
  scanf("%d",&k);
  switch(k){
   case 1:q->sex=female;break;
   case 2:q->sex=male;break;
  }
  printf("·请输入学生的学号:");
  scanf("%d",&(q->num));
  for(j=0;j<b;j++){
   printf("·请输入学生第%d科的成绩",j+1);
   scanf("%d",&(q->score[j]));
  }
 }
 printf("·输入成功\n\n");
 return top;
}
void g3(struct student *top){
 struct student *q;
 int sub[6]={0};
 float ave2[6]={0};
 int i;
 for(q=top;q!=NULL;q=q->next)
 {
  for(i=0;i<b;i++)
  sub[i]=sub[i]+(q->score[i]);
 }
 for(i=0;i<b;i++)
  ave2[i]=sub[i]/(float)a;
 printf("\n        总分  平均分\n");
 for(i=0;i<b;i++)
  printf("科目<%d> %d   %.2f\n",i+1,sub[i],ave2[i]);
 printf("·计算成功!\n");
}
struct student*g4(struct student *top){
 struct student *q;
 int i;
 for(q=top;q!=NULL;q=q->next){
  q->sum=0;
  for(i=0;i<b;i++){
   q->sum=(q->sum)+(q->score[i]);
  }
  q->ave=(q->sum)/(float)6;
 }
 printf("\n姓名           总分 平均分\n");
 for(q=top;q!=NULL;q=q->next){
  printf("%-15s ",q->name);
  printf("%d %.2f\n",q->sum,q->ave);
 }
 printf("·计算成功!\n");
 return top;
}
struct student*g5(struct student *top){      //第五个功能,按每个学生的总分由高到低排出名次表
 struct student *p; 
 int i,j,k;
 int zscore,max,maxzscore; 
 int check[30]={0};            //建立数组,记录是否被输出过
 i=0;              //初始化序号
 printf("\n姓名           性别   学号     ");      //建立表头
 for(j=0;j<b;j++){
  printf("科目<%d>  ",j+1);
 }
 printf("总分    平均分 "); 
 for(k=1;k<=a;k++){
  p=top;            //调用链表
  maxzscore=0;        //初始化最大总分
  i=0; 
  while(p!= NULL){
   i++; 
   zscore=0;        //初始化总分   
   for(j=0;j<b;j++){
    zscore+=(p->score[j]);     //计算单人总分
   }
   if( maxzscore<zscore&&check[i-1]==0){     //判断当前最高分与该学生总分大小关系及输出过与否
    max=i;             //将该学生序号赋予max
    maxzscore=zscore;       //将该学生总分赋予最高分
   }
   p=p->next; 
  }
  p=top;           //使p回到链表头
  i=0;
 printf("\n"); 
  while(i!=max){
   i++;          //用序号控制循环,找到最大序号
   if(i==max){
    printf("%-15s",p->name);
    switch(p->sex){
     case male:printf("male   ");break;
     case female:printf("female ");break;
    }
    printf("%8d ",p->num);
    for(j=0;j<b;j++){
     printf("%d       ",p->score[j]);
    }
    printf(" %3d ",p->sum);
    printf(" %.2f",p->ave);
    printf("\n");
    check[i-1]=1;             //使该学生成为已输出过的状态
   }
   else{
    p=p->next;           //录入下一个学生的数据
   }
  }
 }
 return top;
}
struct student*g6(struct student *top){      //第六个功能,按每个学生的总分由低到高排出名次表
 struct student *p; 
 int i,j,k;
 int zscore,min,minzscore; 
 int check[30]={0};          //建立数组,记录是否被输出过
 i=0; 
 printf("\n姓名           性别   学号     "); 
 for(j=0;j<b;j++){
  printf("科目<%d>  ",j+1);
 }
 printf("总分    平均分 "); 
 printf("\n");
 for(k=1;k<=a;k++){
  p=top;             //调用链表
  minzscore=9999;      //初始化最小总分
  i=0; 
  while(p!= NULL){
   i++; 
   zscore=0; 
   for(j=0;j<b;j++){        //计算单人总分
    zscore+=(p->score[j]); 
   }
   if( minzscore>zscore&&check[i-1]==0){    //判断当前最低分与该学生总分大小关系及输出过与否
    min=i;           //将该学生序号赋予max
    minzscore=zscore;        //将该学生总分赋予最低分
   }
   p=p->next; 
  }
  p=top;               //使p回到链表头
  i=0;
  while(i!=min){            //用序号控制循环,找到最小序号
   i++;
   if(i==min){
    printf("%-15s",p->name);
    switch(p->sex){
     case male:printf("male   ");break;
     case female:printf("female ");break;
    }
    printf("%8d ",p->num);
    for(j=0;j<b;j++){
     printf("%d       ",p->score[j]);
    }
    printf(" %3d ",p->sum);
    printf(" %.2f",p->ave);
    printf("\n");
    check[i-1]=1;         //使该学生成为已输出过的状态
   }
   else{
    p=p->next;
   }
  }
 }
 return top;
}
struct student*g7(struct student *top){        
 struct student *p0,*p,*q,*k;
  bool flag;
  flag=true;
  while(flag){           
  flag=false;
  p0=top;
  p=p0->next;
  if((p0->num)>(p->num)){        
   p0->next=p->next;
   p->next=p0;
   top=p;
      flag=true;
  }
  for(p0=top,p=p0->next,q=p->next;q->next!=NULL;p0=p0->next,p=p->next,q=q->next){
   if((p->num)>(q->num)){
    p0->next=q;
       p->next=q->next;
    q->next=p;
    k=p;
    p=q;
    q=k;
       flag=true;
   }}
  if((p->num)>(q->num)){       
   p0->next=q;
   q->next=p;
   p->next=NULL;
   flag=true;
  }
 }
 g12(top);
 return top;
}
struct student*g8(struct student *top){
 struct student *p0,*p,*q,*k;
  bool flag;
  flag=true;
  while(flag){        
  flag=false;
  p0=top;
  p=p0->next;
  if(strcmp(p0->name,p->name)>0){      
   p0->next=p->next;
   p->next=p0;
   top=p;
      flag=true;
  }
  p0=top;
  p=p0->next;
  q=p->next;
  while(q->next!=NULL){      
   if(strcmp(p->name,q->name)>0){
    p0->next=q;
       p->next=q->next;
    q->next=p;
    k=p;
    p=q;
    q=k;
       flag=true;
   }
   p0=p0->next;
   p=p->next;
   q=q->next;
  }
  if(strcmp(p->name,q->name)>0){      
   p0->next=q;
   q->next=p;
   p->next=NULL;
   flag=true;
  }
 
 }
 g12(top);
 return top;
}
void g9(struct student *top){
      struct student *q;
   int i,w=0,k=0,p=0,m=0,g=0,cc,j;
      int max=0; 
      int zong[30]={0},check[30]={0};
      j=0;
      while(j!=1){
   printf("·请输入学号:");
   scanf("%d",&i);
   for(q=top;q!=NULL;q=q->next){
    if(q->num==i){
     j=1;
    }
   }
   printf("您输入的信息有误\n");
   }
   for(q=top;q!=NULL;q=q->next){
    if(q->num==i){
     for(cc=0;cc<b;cc++){
      printf("第%d科成绩为:%d\n",cc+1,q->score[cc]);
         w=q->score[cc]+w;}
     }
  }
      for(q=top;q!=NULL;q=q->next){
    for(i=0;i<b;i++){
     zong[g]+=q->score[i];}
     g++;
    }
   while(p!=1){
      for(i=0;i<g;i++){
    if(zong[i]>max&&check[i]==0){
     max=zong[i];
     m=i;}
  }
   check[m]=1;
   k++;
   if(max==w){
    printf("·第%d名\n",k);
    p=1;}
   max=0;
      }
}
void g10(struct student *top){
      struct student *q;
   char nam[20];
   int i=0,w=0,k=0,check[30]={0},p=0,zong[30]={0},g=0,m,max,cc,j;
   j=0;
   while(j!=1){
   printf("·请输入姓名");
   scanf("%s",&nam);
   for(q=top;q!=NULL;q=q->next){
    if(strcmp(q->name,nam)==0){
     j=1;
    } 
   }
   printf("您输入的信息有误\n");}
   for(q=top;q!=NULL;q=q->next){
    if(strcmp(q->name,nam)==0){
     i++;}}
   if(i>1){
    g9(top);}
   else{
        for(q=top;q!=NULL;q=q->next){
    if(strcmp(q->name,nam)==0){
     for(cc=0;cc<b;cc++){
      printf("第%d科成绩为%d\n",cc+1,q->score[cc]);
      w=w+q->score[cc];}}}
      for(q=top;q!=NULL;q=q->next){
    for(i=0;i<b;i++){
     zong[g]+=q->score[i];}
   g++;}
   while(p!=1){
      for(i=0;i<g;i++){
    if(zong[i]>max&&check[i]==0){
     max=zong[i];
     m=i;}}
   check[m]=1;
   k++;
   if(max==w){
    printf("·第%d名\n",k);
    p=1;}
   max=0;
}}}
void g11(struct student *top){ 
 struct student *q;
 int i,c[6][5]={0},k,j;
    float d[6][5]={0};
    char track[50];
    FILE *fp;
 for(i=0;i<b;i++){
  for(q=top;q!=NULL;q=q->next){
   k=(q->score[i])/10;
   switch(k){
   case 0:
   case 1:
   case 2:
   case 3:
   case 4:
   case 5:c[i][0]++;break;
   case 6:c[i][1]++;break;
   case 7:c[i][2]++;break;
   case 8:c[i][3]++;break;
   case 9:c[i][4]++;break;
   }
  }
 }
 for(i=0;i<b;i++){
 for(j=0;j<5;j++){
  d[i][j]=(c[i][j]/(float)a)*100;}}
 printf("·请输入您想要创建的文件的路径与名称:");
 scanf("%s",track);
 while((fp=fopen(track,"w"))==NULL){
   printf("\n\n·文件创建失败,请重新输入您要创建的学生信息文件的路径与名称:");
            fflush(stdin);
            scanf("%s",track);
 } 
 for(i=0;i<b;i++){
  fprintf(fp,"科目<%d>\n",i+1);
  fprintf(fp,"·优秀:   %d 人 %.2f%\n",c[i][4],d[i][4]);
  fprintf(fp,"·良好:   %d 人 %.2f%\n",c[i][3],d[i][3]);
  fprintf(fp,"·中等:   %d 人 %.2f%\n",c[i][2],d[i][2]);
  fprintf(fp,"·及格:   %d 人 %.2f%\n",c[i][1],d[i][1]);
  fprintf(fp,"·不及格: %d 人 %.2f%\n",c[i][0],d[i][0]);
 }
 fclose(fp);
 printf("·信息录入成功\n"); 
}
void g12(struct student *top){
 struct student *p;
 int i;
 printf("┌————————┬—————┬——————┐\n");
 printf("│     姓名       │   性别   │    学号    │");
 for(i=0;i<b;i++){
  printf("科目<%d> ",i+1);
 } 
 printf("\n"); 
 for(p=top;p!=NULL;p=p->next){
  printf("│%-15s │",p->name);
  switch(p->sex){
   case male:printf("male      │");break;
   case female:printf("female    │");break;
  }
  printf("  %8d  │",p->num);
  for(i=0;i<b;i++){
   printf("%3d     ",p->score[i]);
  }
  printf("\n");
 }
 printf("└————————┴—————┴——————┘\n");
}
void g13(struct student *top){
 FILE *fp;
 struct student *p;
 int i,j;
 char track[50];
 printf("\n·请输入您想要创建的文件的路径与名称:");
 scanf("%s",track);
 while((fp=fopen(track,"w"))==NULL){
   printf("\n·文件创建失败,请重新输入您要创建的学生信息文件的路径与名称:");
            fflush(stdin);
            scanf("%s",track);
 } 
 fprintf(fp,"\n姓名           性别   学号     "); 
 for(j=0;j<b;j++){
  fprintf(fp,"科目<%d>  ",j+1);
 }
 fprintf(fp,"总分    平均分 "); 
 fprintf(fp,"\n");
 for(p=top;p!=NULL;p=p->next){
  fprintf(fp,"%-15s",p->name);
  switch(p->sex){
   case male:fprintf(fp,"male   ");break;
   case female:fprintf(fp,"female ");break;
  }
  fprintf(fp,"  %d ",p->num);
  for(i=0;i<b;i++){
   fprintf(fp,"  %5d ",p->score[i]);
  }
  fprintf(fp,"   %3d ",p->sum);
  fprintf(fp,"  %.2f",p->ave);
  fprintf(fp,"\n");
 }
 fclose(fp);
 printf("·信息录入成功\n"); 
}

时间确实久了,存放的文件找不到了,供参考,也可以根据代码倒退数据在文件中存放格式。

猜你喜欢

转载自blog.csdn.net/qq_39187019/article/details/88243089
今日推荐