还剩17页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
#includestdio.h//标准输入输出#includemalloc.h//内存分配#includestdlib.h#includestring.h/*####说明####
2014.
12.28修改内容:修改了大量bug加入了姓名项v
1.6简单学生管理系统蔚蓝之链编写本人是C语言初学者初学C语言没几个月程序写的很笨不喜勿喷^_^vc++
6.0编译无error无warning已实现功能:添加学生列出学生信息列表删除学生退出学号重复检查排序功能多科成绩录入求平均成绩及总平均成绩保存记录读取记录修改功能;待实现功能:查询......
2014.
12.1创建文件开始编写增加添加学生函数增加列出学生函数增加删除学生函数退出版本
1.
02014.
12.2修改内容:增加学号重复检查函数修复显示内容时程序终止输出列表函数优化添加学生函数优化
1.
12014.
12.3~
2014.
12.4修改内容:增加排序函数删除函数内部优化main函数内部改动添加学生函数优化
1.
22014.
12.5~
2014.
12.7修改内容:增加多科目录入添加函数优化新增总成绩与平均成绩显示排序函数优化输出函数改动
1.3更新到此告一段落继续学习去^_^
2014.
12.9~
2014.
12.13修改内容:新增保存函数读取函数主程序修改新增链表清除函数
1.
42014.
12.14修改内容:新增修改函数新增宏定义MAX_SCOREandMAX_SNO方便程序的修改修改程序中所有warning一些bug修正
1.5*///常量定义区+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#defineboolint//由于C语言中不存在bool型所以这里把它定义成int型#definetrue1//同上#definefalse0//↑#defineLENsizeofstructryb//动态内存分配空间大小#defineDATAFILEDATAFILE.WL//数据保存文件名#defineMAX_SCORE150//最高分数上限值#defineMAX_SNO200//最多录入学生上限值即能输入的最大学号数//END常量定义============================================================================================================//声明函数=================================================================================================================structryb*del_item_rybstructryb*headintsnoint*del_message;//删除指定学号节点链表头欲删除学号处理结果1为删除成功0为删除失败返回删除后的链表头structryb*create_item_rybstructryb*head;//向指定的链表添加学生并返回链表头voidput_rybstructryb*head;//输出学号及成绩欲输出链表头boolis_snostructryb*headintsno;//判断指定学号是否存在如存在返回true不存在返回false链表头欲判断学号structryb*orderstructryb*headenumordertypetypeintfs;//排序函数;链表头排序方式asc或desc排序类型1为按学号2为按总成绩boolsave_datastructryb*head;//保存链表数据函数欲保存链表头structryb*read_datavoid;//读取数据到链表并返回链表头voidclearstructryb*head;//清除函数清除指定链表所有数据释放内存空间voidamend_rybstructryb*headintsno;//修改函数修改指定学号学生成绩信息链表头要修改成绩的学生学号structryb{//定义链表数据结构intsno;//学号charname
[9];//姓名intchinese;//语文intmath;//数学intenglish;//英语intclanguage;//C语言inttiyu;//体育intscore;//总成绩structryb*next;};enumordertype{//定义排序枚举类型ascdesc};//性感的分割线$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$主程序$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$intmainvoid{structryb*head*temp_h;//链表头临时链表boolexit=false;shortintvalue;//接受输入信息12341表示添加信息2显示信息3删除信息4排序5退出intsnodel_message=0;//学号删除函数处理结果1为删除成功0为删除失败intpxfspxlx;//排序方式排序类型方式asc\desc;类型1学号2成绩charis_quit;//表示是否退出y或Y表示退出否则不退出charis_save;//表示是否保存数据y或Y表示保存否则不保存charis_read;//表示是否读取数据y或Y表示读取否则不读取boolssave;//表示是否保存成功true表示成功false表示保存失败intamend_sno;//表示要修改的学号head=structryb*mallocLEN;//创建初始链表head-sno=0;//链表赋初值head-next=NULL;do{printf蔚蓝学生管理系统v
1.6C语言版\n\n;printf
①添加学生\n
②显示成绩列表\n
③删除学生\n
④排序\n
⑤保存数据\n
⑥读取数据\n
⑦修改\n
⑧退出系统\n\n;printf等待命令输入:;fflushstdin;//清空键盘缓冲区scanf%dvalue;ifvalue==1//添加{head=create_item_rybhead;//添加信息printf录入信息结束!\n;systempause;}elseifvalue==2//显示{put_rybhead;//显示信息systempause;}elseifvalue==3//删除{printf请输入要删除的学生学号:;fflushstdin;//清空键盘缓冲区scanf%dsno;head=del_item_rybheadsnodel_message;//删除ifdel_message==1{printf删除成功!!!\n;}else{printf删除失败!!!\n;}systempause;}elseifvalue==4//排序{r:printf请请输入排序方式1升序2降序:;fflushstdin;scanf%dpxfs;printf请输入排序类型1按学号2按成绩:;fflushstdin;scanf%dpxlx;ifpxfs2||pxfs0||pxlx2||pxlx0{printf排序方式或排序类型输入不符合规定!!!请重新输入!!!\n;systempause;gotor;}ifpxfs==1{head=orderheadascpxlx;}else{head=orderheaddescpxlx;}printf排序完成!!!\n;systempause;}elseifvalue==5//保存数据{is_save=N;printf您是否要保存当前修改过的学生数据以前的数据将被覆盖!\nY\\N:;fflushstdin;scanf%cis_save;ifis_save==Y||is_save==y{ssave=save_datahead;ifssave==true{printf当前数据已成功保存到磁盘!\n;systempause;}else{printf保存失败或没有数据!\n;systempause;}}else{printf您取消了保存数据操作!\n;systempause;}}elseifvalue==6//读取数据{is_read=N;printf您是否要读取磁盘数据执行此操作将覆盖当前数据是否继续\nY\\N:;fflushstdin;scanf%cis_read;ifis_read==Y||is_read==y{temp_h=read_data;iftemp_h==NULL{printf数据读取失败!\n;systempause;}else{clearhead;//清空当前链表释放空间head=temp_h;//读取新链表printf数据读取成功!\n;systempause;}}else{printf您取消了数据读取操作!\n;systempause;}}elseifvalue==7{amend_sno=0;printf请输入要修改的学生学号:;fflushstdin;scanf%damend_sno;ifamend_sno0amend_sno=MAX_SNO{amend_rybheadamend_sno;}else{printf学号输入不合法学号为1-%d之间的数包括1%d!!!\nMAX_SNOMAX_SNO;systempause;continue;}}elseifvalue==8//退出{printf您确定要退出蔚蓝学生成绩管理系统吗Y\\N:;fflushstdin;scanf%cis_quit;ifis_quit==Y||is_quit==y{exit=true;printf感谢使用蔚蓝学生成绩管理系统再见!\n;systempause;}}else{printf请输入1-7之间的数!!!\n;systempause;}systemcls;}whileexit==false;return0;}//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$主程序END$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$//函数定义#if1structryb*del_item_rybstructryb*headintsnoint*message//删除指定学号节点链表头欲删除学号处理结果1为删除成功0为删除失败返回删除后的链表头{structryb*p*p1;p=head;do{ifp-sno==sno{ifp==head//如果第一个为要删除的值{head=head-next;//修改链表头//printf已成功修改头指针sno=%d\nhead-sno;}else{p1-next=p-next;//将链表节点指向要删除的链表节点的下一节点freep;//释放已删除的链表节点内存}*message=1;break;}p1=p;//保存当前链表节点p=p-next;ifp-next==NULLp-math=0p-math=MAX_SNO{*message=0;}}whilep-nextp-math=0p-math=MAX_SNO;returnhead;}#endifstructryb*create_item_rybstructryb*head//向指定的链表添加学生并返回链表头{structryb*p1;inti=1;//i表示学生数inttempsno;//临时学号intscorearr
[5]n;//分数数组循环值chartempname
[9];//临时姓名printf提示:当学号为0时则终止添加并返回主界面姓名长度不能超过4个字\n\n;//输出提示信息p1=head;whilep1-next!=NULL//寻找链表尾找到后将p1指向链表尾以接受学生信息的添加{p1=p1-next;i++;}do{p1-sno=0;sno:printf请输入学生%d学号与姓名[格式:学号姓名]:i;fflushstdin;//清空键盘缓冲区ifscanf%d%stempsnotempname==2{;}else{printf输入格式错误!请重新输入T_T\n;systempause;gotosno;}iftempsno!=0{ifis_snoheadtempsno==false//判断学号是否存在{p1-sno=tempsno;}else{printf学号[%d]已存在!!!\ntempsno;gotosno;}}else{continue;}printf---------------------------------------------\n;printf请输入学生%d成绩语文数学英语C语言体育以逗号分隔:i;forn=0;n=4;n++//成绩数组赋初值{scorearr[n]=0;}fflushstdin;//清空键盘缓冲区scanf%d%d%d%d%dscorearr
[0]scorearr
[1]scorearr
[2]scorearr
[3]scorearr
[4];printf*********************************************\n;//检测输入合法性ifp1-sno==0{;}elseifp1-sno1||p1-snoMAX_SNO//判断学号是否合法1~200{printf学号输入不合法学号为1-%d之间的数包括1%d!!!\nMAX_SNOMAX_SNO;systempause;continue;}else//判断成绩合法性{forn=0;n=4;n++//检测成绩录入合法性{ifscorearr[n]0||scorearr[n]MAX_SCORE{printf成绩输入不合法或成绩数值输入错误各科成绩应为0-%d之间的数包括0%d!!!\nMAX_SCOREMAX_SCORE;systempause;continue;}}p1-sno=tempsno;p1-chinese=scorearr
[0];p1-math=scorearr
[1];p1-english=scorearr
[2];p1-clanguage=scorearr
[3];p1-tiyu=scorearr
[4];strcpyp1-nametempname;//求总成绩p1-score=scorearr
[0]+scorearr
[1]+scorearr
[2]+scorearr
[3]+scorearr
[4];}ifp1-sno!=0{p1-next=structryb*mallocLEN;//create一个新节点给p1-nextp1=p1-next;//将新节点地址给p1p1-next=NULL;//↑}else{p1-sno=0;}i++;}whilep1-sno!=0;//判断学号是否为0;为0退出添加returnhead;}#if1voidput_rybstructryb*head//输出学号及成绩欲输出链表头{structryb*pryb=head;structrybzcj;//总成绩intstudent_num=0;//学生人数//初始化总成绩结构体zcj.chinese=0;zcj.clanguage=0;zcj.english=0;zcj.math=0;zcj.tiyu=0;//初始化ENDsystemcls;printf--------------\n;printf|某班学生成绩表|\n;printf--------------\n;printf-------------------------------------------\n;printf|学号||姓名||语文||数学||英语||C语言||体育||总成绩||平均成绩|\n;printf-------------------------------------------\n;//8888981012do{ifpryb-sno!=0pryb-math=0pryb-math=MAX_SNO//输出成绩{printf%-8d%-8s%-8d%-8d%-8d%-9d%-8d%-10d%-12d\npryb-snopryb-namepryb-chinesepryb-mathpryb-englishpryb-clanguagepryb-tiyupryb-scorepryb-score/5;zcj.chinese=zcj.chinese+pryb-chinese;//计算各科总成绩zcj.clanguage=zcj.clanguage+pryb-clanguage;zcj.english=zcj.english+pryb-english;zcj.math=zcj.math+pryb-math;zcj.tiyu=zcj.tiyu+pryb-tiyu;student_num++;//记录总学生人数表示链表不为空:pryb=pryb-next;}}whilepryb-nextpryb-math=0pryb-math=MAX_SNO;ifstudent_num=1//判断链表是否为空{printf\n\n[总平均成绩]:语文:%d数学:%d英语:%dC语言:%d体育:%d\nzcj.chinese/student_numzcj.math/student_numzcj.english/student_numzcj.clanguage/student_numzcj.tiyu/student_num;//输出总平均成绩}else{printf没有可以输出列表!\n\n;}}#endifboolis_snostructryb*headintsno//判断学号是否存在头指针学号如学号存在返回true不存在返回false{structryb*p;p=head;do{ifp-sno==sno{returntrue;}ifp-next!=NULL{p=p-next;}}whilep-next!=NULL;returnfalse;}//排序函数排序使用冒泡算法structryb*orderstructryb*headenumordertypetypeintfs//排序函数;链表头排序方式asc或desc排序类型1为按学号2为按总成绩{structryb*p*rp*ptemp*rph;//要排序的链表要返回的链表临时排序链表要返回的链表头intmaxmin;intpro_mess;//删除函数处理结果10ifhead-sno==0{returnhead;}p=head;max=0min=0;rp=structryb*mallocLEN;//create一个新节点给rprph=rp;do{ptemp=p;iffs==1//按学号{max=ptemp-sno;//赋初值min=ptemp-sno;}else{//按成绩max=ptemp-sno;min=ptemp-score;max=ptemp-score;}rp-sno=ptemp-sno;rp-score=ptemp-score;rp-tiyu=ptemp-tiyu;rp-english=ptemp-english;rp-chinese=ptemp-chinese;rp-math=ptemp-math;rp-clanguage=ptemp-clanguage;strcpyrp-nameptemp-name;do{iftype==desc//降序{iffs==1//按学号{ifptemp-snomax{max=ptemp-sno;rp-sno=ptemp-sno;rp-score=ptemp-score;rp-tiyu=ptemp-tiyu;rp-english=ptemp-english;rp-chinese=ptemp-chinese;rp-math=ptemp-math;rp-clanguage=ptemp-clanguage;strcpyrp-nameptemp-name;}}elseiffs==2//按成绩{ifptemp-scoremax{max=ptemp-score;rp-sno=ptemp-sno;rp-score=ptemp-score;rp-tiyu=ptemp-tiyu;rp-english=ptemp-english;rp-chinese=ptemp-chinese;rp-math=ptemp-math;rp-clanguage=ptemp-clanguage;strcpyrp-nameptemp-name;}}}iftype==asc//升序{iffs==1//按学号{ifptemp-snomin{min=ptemp-sno;rp-sno=ptemp-sno;rp-score=ptemp-score;rp-tiyu=ptemp-tiyu;rp-english=ptemp-english;rp-chinese=ptemp-chinese;rp-math=ptemp-math;rp-clanguage=ptemp-clanguage;strcpyrp-nameptemp-name;}}elseiffs==2//按成绩{ifptemp-scoremin{min=ptemp-score;rp-sno=ptemp-sno;rp-score=ptemp-score;rp-tiyu=ptemp-tiyu;rp-english=ptemp-english;rp-chinese=ptemp-chinese;rp-math=ptemp-math;rp-clanguage=ptemp-clanguage;strcpyrp-nameptemp-name;}}}ptemp=ptemp-next;}whileptemp-next!=NULL;p=del_item_rybprp-snopro_mess;rp-next=structryb*mallocLEN;//create一个新节点给rp-nextrp=rp-next;ifp-next==NULL{//添加链表尾信息链表尾为一个指向NULL的空结构以表示链表结束rp-score=0;rp-sno=0;rp-next=NULL;}}whilep-next!=NULL;returnrph;//返回排序后链表头}//排序函数END;------------------------------------------------------------------------------boolsave_datastructryb*head//保存链表数据函数欲保存链表头成功返回true失败返回false{FILE*fp;structryb*p;p=head;ifhead-sno==0//如果链表为空{returnfalse;//返回false}fp=fopenDATAFILEwb+;//打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失若文件不存在则建立该文件rewindfp;//指向文件头do{ifp-sno!=0{fwritepLEN1fp;//保存结构体p=p-next;//}}whilep-sno!=0;fclosefp;//关闭文件returntrue;}//savedata_END------structryb*read_datavoid//读取数据到链表并返回链表头失败返回NULL{FILE*fp;structryb*head*p;head=structryb*mallocLEN;//创建初始链表p=head;fp=fopenDATAFILEr;//以只读方式打开文件iffp==NULL//判断文件是否打开失败{fclosefp;returnNULL;}while1{iffeoffp==0{freadpLEN1fp;ifp-math=0p-math=MAX_SNO{p-next=structryb*mallocLEN;p=p-next;p-sno=0;p-next=NULL;}}else{break;}}fclosefp;returnhead;}//read_data.END-------------------voidclearstructryb*head//清除函数清除指定链表所有数据释放内存空间{structryb*p;while1{ifhead-sno==0{freehead;//释放空间break;}else{p=head;head=head-next;freep;}}}//clear.END------------------------------------------------------------voidamend_rybstructryb*headintsno//成绩修改函数修改指定学号学生成绩信息链表头要修改成绩的学生学号{structryb*p;//链表intarr
[6]retvaluei;//临时成绩数组[语数英C语言体育]scanf返回值i循环用charname
[9]={n};p=head;ifis_snoheadsno==false//判断要修改的学生是否存在{printf您要修改的学号[%d]不存在!_\nsno;systempause;return;}while1{ifp-sno==sno{flag:printf当前要修的学生学号为[%d]姓名:%s成绩:\n[语文:%d][数学:%d][英语:%d][C语言:%d][体育:%d][总成绩:%d]\n\nsnop-namep-chinesep-mathp-englishp-clanguagep-tiyup-score;printf提示:各科成绩用逗号隔开输入-1即表示不修改该科目成绩或学号姓名不修改输入n!↖^ω^↗\n;printf请输入新的学号与姓名[格式:学号姓名]:;fflushstdin;ifscanf%d%sarr
[0]name==2{printf请输入新的成绩[语数英C语言体育]:;retvalue=scanf%d%d%d%d%darr
[1]arr
[2]arr
[3]arr
[4]arr
[5];}else{printf学号\姓名格式输入错误请重新输入T_T!\n;systempause;gotoflag;}ifretvalue==5{fori=0;i5;i++//检测输入值是否合法{ifarr[i+1]=MAX_SCOREarr[i]=-1arr
[0]=-1arr
[0]=MAX_SNOarr
[0]!=0{;}else{printf您输入的值有误各科目值不应该大于%d学号不应该大于%d学号不能为0输入-1即表示不修改对应科目成绩\学号姓名输入n即表示不修改请重新输入!→_→\nMAX_SCOREMAX_SNO;systempause;gotoflag;}}//判断对应科目是否需要修改ifarr
[0]!=-1{ifis_snoheadarr
[0]==false{ifarr
[0]=0arr
[0]=MAX_SNO{p-sno=arr
[0];}else{printf学号应该是大于0且小于%d的数!MAX_SNO;systempause;gotoflag;}}else{printf你要修改成的学号已存在!未能修改成功!请重新输入!T_T\n;gotoflag;}}ifarr
[1]!=-1{p-chinese=arr
[1];}ifarr
[2]!=-1{p-math=arr
[2];}ifarr
[3]!=-1{p-english=arr
[3];}ifarr
[4]!=-1{p-clanguage=arr
[4];}ifarr
[5]!=-1{p-tiyu=arr
[5];}ifname
[0]!=nname
[0]!=N{strcpyp-namename;}p-score=p-chinese+p-math+p-english+p-clanguage+p-tiyu;//计算修改过的总成绩printf修改完毕!^_^\n;systempause;return;}else{printf你输入的的值有误请以指定格式重新输入!→_→\n;systempause;gotoflag;}}p=p-next;ifp-math=0p-math=MAX_SCORE{;}else{printf修改失败!\n;systempause;}}}。