C语言 学生成绩管理系统.docx
- 文档编号:23883419
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:28
- 大小:23.68KB
C语言 学生成绩管理系统.docx
《C语言 学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《C语言 学生成绩管理系统.docx(28页珍藏版)》请在冰豆网上搜索。
C语言学生成绩管理系统
C语言学生成绩管理系统”
请设计“学生成绩管理系统”实现学生信息的录入、显示、查找、添加、保存以及成绩排序
等功能模块。
要求功能选择用菜单实现,数据输入和结果输出要用文件存放。
原始数据文件格式如下(具体数据自行编写):
学号姓名英语c语言高等数学系平均成绩
1张三75858080
2李四…………
一、需求分析
根据题目要求,由于学生信息是存放在文件中,所以应提供文件的输入、输出等操作;在
程序中需要浏览学生的信息,应提供显示、查找、排序等操作;另外还应提供键盘式选择菜
单实现功能选择。
二、总体设计
请大家思考一下,根据上面的需求分析,可以将这个系统的设计为哪些模块?
_﹍、_
_、__、__、__、__。
(系统功能模块如5-1-1所示。
)
学生成绩管理系统
数据输入
数据显示
数据查找
数据插入
成绩排序
图5-1-1系统功能模块
三、代码实现
1主函数
主函数一般设计得一般简洁,只提供输入处理和输出部分的函数调用。
其中各部分的流程
图如5-1-2所示。
【程序】
Main()/*****************主函数****************
{
Intn,wl;
/*变量n保存选择菜单数字,wl判断输入的数字是否在功能菜单对应用
数字范围内*/
do
{
Puts(“\t\t*********************MENU*******************\n\n|”);
puts(“\t\t\t\t1.enternewdata”)
puts(“\t\t\t\t2.Addieiondata”)
puts(“\t\t\t\t3.Modifydata)
puts(“\t\t\t\t4.Deletedata:
)
puts(“\t\t\t\t5.Browseall:
)
puts(“\t\t\t\t6.searchbyname)
puts(“\t\t\t\t7Insertdata”)
puts(“\t\t\t\t8.Orderbyaverage’0
puts(“\t\t\t\t9.Exit)
puts(“\n\n\t\t*********************************************\n)
printf(“Choiceyounumber(1-9);[]\b\:
sc(%anf(“%d,&n)scanf
scanf(“%d”&n)
{
Wl=0
Getchar()
}
Elsewl=1
}
While(wl=1)
/*选择功能*/
Switch(n)
{
Case1:
enter():
break:
/*输入模块*/
Case2:
add():
break/*追加模块*/
Case3:
modify();break;/*修改模块*/
Case4:
del();();break;/*删除模块*/
Case5:
browse();break;/*浏览模块*/
Case6:
searcha();break;/*查找模块*/
Case7:
insert();break;/*插入模块*/
Case8:
order();break;/*排序模块*/
Case9:
exit();break;/*退出*/
}/*其中追加修改删除三个模块是在需求分析的基础上而外怎加的模块*/
}
建议将main()函数体内的界面选择部分语句单独抽取出来作为以独立的函数,目的在于系
统执行完功能模块后能够方便返回到系统界面。
即main()函数改为如下形式:
Voidmenu()
{intn,wl:
Do
{
Puts(“\t\t*****************MENU****************\n\n”)
puts(“\t\t\t\t1.enternewdate”)
puts(“\t\t\t\t2.additiondata’)
开始
显示一系列功能选项
输入n,断判m是否是0~9?
根据n的值调用各功能模块函数
结束
Y
N
图5-1-2主函数流程图
puts(“\t\t\t\t3.modifldata”)
puts(“\t\t\t\t4deletedata”)
puts(“\t\t\t\t5.browseall”)
puts(“\t\t\t\t6.seachbyname”)
puts(“\t\t\t\t7.insertdata”)
puts(“\t\t\t\t8.orderbyaverage”)
puts(“\t\t\t\t9.exit)
puts(“\n\n\t\t*********************************************\n)
printf(“Choiceyounumber(1-9);[]\b\)
scanf(“%d”&n)
if(n<1n>9)/*对选择的的数字作判断*/
{wl=1getchar();}
Elsewl=0
}while(wl=1)
/*选择功能*/
Switch(n)
Case1:
enter():
break:
/*输入模块*/
Case2:
add():
break/*追加模块*/
Case3:
modify();break;/*修改模块*/
Case4:
del();();break;/*删除模块*/
Case5:
browse();break;/*浏览模块*/
Case6:
searcha();break;/*查找模块*/
Case7:
insert();break;/*插入模块*/
Case8:
order();break;/*排序模块*
Case9:
exit();break;/*退出*/
}
}
/*************主函数***************/
main()
{
Menu()
}
2.各功能模块设计
(1)输入模块
【数据结构】
前面已经介绍了数据的几种存放形式,这里请读者思考一下采取哪种数据结构存放?
【分析】
单独看个数据信息,学号姓名是字符型,可以采用字符型数据组;分数为整数,采用整平
均成绩有可能有小数可采用型。
数据信息存放在文件中,一条记录对应一个学生,既符惯也
方便信息管理。
现在要靠略的问题是一条学生的记录从文件读进来后以什么形式存放?
参照上以章实例这里的学生信息是不是也可以采用结构体的形式呢?
把学生的学号姓
名科目成绩平均成绩作为结构体成员,如果要存放若干个学生信息就可以用结构体数组。
structstudent
{
Charnum[11]
Charname[20]
Charscore[3]
Floatave
}stu[N]/*stu[N]中每个数组元素对应一个学生*/
注意:
stu[N]中的N为学生人数,程序中采用宏定义的方式,可以随时在源程序宏定义中改,
本程序宏定义#defineN50.输入模块流程图如图5-1-3所示
结束
输入用户要输入学生记录的个数
I从0到n-1调用输入函数input(i)
I!
=0吗?
保存调用函sav
e(n)数
返回主菜单
开始
Y
N
图5-1-3输入模块流程图
[程序]
/**************输入模块***************/
Voidenter()/*输入模块*/
IntI,n;
Printf(“Howmanystudents(0-%d)?
:
n-1
/*要输入的记录个数*/
Printf(“\nEnterdatanow\n\n”)
For(i=1;i { Printf(“\nInput%dtustudentrecord.\n”i+1) Input(i)/*调用输入函数*/ } If(i! =0)save(n)/*调用保存函数*/ Printf_back();/*一个任务结束时让用户选择是浏览还是返回*/ } (2)追加模块 【需求分析】 该模块的功能是用户需要增加的学生记录,从键盘输入屏住条写道原来的输入文件中,注意 采用追加而不是覆盖的方式。 追加模块流程图如图所示。 5-1-4追加模块流程图 【程序】 /*************追加模块*************/ Voidadd() { IntInmk; FILE*fp n=load() priotf(“Howmanystudentsareyouwanttoadd(0-%d)? ;N-1-n) scanf(“%d”’&m);/*输入要追加的记录个数*/ k=m+n for(______) { Printf(“\ninput%dthstudentrecord\n”i-n=1) Input(i);/*调用输入函数*/ } If(_____)/*以ab方式打开文件,追加保存*/ { Printf(“cannotopenfile\n) } For(_____)/*输出到文件*/ If(_____) Printf(“filewriteerror\n”) Fclose(fp) Printf_back()/*一个任务结束时选择浏览还是返回*/} (3)修改模块 [需求分析] 该模块的功能是显示所有学生信息,考虑到记录较多,建议采用分屏显示。 显示完所有记 录后,用户输入要修改学生的学号,根据学号查找学生记录,并提示用户部分修改记录的哪 部分信息时学号、姓名或某科成绩还是所有信息都修改,根据用户的选择修改相应信息。 思考: 修改某部分或整体信息时是可以调用现成的一些输入函数? 修改模块流程图如图5-1-5所示。 开始 调用加载函数n=load()并计算 可以记录的个数n 结束 输入用户要追家学生记录 的个数m K=m+n i从n到k调用输入函数input() 保存追加的记录 图5-1-4追加模块流程图 开始 结束 显示所有记录,让用户看 哪条信息要修改 输入要修改的学号 i! =0吗? 显示找到的记 录调用修改记录 询问用户是否继续修改? 返回主菜单 Y N N Y 图5-1-5修改模块流程图 [程序] /****************修改模块****************/ Voidmodify() { structstudents; FILE*fp; intI,n,k,w0=1,w1,w2,=0 n=Ioad(); do { K=-1; /*给用户看全部记录以便确认要修改的记录*/ Printf-face();/*调用显示数据结构项目函数*/ For(i=0;i {if((i! =0)&&(i%10==0))/*目的是分屏显示*/ {printf(“\n\nRememberNO.whichneededmodif.Pressanykeytocontinue…”); getch(); puts(“\n\n”); } Printf-one(i);/*调用显示一个记录的函数*/ } do { Printf(“\n\nEnterNO.thatyouwanttomodify! NO.: ”); Scanf(“%s”,s.num);/*输出要修改的数据的学号*/ For(i=0;I If(strcmp(s.num,stu[i].num)==0) { k=i/*找到要修改的数据*/ s=stu[i];/*把stu[i](当次修改的学生记录)备份,以便用户反悔时恢复*/ } If(k==1)printf(“\n\nNOexist! Pleaseagain”); }while(k==-1);/*当k=-1表示没有找到*/ Printf-face(): /*调用显示数据结构项目函数*/ Printf-one(k);/*调用显示一个记录的函数*/ W1=modify-data(k,n);/*修改学生记录并返回保存控制值 W1,w1=1则表示永户已确认修改*/ If(w1==1)/*w1等于1时则表示用户确定这次 修改*/ {printf-face();(“\nSuccessful^-^.\n\nAreyoumodifyanother? \n\n\t1)。 Yes2}.Back Withsave\t[]\b\b”) Scanf(“%d”.&wo); W2=1/*用来控制保存,使w2=1是标记以有过修改*/ Else {wo=0 If(w2==1) Stu[k]=s {/*走到这里是由于用户没有确认修改(在调用修改函数wl=modify_data(k,n);时没确 认)使wo=0,为了让循环终止,stu[k]则把备份的s灰复给stu[k](既当次修改的),这样的好 处是确保在此之前修改过的内容成功保存,而本次(用户没有确认的)不修改)/ If(wo! =0&&w2==1) /*wo不等于一则表示正常返回,w2=1表示在此之前有过修改,这时就保存用户已确认的修 改 改并返回*/ Save(n) /*w2不等于一表示在此之前没有过修改,而又反悔这次修改,则不保存返回*/ {while(wo==1) Menu() { 说明wl=modify_data(I,n)修改函数时,若返回值为一则表示用户在修改函数里面确认了 这次修改,其中i表示第i个记录(要修改的),n表示总共有N个记录,若返回值不为一, 则不保存这次修改,但保存着此之前的修改,这由w2来控制,w2=1则表示有过用户修改 确认史。 (4)删除模块 【需求分析】该模块的功能是与修改模块一样显示所有的学生信息,同样靠略到记录较多, 建议采用分屏显示。 显示完所用记录后,用户输入要删除学生的学号,根据学号查找学生记 录并删除。 删除纪录时,一般的做法是将数据从文件中删除,删除位置后面的记录往前移动, 当数据结构不是单一变量,记录数较多时要靠略移动的效率。 思考: 有没有其他相对好的办法,比如将删除记录以某种方式加上删除标记,保存是判断 有此标记的跳过,写程序时就只需要一条判断语句。 当然这只是一种建议,虾米爱美的程序 代码是基于这种思想设计的。 当stu[k].ave=0标识该记录是要被删除的,则不保存。 流程图与修改模块类似,请自己画。 【程序】 /**********删除模块************/ Voiddel() { } 【5】浏览模块 [需求分析] 该模块的功能是显示所有的学生的记录信息,其流程图如图5-1-6所示。 【程序】 /****************浏览(全部)模块***************/ Voidbrowse() {intIjn n=load() printf_face() for(i=0;i {if(______) { Printf(“\n\npressanykeytocontinue….”) getch(); puts(“\n\n”); } __________;/*调用显示一个记录的函数*/ } printf(“\tThereare%drecord..\n”,n); printf(“nPressanykeytoback…”); getch();/*按任意键*/} (6)查找模块 [需求分析] 显示学生记录(10人一屏) 按任意键显示下一屏 按任意键返回主菜单 图5-1-6浏览模块流程图 该模块的功能是根据输入的学生姓名查找对应的记录,找到以后,可进行增加、删除或修改 信息的操作。 流程图如图5-1-7所示。 图5-1-7查找模块流程图 [程序] /********************查找模块**********************/ search() { inti,n,k,w1=1,w2,w3,w4; structstudents; n=load(); do { do {k=-1; printf(“\n\nEnternamethatyouwanttosearch! name: ”); scanf(“%s”,s.name);/*输入要修改的数据的学号*/ printf_face();/*调用显示数据结构项目函数*/ for(i=0;i if(strcmp(s.name,stu[i].name==o) {k=I;/*找到要修改的记录*/ printf_one(k);break;/*调用显示一个记录的函数*/ } if(k==-1) {printf(“\n\nNOexist! please”); printf(“\n\nAreyouagain? \n\tl).again2).NOandback[]\b\ scanf(“%”,&wl); ________________;/*保证在第一次找到的基础上再查找,找不到时能退出*/ } } while(k==-1&&wl=1==1);/*如果w1不等于1则直接返回*/ w4=0;w3=0; if(k! =-1)/*k不等于-1表示找到,如果找到则选择操作 {printf(“\n\nWhatdoyouwanttodo? \n\t1).Searchanother2).Mod 3).Delete4).Backmenu[]\b\b”); scanf(“%d”,&w2); switch(w2) {case2: w3=modify_data(k,n);break;/*调用修改数据函数*/ case3: {printf(“\nAreyousure? \n\t1).Sure2).Noandback[]\b\b scanf(“%d”,&w4); if(w4==1) stu[k].ave=0;/*表示删除*/ break; } if(w3==1||w4==1) {save(n); Printf(“\n\nSuccessful.^_^.”); Printf(“\n\nWhatdoyouwanttodo? \n\t1).Searchanother2)Ba []\b\b”); Scanf(“%d”,&w2); } } }whole(w2==1); Menu(); } (7)插入模块 [需求分析] 该模块的功能是要求插入一条学生记录,插入后使得记录按照学生的平均成绩有序排列。 显 然这里涉及到排列方法,可以采用冒泡法排序,具体算法参考前面内容。 小哈入模块刘胜图如图5-1-8所示。 [程序] /*****************插入模块***************/ voidinsert() { intI,j,n,c; structstudents; n=load(); puts(“\nInputonedata.\n”); do {input(n);/*输入第n+1个记录,即插入到最后*/ printf_face(); printf_one(n); printf(“\n\nAreyousure? \n\n\t1).Sur\t2).cancelsndagin\t3).Back withoutsave[]\b\b”); scanf(“%d”,&c); if(c==1) {/*用冒泡法排序*/ ____________ ____________ ____________ ____________ save(n+10; printf_bask(); }elseif(c! =2)menu(); }while(c==2); } (8)排序模块 [需求分析] 该模块的功能是要求将学生记录按照平均成绩排序。 假设这里采用选择法排序。 流程图如图5-1-9所示。 开始 结束 保存 用选择排序 返回主菜单 图5-1-9插入模块流程图 [程序] /*******************排序模块(平均成绩)********************/ voidorder()/*排序模块(按平均成绩)*/ { inti,j,k,n; n=load(); for(i=0;i { ____________ ____________ ____________ 开始 结束 调用输入法单个记录的 函数input(n) 让用户选择 显示刚才输入的记录 不保存 用冒泡法排序并保存 返回主菜单 2 1 3 图5-1-8插入模块流程图 ____________ } save(n); puuts(“\n\n”); printf_back(); } 3.公共函数 下面介绍一些在每个功能模块中都有可能用到的一些公共函数。 保存函数save(intn) [说明] 形参n控制保存的个数。 当stu[k].ave=0表示删除,不保存该记录。 /*保存函数*/ voidsave(intn)/**/ {FILE*fp; ifti; if((fp=fopen(“score.txt”,”wb”))==NULL)/**/ {printf(“\nCannotopenfile\n”); returnNULL; } for(i=0;i if(stu[i].ave! =0) if(fwrite(&stu[i],sizeof(structstudent),1,fp)! =1) printf(“file
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言 学生成绩管理系统 语言 学生 成绩管理系统