C语言成绩统计系统#include <stdio.h>#include <stdlib.h>#include <string.h>int shoudsave=0; /* 为后面判断是否改动资料做铺垫*/ struct student{char num[11];/*学号*/char name[20];int cgrade;int mgrade;int egrade;int totle;int ave;float ajd;//平均绩点};typedef struct node{struct student data;struct node *next;} Node,*Link;void menu(){printf("************************************************************************ ********");printf("\t1输入学生资料\t\t\t\t\t2删除学生资料\n");printf("\t3查询学生资料\t\t\t\t\t4修改学生资料\n");printf("\t5显示学生资料\t\t\t\t\t6统计学生成绩\n");printf("\t7排序学生成绩\t\t\t\t\t8保存学生资料\n");printf("\t9获取帮助信息\t\t\t\t\t0退出系统\n");printf("************************************************************************ ********\n");}void printstart(){printf("--------------------------------------------------------------------------------\n");}void Wrong(){printf("\n=====>提示:输入错误!\n");}void Nofind(){printf("\n=====>提示:没有找到该学生!\n");}void printc() /* 本函数用于输出中文标题*/{printf(" 学号\t 姓名英语成绩数学成绩C语言成绩总分平均分平均绩点\n");}void printe(Node *p)/*本函数用于输出中文标题下的具体内容*/{printf("%-12s%s\t%d\t %d\t %d\t %d\t %d\t %2.1f\n",p->data.num,p->d ,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.totle,p->data.ave,p->data.ajd);}Node *Locate(Link l,char findmess[],char nameornum[]) /*该函数用于定位连表中符合要求的接点,并返回该指针*/{Node *r;if(strcmp(nameornum,"num")==0) /*按学号查询*/{r=l->next;while(r){if(strcmp(r->data.num,findmess)==0)return r;r=r->next;}}else if(strcmp(nameornum,"name")==0) /*按姓名查询*/{r=l->next;while(r){if(strcmp(r->,findmess)==0)return r;r=r->next;}}return 0;}float jd(Node *p){int b[3],i;float sum=0.0,a;b[0]=p->data.cgrade;b[1]=p->data.mgrade;b[2]=p->data.egrade;for( i=0;i<=2;i++){if(b[i]>=90) a=5.0 ;else if(b[i]>=85) a=4.5;else if(b[i]>=80) a=4.0;else if(b[i]>=75) a=3.5;else if(b[i]>=70) a=3.0;else if(b[i]>=65) a=2.5;else if(b[i]>=60) a=2.0;else a=0.0 ;sum+=a;}return sum/3;}void Add(Link l) /*增加学生*/{Node *p,*r,*s;char num[11];r=l;s=l->next;while(r->next!=NULL)r=r->next;while(1){k0: printf("请你输入学号(以'0'返回上一级菜单)");scanf("%s",num);getchar();if(strcmp(num,"0")==0)break;while(s){if(strcmp(s->data.num,num)==0){printf("=====>提示:学号为'%s'的学生已经存在,若要修改请你选择'4' 修改!\n",num);printstart();printc();printe(s);printstart();printf("\n");return;}s=s->next;}p=(Node *)malloc(sizeof(Node));strcpy(p->data.num,num);k1: printf("请你输入姓名(以'101'返回主菜单,'102'返回上一级菜单):"); scanf("%s",p->);getchar();//程序暂停等待输入if(strcmp(p->,"101")==0){free(p);return;}else if(strcmp(p->,"102")==0)goto k0;k2:printf("请你输入c语言成绩(以'101'返回主菜单,'102'返回上一级菜单):"); scanf("%d",&p->data.cgrade);getchar();if(p->data.cgrade==101){free(p);//释放内存return;}else if(p->data.cgrade==102)//此处内存不能释放goto k1;//虽然102被输入c语言成绩,但会再次输入将其覆盖k3:printf("请你输入数学成绩(以'101'返回主菜单,'102'返回上一级菜单):"); scanf("%d",&p->data.mgrade);getchar();if(p->data.mgrade==101){free(p);return;}else if(p->data.mgrade==102)goto k2;K4:printf("请你输入英语成绩(以'101'返回主菜单,'102'返回上一级菜单):");scanf("%d",&p->data.egrade);getchar();if(p->data.egrade==101){free(p);return;}else if(p->data.egrade==102)goto k3;p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrade;p->data.ave=p->data.totle / 3;p->data.ajd=jd(p);/*信息输入已经完成*/p->next=NULL;r->next=p;r=p;shoudsave=1;//为后面改动数据判断做铺垫}}void Qur(Link l) /*查询学生*/{int sel;char findmess[20];Node *p;if(!l->next){printf("\n=====>提示:没有资料可以查询!\n");return;}a0:printf("\n=====>1按学号查找\n=====>2按姓名查找\n");scanf("%d",&sel);if(sel==1)/*学号*/{printf("请你输入要查找的学号(以'0'返回主菜单,'1'返回上一级菜单):"); scanf("%s",findmess);if(strcmp(findmess,"1")==0)goto a0;else if(strcmp(findmess,"0")==0)return;else{p=Locate(l,findmess,"num");if(p){printf("\t\t\t\t查找结果\n");printstart();printc();printe(p);printstart();}elseNofind();}}else if(sel==2) /*姓名*/{printf("请你输入要查找的姓名(以'0'返回主菜单,'1'返回上一级菜单):"); scanf("%s",findmess);if(strcmp(findmess,"0")==0)return;else if(strcmp(findmess,"1")==0)goto a0;else{p=Locate(l,findmess,"name");if(p){printf("\t\t\t\t查找结果\n");printstart();printc();printe(p);printstart();}elseNofind();}}elseWrong();}void Del(Link l) /*删除*/{void Save(Link l);int sel;Node *p,*r,*d=NULL,*j=NULL;char findmess[20],ch;if(!l->next){printf("\n=====>提示:没有资料可以删除!\n");return;}k:printf("\n=====>1按学号删除\n=====>2按姓名删除\n=====>3全部删除\n=====>0返回上一级菜单\n");scanf("%d",&sel);if(sel==0)return;if(sel==3){k1:printf("========》确认全部删除(y/n)?\n");getchar();scanf("%c",&ch);if(ch=='y'){d=l->next;while(d){ j=d;d=d->next;free(j);}l->next=NULL;printf("数据已清空!");Save(l);return ;}else if(ch=='n'){goto k;}else{printf("输入错误!");goto k1;}}if(sel==1){printf("请你输入要删除的学号:");scanf("%s",findmess);p=Locate(l,findmess,"num");if(!p){do{printf("您输入的学号不存在,请重新输入");//当输入学号未找到相应学生时,可以重新输入,而不会跳出当前操作平台scanf("%s",findmess);p=Locate(l,findmess,"num");}while(p==NULL);}if(p){r=l;while(r->next!=p)r=r->next;r->next=p->next;free(p);printf("\n=====>提示:该学生已经成功删除!\n");Save(l);//======shoudsave=1;}}else if(sel==2){printf("请你输入要删除的姓名:");//待改动、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、scanf("%s",findmess);p=Locate(l,findmess,"name");if(!p){do{printf("请重新输入");//当输入学号未找到相应学生时,可以重新输入,而不会跳出当前操作平台scanf("%s",findmess);p=Locate(l,findmess,"name");}while(p==NULL);}if(p){r=l;while(r->next!=p)r=r->next;r->next=p->next;free(p);printf("\n=====>提示:该学生已经成功删除!\n");Save(l);shoudsave=1;}}elseWrong();}void Modify(Link l)//修改学生资料{Node *p;char findmess[20];if(!l->next){printf("\n=====>提示:没有资料可以修改!\n");return;}c0: printf("请你输入要修改的学生学号(以'0'返回主菜单):");scanf("%s",findmess);if(strcmp(findmess,"0")==0)return;p=Locate(l,findmess,"num");if(p){c1: printf("请你输入新的c语言成绩(原来是%d分)(以'101'返回主菜单,'102'返回上一菜单):",p->data.cgrade);scanf("%d",&p->data.cgrade);if(p->data.cgrade==101)return;else if(p->data.cgrade==102)goto c0;c2: printf("请你输入新的英语成绩(原来是%d分)(以'101'返回主菜单,'102'返回上一菜单):",p->data.egrade);scanf("%d",&p->data.egrade);if(p->data.egrade==101)return;else if(p->data.egrade==102)goto c1;printf("请你输入新的高数成绩(原来是%d分)(以'101'返回主菜单,'102'返回上一菜单):",p->data.mgrade);scanf("%d",&p->data.mgrade);if(p->data.mgrade==101)return;else if(p->data.mgrade==102)goto c2;p->data.totle=p->data.cgrade+p->data.egrade+p->data.mgrade;p->data.ave=p->data.totle/3.0;printf("\n=====>提示:资料修改成功!\n");shoudsave=1;}elseNofind();}void Disp(Link l)//显示学生资料{int count=0;Node *p;p=l->next;if(!p){printf("\n=====>提示:没有资料可以显示!\n");return;}printf("\t\t\t\t显示结果\n");printstart();printc();printf("\n");while(p){printe(p);p=p->next;}printstart();printf("\n");}Node *select_order(Node *head,int a)//排序学生资料{Node *first; /*排列后有序链的表头指针*/Node *tail; /*排列后有序链的表尾指针*/Node *p_min; /*保留键值更小的节点的前驱节点的指针*/Node *min; /*存储最小节点*/Node *p; /*当前比较的节点*/float bj;first = NULL;//带存入有序数据的链表while (head != NULL) /*在原链表中找键值最小的节点。