学生成绩管理系统基本C语言编写.docx
- 文档编号:25754711
- 上传时间:2023-06-12
- 格式:DOCX
- 页数:24
- 大小:21.81KB
学生成绩管理系统基本C语言编写.docx
《学生成绩管理系统基本C语言编写.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统基本C语言编写.docx(24页珍藏版)》请在冰豆网上搜索。
学生成绩管理系统基本C语言编写
//代码版权所有,不要
#include"stdio.h"#include"stdlib.h"#include"string.h"#include"conio.h"
copy,仅供参考学习。
//标准输入输出函数库
//标准函数库
//字符串函数库
//屏幕操作函数库
#define
HEADER1"
***************************
学生
成绩
信
息
******************************\n\n"
#define
HEADER2"学号
姓名
计算机
数学英语
总
分
平
均分
名次\n\n"
#defineFORMAT"
%-10s%-10s%5d%5d%5d%5d
%.3f%4d\n"
DATA
#definep->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;//是否需要存盘的标志变量
//定义与学生有关的数据结构
//标记为student
//学号
//姓名//计算机成绩//数学成绩//英语成绩
//总分
//平均分
//名次
typedefstructstudent{
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;//若未找到,返回一个空指针
}
//输入字符串,并进行长度验证(长度 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! =NULL,表明已经找到该 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.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("\n统计结果\n"); printf("计算机不及格: %d(人)\n",countc); printf("数学不及格: %d(人)\n”,countm); printf("英语不及格: %d(人)\n”,counte); printf("\n"); printf("总分最高分姓名: %s分数为: %d\n",pt->data.name,pt->data.total); printf("英语最高分姓名: %s分数为: %d\n",pe->data.name,pe->data.egrade); printf("数学最高分姓名: %s分数为: %d\n",pm->data.name,pm->data.mgrade); printf("计算机最高分姓名: %s分数为: %d\n",pc->data.name,pc->data.cgrade); printf("\n\n按任意键返回! "); getchar(); } //利用插入排序法实现单链表的按总分字段的降序排序,从高到低voidSort(Linkl) Linkll; } ll=(Node*)malloc(sizeof(Node));if(! ll) { printf("\n内存申请失败! ");return; }ll->
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 成绩管理系统 基本 语言 编写
![提示](https://static.bdocx.com/images/bang_tan.gif)