学生成绩管理系统.docx
- 文档编号:5480094
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:33
- 大小:379.95KB
学生成绩管理系统.docx
《学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统.docx(33页珍藏版)》请在冰豆网上搜索。
学生成绩管理系统
C语言开放实验
大作业
序号:
52
学号:
xxxxxx
姓名:
xxx
专业:
信息10-3班
实验题目:
学生成绩管理系统
成绩:
实验题目:
学生成绩管理系统
学生包含以下信息项:
学号、姓名、学院、班级、高数成绩、英语成绩、C语言成绩、总分、平均分。
系统的主要功能包括:
1.创建学生成绩信息文件,根据提示输入学生的各项信息,计算出总分和平均分,然后按学号对学生信息进行排序,并将排序后的学生成绩信息存储到一个二进制文件中。
2.增加学生信息,在原有学生信息文件的基础上增加新的学生成绩信息,要求:
增加后的学生信息仍按学号排序,并继续保存至原文件。
3.删除学生信息,提示用户输入要进行删除操作的学号,如果在文件中有该信息存在,则将该学号所对应的学生信息删除,否则输出提示信息,并提示用户选择是否继续进行删除操作。
4.修改学生信息,提示用户输入要进行修改操作的学号,如果在文件中有该息存在,则将提示用户输入该学号对应的要修改的选项,结果保存至原文件,并提示用户选择是否继续进行修改操作。
5.按不同条件对学生信息进行查询操作,输出满足条件的学生信息。
(1)按学号查询,输入一个学号,输出对应的学生信息。
(2)按姓名查询,包括精确查询(输入全名),模糊查询(输入姓)。
(3)按学院查询,输入学院名称,输出该学院的全部学生的信息。
(4)按班级查询,输入班级名称,输出该班级的全部学生的信息。
6.按不同条件对学生成绩进行统计工作。
(1)按总分对学生信息进行排序(由高到低),输出排序后的信息,并将排序后的学生信息存放到一个新的二进制文件中。
(2)按平均分统计各个分数段的学生人数(不及格,60-69,70-79,80-89,90-100)。
(3)分别找出3门课程成绩最高的学生,并输出他们的信息。
(4)分别统计出3门课程的不及格率,并输出。
源程序:
/*
(一)主菜单界面显示;
(二)记录查找函数;
(三)创建学生信息;
(四)查询学生记录;
(五)删除学生记录;
(六)修改学生记录;
(七)添加学生信息;
(八)统计学生成绩;
(九)学生信息排序;
(十)学生信息排序;
(十一)主函数
【①②③④⑤为各种方式的排序】*/
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"conio.h"/*屏幕操作函数库*/
#defineHEADER1"****************************学生信息表*************************\n\n"
#defineHEADER2"|学号|姓名|学院|班级|C语言|高数|英语|总分|平均分|\n"
#defineHEADER3"|====|======|========|========|=====|====|====|========|========|\n"
#defineFORMAT"|%-4s|%-6s|%-8s|%-8s|%4d|%4d|%4d|%4d|%5.1f|\n"
#defineDATAp->data.num,p->data.name,p->data.xueyuan,p->data.banji,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.total,p->data.ave
#defineEND"*****************************************************************\n"
intsaveflag=0;/*是否需要存盘的标志变量*/
structstudent
{
charnum[10];/*学号*/
charname[15];/*姓名*/
charxueyuan[15];/*学院*/
charbanji[15];/*班级*/
intcgrade;/*C语言成绩*/
intmgrade;/*高数成绩*/
integrade;/*英语成绩*/
inttotal;/*总分*/
floatave;/*平均分*/
};
typedefstructnode/*定义每条记录或结点的数据结构,标记为:
node*/
{
structstudentdata;/*数据域*/
structnode*next;/*指针域*/
}Node,*Link;/*Node为node类型的结构变量,*Link为node类型的指针变量*/
//
(一)主菜单界面======================================================================================================================================
voidmenu()
{system("color2e");
system("cls");/*调用DOS命令,清屏*/
printf("\n学生成绩管理系统\n\n\n");
printf("--------------------------主菜单------------------------------\n\n");
printf("*1创建学生信息*2插入学生信息\n\n");
printf("*3删除学生信息*4修改学生信息\n\n");
printf("*5按学号排序*6查询学生信息\n\n");
printf("*7按总分排序*8学生信息整理\n\n");
printf("*9保存学生信息*0退出系统\n\n");
printf("-------------------------------------------------------------\n");
}
//表格形式显示记录===========================================================================================================================
voidprintheader()/*格式化输出表头*/
{
printf(HEADER1);
printf(HEADER2);
printf(HEADER3);
}
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)
{
printf("\n……>没有学生信息!
\n");
getch();
return;
}
printf("\n\n");
printheader();/*输出表格头部*/
while(p)/*逐条输出链表中存储的学生信息*/
{
printdata(p);
p=p->next;/*移动直下一个结点*/
printf(HEADER3);
}
printf("\n\n按任意键继续!
\n");
getch();
}
//
(二)记录查找定位函数
Node*Locate(Linkl,charfindmess[],charnameornum[])
{
Node*r;
if(strcmp(nameornum,"num")==0)/*①按学号查询*/
{
r=l->next;
while(r)
{
if(strcmp(r->data.num,findmess)==0)
returnr;
r=r->next;
}
}
elseif(strcmp(nameornum,"name")==0)/*②按姓名查询*/
{
r=l->next;
while(r)
{
if(strcmp(r->data.name,findmess)==0)
returnr;
r=r->next;
}
}
return0;/*若未找到,返回一个空指针*/
}
//==================Locate2=============================
intLocate2(Linkl,charfindmess[],charnameornum[])
{
Node*r;
intlogo=0;
if(strcmp(nameornum,"xueyuan")==0)/*③按学院查询*/
{
r=l->next;
if(r!
=NULL)
printheader();
while(r)
{
if(strcmp(r->data.xueyuan,findmess)==0)
{
printdata(r);
printf(HEADER3);
logo=1;
}
r=r->next;
}
}
elseif(strcmp(nameornum,"banji")==0)/*④按班级查询*/
{
r=l->next;
if(r!
=NULL)
printheader();
while(r)
{
if(strcmp(r->data.banji,findmess)==0)
{
printdata(r);
printf(HEADER3);
logo=1;
}
r=r->next;
}
}
returnlogo;
}
//输入字符串,并进行长度验证(长度 voidstringinput(char*t,intlens,char*notice) { charn[255]; do{ printf(notice);/*显示提示信息*/ scanf("%s",n); if((int)strlen(n)>lens)printf("\n超出指定长度,请重新输入! \n");/*进行长度校验,超过lens值重新输入*/ }while((int)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; } //(三)创建学生信息(根据提示输入学生的各项信息,计算出总分和平均分,并将学生成绩信息存储到一个二进制文件中)================================================================================================================================== voidCreate(Linkl) { Node*p,*r,*s;/*实现添加操作的临时的结构体指针变量*/ charch,flag=0,num[10]; r=l; s=l->next; system("cls"); Disp(l);/*先打印出已有的学生信息*/ while(r->next! =NULL) r=r->next;/*将指针移至于链表最末尾,准备添加记录*/ while (1)/*一次可输入多条记录,直至输入学号为0的记录结点添加操作*/ { while (1)/*输入学号,保证该学号没有被使用,若输入学号为0,则退出添加记录操作*/ { stringinput(num,10,"请输入学号(输入'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)/*提示用户是否重新输入*/ { getch(); 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,6,"姓名: "); stringinput(p->data.xueyuan,8,"学院: "); stringinput(p->data.banji,8,"班级: "); p->data.cgrade=numberinput("C语言成绩[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=(p->data.total/(float)3);/*计算平均分*/ p->next=NULL;/*表明这是链表的尾部结点*/ r->next=p;/*将新建的结点加入链表尾部中*/ r=p; saveflag=1; } return; } //(四)查询学生记录================================================================================================================================= voidFind(Linkl) { intlogo,select; charsearchinput[20];/*保存用户输入的查询内容*/ Node*p,*q; if(! l->next)/*若链表为空*/ { system("cls"); printf("\n……>没有学生信息! \n"); getch(); return; } system("cls"); printf("\n……>1按学号查询\n……>2按姓名查询\n……>3按学院查询\n……>4按班级查询\n"); printf("请选择[1,2,3,4]: "); scanf("%d",&select); if(select==1)/*按学号查询*/ { stringinput(searchinput,4,"请输入现有的学生的学号: "); p=Locate(l,searchinput,"num");/*在l中查找学号为searchinput值的节点,并返回节点的指针*/ if(p) { printheader(); printdata(p); printf(END); printf("按任意键返回主菜单! "); } else Nofind(); getch(); } elseif(select==2)/*按姓名查询*/ { q=l->next; stringinput(searchinput,6,"请输入现有的学生的姓名: "); p=Locate(l,searchinput,"name"); if(p) { printheader(); printdata(p); printf(END); printf("按任意键返回主菜单! "); } elseif(q) { printheader(); while(q) { if(strstr(q->data.name,searchinput)! =NULL)/*模糊查询*/ { printdata(q); printf(HEADER3); } q=q->next; } } else Nofind(); getch(); } elseif(select==3)/*按学院查询*/ { stringinput(searchinput,8,"请输入现有的学生的学院名称: "); logo=Locate2(l,searchinput,"xueyuan"); if(logo==0) Wrong(); printf("\n按任意键返回主菜单! \n"); getch(); } elseif(select==4)/*按班级查询*/ { stringinput(searchinput,8,"请输入现有的学生的班级: "); logo=Locate2(l,searchinput,"banji"); if(logo==0) Wrong(); printf("\n按任意键返回主菜单! \n"); getch(); } } //(五)删除学生记录: 提示用户输入要进行修改操作的学号,如果在文件中信息存在,则将提示用户输入该学号对应的要修改的选项,结果保存至原文件,并提示用户选择是否继续进行修改操作=================================================================================== voidDel(Linkl) { intsel; Node*p,*r; charfindmess[20]; if(! l->next) {system("cls"); printf("\n……>没有学生信息! \n"); getch(); return; } system("cls"); Disp(l); printf("\n……>1按学号删除\n……>2按姓名删除\n"); printf("请选择[1,2]: "); scanf("%d",&sel); if(sel==1) { stringinput(findmess,10,"请输入现有的学生的学号: "); 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……>deletesuccess! \n"); getch(); saveflag=1; } else Nofind(); getch(); } 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"); getch(); saveflag=1; } else Nofind(); getch(); } else Wrong(); getch(); } //(六)修改学生记录。 先按输入的学号查询到该记录,然后提示用户修改学号之外的值,学号不能修改======================================================================================= voidModify(Link
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学生 成绩管理系统