学生成绩管理系统基本C语言编写汇编.docx
- 文档编号:11542072
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:28
- 大小:24.45KB
学生成绩管理系统基本C语言编写汇编.docx
《学生成绩管理系统基本C语言编写汇编.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统基本C语言编写汇编.docx(28页珍藏版)》请在冰点文库上搜索。
学生成绩管理系统基本C语言编写汇编
//代码版权所有,不要copy,仅供参考学习。
#include"stdio.h"//标准输入输出函数库
#include"stdlib.h"//标准函数库
#include"string.h"//字符串函数库
#include"conio.h"//屏幕操作函数库
#defineHEADER1"***************************学生成绩信息******************************\n\n"
#defineHEADER2"学号姓名计算机数学英语总分平均分名次\n\n"
#defineFORMAT"%-10s%-10s%5d%5d%5d%5d%.3f%4d\n"
#defineDATAp->data.num,p->data.name,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.total,p->data.ave,p->data.mingci
intsaveflag=0;//是否需要存盘的标志变量
//定义与学生有关的数据结构
typedefstructstudent//标记为student
{
charnum[12];//学号
charname[15];//姓名
intcgrade;//计算机成绩
intmgrade;//数学成绩
integrade;//英语成绩
inttotal;//总分
floatave;//平均分
intmingci;//名次
}sqlist;
//定义每条记录或结点的数据结构,标记为:
node
typedefstructnode
{
structstudentdata;//数据域
structnode*next;//指针域
}Node,*Link;//Node为node类型的结构变量,*Link为node类型的指针变量
voidmenu()//主菜单
{
system("cls");//调用DOS命令,清屏.与clrscr()功能相同
printf("\n");
printf("学生成绩管理信息系统主菜单\n\n");
printf("**************************************************\n");
printf("$1、添加记录6、统计记录$\n");
printf("$2、删除记录7、排序记录$\n");
printf("$3、查找记录8、保存记录$\n");
printf("$4、修改记录9、显示记录$\n");
printf("$5、插入信息0、退出系统$\n");
printf("**************************************************\n");
}
voidprintheader()//格式化输出表头
{
printf(HEADER1);
printf(HEADER2);
}
voidprintdata(Node*pp)//格式化输出表中数据
{
Node*p;
p=pp;
printf(FORMAT,DATA);
}
voidWrong()//输出按键错误信息
{
printf("\n\n\n\n\n**********Error:
输入错误!
请按任意键继续!
!
**********\n");
getchar();
}
voidNofind()//输出未查找此学生的信息
{
printf("\n=====>未查找此学生的信息!
\n");
}
voidDisp(Linkl)//显示单链表l中存储的学生记录,内容为student结构中定义的内容
{
Node*p;
p=l->next;//l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息
if(!
p)//p==NULL,NUll在stdlib中定义为0
{
printf("\n=====>无学生的记录!
\n");
getchar();
return;
}
printf("\n\n");
printheader();//输出表格头部
while(p)//逐条输出链表中存储的学生信息
{
printdata(p);
p=p->next;//移动直下一个结点
}
getchar();getchar();
}
/*作用:
用于定位链表中符合要求的节点,并返回指向该节点的指针
参数:
findmess[]保存要查找的具体内容;nameornum[]保存按什么查找;在单链表l中查找;*/
Node*Locate(Linkl,charfindmess[],charnameornum[])
{
Node*r;
if(strcmp(nameornum,"num")==0)//按学号查询
{
r=l->next;
while(r)
{
if(strcmp(r->data.num,findmess)==0)//若找到findmess值的学号
returnr;
r=r->next;
}
}
elseif(strcmp(nameornum,"name")==0)//按姓名查询
{
r=l->next;
while(r)
{
if(strcmp(r->data.name,findmess)==0)//若找到findmess值的学生姓名
returnr;
r=r->next;
}
}
return0;//若未找到,返回一个空指针
}
//输入字符串,并进行长度验证(长度 voidstringinput(char*t,intlens,char*notice) { charn[255]; do { printf(notice);//显示提示信息 scanf("%s",n);//输入字符串 if(strlen(n)>lens) printf("\n超出长度范围,重新输入! \n");//进行长度校验,超过lens值重新输入 } while(strlen(n)>lens); strcpy(t,n);//将输入的字符串拷贝到字符串t中 } //输入分数,0<=分数<=100) intnumberinput(char*notice) { intt=0; do { printf(notice);//显示提示信息 scanf("%d",&t);//输入分数 if(t>100||t<0) printf("\n分数必须在0到100之间! \n");//进行分数校验 } while(t>100||t<0); returnt; } //增加学生记录 voidAdd(Linkl) { Node*p,*r,*s;//实现添加操作的临时的结构体指针变量 charch,flag=0,num[12]; r=l; s=l->next; 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)//查询该学号是否已经存在,若存在则要求重新输入一个未被占用的学号 { 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; else return; } else { break; } } p=(Node*)malloc(sizeof(Node));//申请内存空间 if(! p) { printf("\n内存空间申请失败! ");//如没有申请到,打印提示信息 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]: ");//输入并检验分数,分数必须在0-100之间 p->data.egrade=numberinput("英语[0-100]: ");//输入并检验分数,分数必须在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; r->next=p;//将新建的结点加入链表尾部中 p->next=NULL;//表明这是链表的尾部结点 r=p; saveflag=1; } return; } //按学号或姓名,查询学生记录 voidQur(Linkl) { intselect;//1: 按学号查,2: 按姓名查,其他: 返回主界面(菜单) charsearchinput[20];//保存用户输入的查询内容 Node*p; if(! l->next)//若链表为空 { 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(p); printf("按任意键返回! "); getchar(); } else Nofind(); getchar(); } elseif(select==2)//按姓名查询 { stringinput(searchinput,15,"请输入现有学生的姓名: "); p=Locate(l,searchinput,"name"); if(p) { printheader(); printdata(p); printf("按任意键返回! "); getchar(); } else Nofind(); getchar(); } else Wrong(); getchar(); } //删除学生记录: 先找到保存该学生记录的节点,然后删除该节点 voidDel(Linkl) { intsel; Node*p,*r; charfindmess[20]; 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->next=p->next;//将p所指节点从链表中去除 free(p);//释放内存空间 printf("\n=====>删除成功! \n"); getchar(); saveflag=1; } else Nofind(); getchar(); } elseif(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; } else Nofind(); getchar(); } else Wrong(); getchar(); } //修改学生记录。 先按输入的学号查询到该记录,然后提示用户修改学号之外的值,学号不能修改 voidModify(Linkl) { Node*p; charfindmess[20]; if(! l->next) { system("cls"); printf("\n=====>无此学生记录! \n"); getchar(); return; } system("cls"); printf("修改学生记录! "); Disp(l); stringinput(findmess,12,"请输入现有学生的学号: ");//输入并检验该学号 p=Locate(l,findmess,"num");//查询到该节点 if(p)//若p! =NULL,表明已经找到该节点 { 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.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; } else Nofind(); getchar(); } //插入记录: 按学号查询到要插入的节点的位置,然后在该学号之后插入一个新节点。 voidInsert(Linkl) { Linkp,v,newinfo;//p指向插入位置,newinfo指新插入记录 charch,num[12],s[12];//s[]保存插入点位置之前的学号,num[]保存输入的新记录的学号 intflag=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;//若学号存在,则进行插入之前的新记录的输入操作 else { getchar(); printf("\n=====>学号%s存在,重试? (y/n): ",s); scanf("%c",&ch); if(ch=='y'||ch=='Y') { continue; } else { return; } } } //以下新记录的输入操作与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=(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]: "); 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)//在链表中插入一个节点 { newinfo->next=p->next; p->next=newinfo; break; } p=p->next; } Disp(l); printf("\n\n"); getchar(); } //统计该班的总分第一名和单科第一,和各科不及格人数 voidTongji(Linkl) { Node*pm,*pe,*pc,*pt;//用于指向分数最高的节点 Node*r=l->next; intcountc=0,countm=0,counte=0;//保存三门成绩中不及格的人数 fflush(stdin); if(! r) { system("cls"); printf("\n=====>无此学生记录! \n"); getchar(); return; } system("cls"); Disp(l); pm=pe=pc=pt=r; while(r) { if(r->data.cgrade<60)countc++; if(r->data.mgrade<60)countm++; if(r->data.egrade<60)counte++; if(r->data.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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 成绩管理系统 基本 语言 编写 汇编
![提示](https://static.bingdoc.com/images/bang_tan.gif)