1、学生成绩管理系统基本C语言编写/代码版权所有,不要#include stdio.h #include stdlib.h #include string.h #include conio.hcopy,仅供参考学习。/标准输入输出函数库/标准函数库/字符串函数库/屏幕操作函数库#defineHEADER1 *学生成绩信息* nn#defineHEADER2 学 号姓名计算机数学 英语总分平均分名次 nn#define FORMAT %-10s %-10s %5d %5d %5d %5d%.3f %4d nDATA#define p-data.num,p-data.name,p-data.egrad
2、e,p-data.mgrade,p-data.cgrade,p-data.total,p-data.a ve,p-data.mingciint saveflag=0; /是否需要存盘的标志变量/定义与学生有关的数据结构/标记为 student/学号/姓名 /计算机成绩 /数学成绩 /英语成绩/总分/平均分/名次typedef struct student char num12; char name15; int cgrade; int mgrade; int egrade; int total;float ave; int mingci;sqlist;/定义每条记录或结点的数据结构,标记为:
3、nodetypedef struct nodestruct student data;/ 数据域struct node *next; /指针域Node,*Link; /Node 为 node 类型的结构变量, *Link 为 node 类型的指针变量void menu() /主菜单system(cls);/调用DOS 命令,清屏.与 clrscr() 功能相同printf(n);printf(学生成绩管理信息系统主菜单 nn);printf(*n);printf($1、添加记录6、 统计记录$n);printf($2、删除记录7、 排序记录$n);printf($3、查找记录8、保存记录$n)
4、;printf($4、修改记录9、显示记录$n);printf($5、插入信息0、退出系统$n);printf(*n);void printheader() / 格式化输出表头printf(HEADER1);printf(HEADER2);void printdata(Node *pp) / 格式化输出表中数据Node* p;p=pp;printf(FORMA T,DA TA);void Wrong() /输出按键错误信息printf(nnnnn*Error: 输入错误 !请按任意键继续 !*n); getchar();void Nofind() /输出未查找此学生的信息 printf(n=
5、未查找此学生的信息 !n);void Disp(Link l) /显示单链表 l 中存储的学生记录,内容为 student 结构中定义的内容Node *p;p=l-next; /l 存储的是单链表中头结点的指针,该头结点没有存储学生信 息,指针域指向的后继结点才有学生信息if(!p) /p=NULL,NUll 在 stdlib 中定义为 0 printf(n= 无学生的记录 !n); getchar();return;/输出表格头部printf(nn); printheader();while(p) /逐条输出链表中存储的学生信息printdata(p);p=p-next; / 移动直下一个结
6、点getchar(); getchar();/*作用:用于定位链表中符合要求的节点,并返回指向该节点的指针参数: findmess 保存要查找的具体内容 ; nameornum 保存按什么查找 ;在单链表 l 中查找 ;*/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) /若找到 findmess 值的学号 return r;r=r-next;else if
7、(strcmp(nameornum,name)=0) /按姓名查询r=l-next;while(r) if(strcmp(r-data.name,findmess)=0) / 若找到 findmess 值的学生姓名 return r;r=r-next;return 0; / 若未找到,返回一个空指针/输入字符串,并进行长度验证 (长度 lens)printf(n 超出长度范围,重新输入 ! n); / 进行长度校验,超过 lens 值重新输入while(strlen(n)lens);strcpy(t,n); / 将输入的字符串拷贝到字符串 t 中 /输入分数,0 =分数100 | t100 |
8、 tnext;system(cls);Disp(l); /先打印出已有的学生信息 while(r-next!=NULL)r=r-next; /将指针移至于链表最末尾,准备添加记录while(1) /一次可输入多条记录,直至输入学号为 0 的记录结点添加操作while(1) /输入学号, 保证该学号没有被使用, 若输入学号为 0,则退出添加记录操作stringinput(num,12,n输入学号 (按“0”返回菜单 !):); /格式化输入学号并检验flag=0; if(strcmp(num,0)=0) / 输入为 0,则退出添加操作,返回主界面return;s=l-next;while(s)
9、/查询该学号是否已经存在,若存在则要求重新输入一个未被占用的学号 if(strcmp(s-data.num,num)=0) flag=1; break; s=s-next;if(flag=1) /提示用户是否重新输入 getchar(); printf(= 学号 %s 存在 ,重试 ?(y/n):,num); scanf(%c,&ch); if(ch=y|ch=Y) continue;elsereturn;else break;p=(Node *)malloc(sizeof(Node); /申请内存空间 if(!p)printf(n 内存空间申请失败 ! ); / 如没有申请到,打印提示信息
10、return ; /返回主界面 strcpy(p-data.num,num); /将字符串 num 拷贝到 p-data.num 中stringinput(p-data.name,15, 姓名 :);p-data.cgrade=numberinput( 计算机 0-100:); / 输入并检验分数,分数必须在 0 100 之间p-data.mgrade=numberinput( 数学 0-100:); /输入并检验分数,分数必须在 0100 之间p-data.egrade=numberinput( 英语 0-100:); /输入并检验分数,分数必须在 0100 之间p-data.total=p
11、-data.egrade+p-data.cgrade+p-data.mgrade; / 计算总分 p-data.ave=(float)(p-data.total/3); /计算平均分p-data.mingci=0;r-next=p; / 将新建的结点加入链表尾部中p-next=NULL; / 表明这是链表的尾部结点r=p;saveflag=1;return ;/按学号或姓名,查询学生记录void Qur(Link l)int select; /1: 按学号查, 2:按姓名查,其他:返回主界面(菜单)char searchinput20; /保存用户输入的查询内容Node *p;if(!l-ne
12、xt) /若链表为空system(cls); printf(n= 无此学生的记录 !n); getchar();return;system(cls);printf(n =1 按学号查询 =2 按名字查询 n);printf( 请选择 1,2:);scanf(%d,&select);if(select=1) /按学号查询stringinput(searchinput,12, 请输入现有学生的学号 :); p=Locate(l,searchinput,num);/ 在 l 中查找学号为 searchinput 值的节点,并返回节 点的指针if(p) printheader(); printdata
13、(p); printf( 按任意键返回 !);getchar();elseNofind(); getchar();else if(select=2) /按姓名查询stringinput(searchinput,15, 请输入现有学生的姓名 :); p=Locate(l,searchinput,name);if(p) printheader(); printdata(p);printf( 按任意键返回 !); getchar();elseNofind(); getchar();elseWrong();getchar();/删除学生记录:先找到保存该学生记录的节点,然后删除该节点 void Del
14、(Link l)int sel;Node *p,*r;char findmess20; if(!l-next)system(cls);printf(n= 无此学生记录 !n);getchar();return; system(cls);Disp(l);printf(n =1 按学号删除 =2 按姓名删除 n);printf( 请选择 1,2:);scanf(%d,&sel);if(sel=1)stringinput(findmess,12, 请输入现有学生的学号 :); p=Locate(l,findmess,num);if(p)r=l;while(r-next!=p)r=r-next;r-n
15、ext=p-next; /将 p 所指节点从链表中去除free(p); /释放内存空间printf(n= 删除成功 !n);getchar(); saveflag=1;elseNofind();getchar();else if(sel=2) /先按姓名查询到该记录所在的节点stringinput(findmess,15, 请输入现有学生的姓名 ); p=Locate(l,findmess,name);if(p)r=l;while(r-next!=p)r=r-next;r-next=p-next;free(p); printf(n= 删除成功 !n); getchar();saveflag=1
16、;elseNofind(); getchar();elseWrong();getchar();/修改学生记录。先按输入的学号查询到该记录,然后提示用户修改学号之外的值,学号不 能修改void Modify(Link l)Node *p;char findmess20; if(!l-next)system(cls);printf(n= 无此学生记录 !n); getchar();return;system(cls);printf( 修改学生记录 !);Disp(l);stringinput(findmess,12, 请输入现有学生的学号 :); /输入并检验该学号/查询到该节点/ 若 p!=NU
17、LL, 表明已经找到该p=Locate(l,findmess,num);if(p)节点printf( 学号 :%s,n,p-data.num);printf( 姓名 :%s,p-data.name);stringinput(p-data.name,15, 输入新的姓名 :); printf( 计算机 :%d,p-data.cgrade);p-data.cgrade=numberinput( 计算机 0-100:); printf( 数学 :%d,p-data.mgrade);p-data.mgrade=numberinput( 数学 0-100:); printf( 英语 :%d,p-data
18、.egrade);p-data.egrade=numberinput( 英语 0-100:);p-data.total=p-data.egrade+p-data.cgrade+p-data.mgrade;p-data.ave=(float)(p-data.total/3);p-data.mingci=0;printf(n= 修改成功 !n);Disp(l);saveflag=1;elseNofind(); getchar();/插入记录 :按学号查询到要插入的节点的位置,然后在该学号之后插入一个新节点。 void Insert(Link l)Link p,v,newinfo; /p 指向插入位
19、置, newinfo 指新插入记录char ch,n um12,s12; s保存插入点位置之前的学号 ,n um保存输入的新记录的学号int flag=0;v=l-next; system(cls);Disp(l);while(1)stringinput(s,12, 按学号查询到要插入的节点的位置 :);flag=0;v=l-next;while(v) /查询该学号是否存在, flag=1 表示该学号存在 if(strcmp(v-data.num,s)=0) flag=1;break; v=v-next;if(flag=1)break; /若学号存在,则进行插入之前的新记录的输入操作elseg
20、etchar();printf(n= 学号 %s 存在,重试 ?(y/n):,s);scanf(%c,&ch);if(ch=y|ch=Y)continue;elsereturn;/以下新记录的输入操作与 Add() 相同 stringinput(num,12, 请输入新的学号 ! :); v=l-next;while(v)if(strcmp(v-data.num,num)=0) printf(=Sorry, 新学号 :%s 已存在 !n,num); printheader();printdata(v); printf(n); getchar(); return;v=v-next;newinfo
21、=(Node *)malloc(sizeof(Node);if(!newinfo)printf(n 内存申请失败 ! ); / 如没有申请到,打印提示信息 return ; / 返回主界面strcpy(newinfo-data.num,num); stringinput(newinfo-data.name,15, 姓名 :); newinfo-data.cgrade=numberinput( 计算机 0-100:); newinfo-data.mgrade=numberinput( 数学 0-100:); newinfo-data.egrade=numberinput( 英语 0-100:);
22、 newinfo-data.total=newinfo-data.egrade+newinfo-data.cgrade+newinfo-data.mgrade; newinfo-data.ave=(float)(newinfo-data.total/3);newinfo-data.mingci=0; newinfo-next=NULL;saveflag=1; / 在 main() 有对该全局变量的判断,若为 1,则进行存盘操作将指针赋值给 p,因为 l 中的头节点的下一个节点才实际保存着学生的记录p=l-next;while(1) if(strcmp(p-data.num,s)=0) / 在链
23、表中插入一个节点 newinfo-next=p-next; p-next=newinfo; break;p=p-next;Disp(l);printf(nn); getchar();void Tongji(Link l)Node *pm,*pe,*pc,*pt; /用于指向分数最高的节点Node *r=l-next;int countc=0,countm=0,counte=0; / 保存三门成绩中不及格的人数 fflush(stdin);if(!r)system(cls);printf(n= 无此学生记录 !n);getchar();return ;system(cls);Disp(l);pm
24、=pe=pc=pt=r;while(r)if(r-data.cgradedata.mgradedata.egradedata.cgrade=pc-data.cgrade) pc=r;if(r-data.mgrade=pm-data.mgrade) pm=r; if(r-data.egrade=pe-data.egrade) pe=r;if(r-data.total=pt-data.total) pt=r; r=r-next;printf(n 统计结果 n);printf(计算机 不及格:d (人)n,countc);printf(数学 不及格:%d (人)n”,countm);printf(英
25、语 不及格:%d (人)n”,counte);printf( n);printf( 总分最高分 姓名 :%s 分数为 :%dn,pt-data.name,pt-data.total);printf( 英语最高分 姓名 :%s 分数为 :%dn,pe-data.name,pe-data.egrade);printf( 数学最高分 姓名 :%s 分数为 :%dn,pm-data.name,pm-data.mgrade);printf( 计算机最高分 姓名 :%s 分数为 :%dn,pc-data.name,pc-data.cgrade);printf(nn 按任意键返回 !);getchar();/利用插入排序法实现单链表的按总分字段的降序排序,从高到低 void Sort(Link l)Link ll;ll=(Node*)malloc(sizeof(Node); if(!ll)printf(n 内存申请失败 ! ); return ; ll-
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1