《2022年c语言编写学生成绩管理完整.docx》由会员分享,可在线阅读,更多相关《2022年c语言编写学生成绩管理完整.docx(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精品学习资源JIANGXI NORMALUNIVERSITY软件学院课程设计报告书工程名称: 同学成果治理系统专业班级: 软件技术 4 班学 号: 1367003231姓 名: 郝志新指导老师: 李莹2021 年 1 月 1 日目 录第 1 章课题背景描述3第 2 章总体设计 .32.1任务目标 .32.2开发设计思想 .4欢迎下载精品学习资源2.3主要功能 .42.4关键技术 .5第 3 章 代码设计 .73.1截图 .73.2核心代码 .12第 4 章 总 结 .25参考文献 .26致 谢 .26欢迎下载精品学习资源第 1 章 课题背景描述由于运算机技术的快速进展和普及,与之紧密相关的治理
2、信息系统:已经深化到现代社会各行各业中;在高校,同学信息治理系统SMIS 作为运算机治理信息系统的一个应用,越来更加挥着它重要的作用;本文所介绍的同学信息治理系统是用C 语言开发的;本系统完成了对同学的成果治理,包括对同学信息的添加、修改、排序、删除等运算机治理工作;本文对接受的相关技术进行了描述,对各个子系统的功能、设计思路及设计方法都作了详细的描述;同学信息治理系统 SMIS是高校信息治理系统建设的重要组成部分,是提高教案治理的 质量和效益乃至建设知名高水平高校的关键环节;同学信息处理的电脑化、网络化,也是实 现学校治理现代化和信息化的重要内容;同学信息治理系统的内容对于学校的决策者和治理
3、者来说都至关重要,所以同学信息治理系统应当能够为用户供应充分的信息和快捷的查询手段;但始终以来人们使用传统人工的方式治理文件档案,这种治理方式存在着许多缺点,如: 效率低、保密性差 ,另外时间一长 ,将产生大量的文件和数据 ,这对于查找、更新和爱护都带来 了不少的困难;随着科学技术的不断提高,运算机科学日渐成熟 ,其强大的功能已为人们深刻熟识 ,它已进入人类社会的各个领域并发挥着越来越重要的作用;作为运算机应用的一部分 , 使用运算机对同学信息进行治理,具有手工治理所无法比拟的优点 .例如: 检索快速、查找便利、牢靠性高、储备量大、保密性好、寿命长、成本低等;这些优点能够极大地提高同学信息治理
4、的效率,也是进行科学化、正规化治理的重要条件;第 2 章 总体设计2.1 任务目标随着学校的规模不断扩大,同学数量急剧增加,有关同学的各种信息量也成倍增长;面对庞大的信息量需要有同学治理系统来提高同学治理工作的效率; 通过这样的系统可以做到信息的规范治理、科学统计和快速查询、修改、增加、删除等,从而削减治理方面的工作量;本系统主要用于学校同学信息治理, 总体任务是实现同学信息关系的系统化、规范化和自动化,其主要任务是用运算机对同学各种信息进行日常治理;2.2 开发设计思想程序总体框架如图:欢迎下载精品学习资源456789按对插保从退学学入存文出号生新信件删除信息的信息到中读信排息文取息序件ma
5、in菜单1 输入3 查找5 排序7 储存9 退出2 输出4 删除6 插入8 读取菜单代码1添加同学信息2按序输出信息3按姓名查找信息2.3 主要功能1、每一条记录包括一个同学的学号、姓名、3 门成果、平均成果;2、输入功能:可以一次完成许多条记录的输入;3、显示功能:完成全部同学记录的显示;4、查找功能:完成按姓名查找同学记录,并显示;5、排序功能:按同学平均成果进行排序;6、插入功能:按平均成果高低插入一条同学记录;欢迎下载精品学习资源7、储存功能:将同学记录储存在任何自定义的文件中,如储存在:c:score;8、读取功能:将储存在文件中的同学记录读取出来;9、有一个清晰美观界面来调用各个功
6、能2.4 关键技术1、查找函数 void searchSTUDENT *head; N-S 流程图如下:输入要查找的同学的学号 s p=head,使 p 指向第一结点当记录的学号不是要找的,或指针不为空时p=p-nextp.=NULL 假如指针不为空是否显示没有该输出 p 所指向的结点同学2、删除函数 STUDENT *deleteSTUDENT *head; N-S 流程图如下:p1=head;输入入要删除的学号 s当( strcmpp1-num,s)& p1 .= NULL p2=p1p1=p1-nextp1 是要删除的结点是否p1 所指是头结点是否输出 ”找不到”head=p1-next
7、p2-next=p1-next的信息“删除头结点 3、排序函数 STUDENT *sortSTUDENT *head; N-S 流程图:temp=head-next,head-next=NULL欢迎下载精品学习资源当 temp.=NULL 时t=temp;temp=temp-next;p1=head; p2=head; 当 t-averageaverage&p1.=NULL 时p2=p1;p1=p1-next;p1=p2是否t-next=p1;t-next=p1; head=t;p2-next=t;p1=head;当 p1.=NULL 时i+ ;p1-order=i;p1=p1-next;输出
8、“排序成功”4、插入函数 STUDENT *insertSTUDENT *head,STUDENT *new; N-S 流程图:P1=head,p0=new原先的链表是空表是否将 p0 所指当 p0-averageaverage以及 p1 所指向的不是表尾结的结点作为点唯独结点 p2 指向 p1 位置 p1 向后移一个结点p0-average=p1-average是否p1 指向头结点p1-next=p0是否 p0-next=NULLhead=p0p2-next=p0插到表尾之后 p0 -next=p1p0-next=p1插到表头之前 插到表中间 n=n+1; 结点加 1head=sorthea
9、r; (将成果重新排序)5、储存函数 void saveSTUDENT *head ; N-S 流程图如下:输入要储存记录的文件地址 outfile文件不能打开否是欢迎下载精品学习资源p=head;输出一个出错信当 p 不为空时息,并返回菜单fwritep,LEN,1,fp ; 写入一条记录 p=p-next; 指针后移 fclosefp; 关闭文件 第3章代码设计3.1 截图菜单界面:图 1.菜单1、创建信息:图 2.输入(已输入三个同学的学号及成果)2、输出界面:图 3.输出(按输入次序输出)3、查找界面 :图 4.查找(输入名字 ZSan)4、删除界面:图 5.删除成功(输入学号1001
10、 选择 Y )5、排序界面:图 6-1.排序成功(按总分降序排列) 图 6-2.菜单 2 输出查看排序6、插入界面:图 7-1.插入成功(插入 1 个同学学号及成果)欢迎下载精品学习资源7、储存数据:图 7-2.菜单 2 输出数据查看欢迎下载精品学习资源图 8.储存成功(输入文件名称 xscjxx) 8、读取数据:图 9.读取成功(输入文件名称 xscjxx) 9、退出;3.2 核心代码/* 头文件 */欢迎下载精品学习资源#include #include#include#include/*/*其它说明 */字符串函数 */#include/*内存操作函数*/#include/*字符操作函数
11、*/#include/* 动态地址支配函数*/ #define LEN sizeofSTUDENTtypedef struct stu/* 定义结构体数组用于缓存数据*/char num6 ;char name5 ;int score3 ;int sum;float average;int order ;struct stu *next ;STUDENT ;/* 函数原型 */STUDENT *init; /* 初始化函数 */ int menu_select ; /* 菜单函数 */ STUDENT *create ; /* 创建链表 */void printSTUDENT *head; /
12、* 显示全部记录 */void searchSTUDENT *head ; /* 查找记录 */ STUDENT *deleteSTUDENT *head; /* 删除记录 */ STUDENT *sortSTUDENT *head; /* 排序 */STUDENT *insertSTUDENT *head,STUDENT *new; /* 插入记录 */ void saveSTUDENT *head ;/* 储存文件 */STUDENT *load ;/* 读文件 */* 主函数界面 */ mainSTUDENT *head,new ;欢迎下载精品学习资源head=init ;/* 链表初始
13、化 ,使 head 的值为 NULL*/ for ; /* 循环无限次 */switchmenu_selectcase 1:head=create;break;case 2:printhead;break;case 3:searchhead;break;case 4:head=deletehead;break;case 5:head=sorthead;break;case 6:head=inserthead,&new ;break; /*&new 表示返回地址 */ case 7:savehead;break;case 8:head=load; break;case 9:exit0 ;/* 如
14、菜单返回值为 9 就程序终止 */* 初始化函数 */ STUDENT *initreturn NULL ; /* 返回空指针 */* 菜单选择函数 */ menu_selectint n ;struct date d;/* 定义时间结构体 */getdate&d ;/* 读取系统日期并把它放到结构体d 中*/printfpress any key to enter the menu. ; /* 按任一键进入主菜单 */getch;/* 从键盘读取一个字符,但不显示于屏幕*/clrscr ;/* 清屏 */printf*欢迎下载精品学习资源*n;printfttWelcome ton;prin
15、tfnttThe student score manage systemn ;printf*MENU*n;printfttt1. Enter the recordn;/* 输入同学成果记录*/printfttt2. Print the recordn;/* 显示 */printfttt3. Search record on namen;/* 查找 */ printfttt4. Delete a recordn;/* 删除 */ printfttt5. Sort to make new a filen;/* 排序 */ printfttt6. Insert record to listn;/*
16、插入 */ printfttt7. Save the filen;/* 储存 */ printfttt8. Load the filen;/* 读取 */ printfttt9. Quitn;/* 退出 */ printfnttMade by Wang Dongsheng.n;printf*n;printftttt%d%d%dn,d.da_year,d.da_mon,d.da_day; /* 显示当前系统日期*/ doprintfntttEnter your choice19:;scanf%d,&n ;whilen9 ; /* 假如选择项不在 19 之间就重输 */returnn ;/* 返回
17、选择项,主函数依据该数调用相应的函数*/* 输入函数 */ STUDENT *createint i,s ;STUDENT *head=NULL,*p; /* 定义函数 .此函数带回一个指向链表头的指针*/ clrscr ;欢迎下载精品学习资源for ; p=STUDENT *mallocLEN; /* 开创一个新的单元 */ if.p/* 假如指针 p 为空 */printfnOut of memory.; /* 输出内存溢出 */ return head; /* 返回头指针 ,下同 */printfEnter the num0:list end:;scanf%s,p-num ;ifp-nu
18、m0=0 break; /* 假如学号首字符为0 就终止输入 */ printfEnter the name: ;scanf%s,p-name ;printfPlease enter the %d scoresn,3 ; /* 提示开头输入成果*/ s=0;/* 运算每个同学的总分,初值为0*/fori=0 ;iscorei;ifp-scoreiscorei100/*确保成果在 0100 之间 */ printfData error,please enter again.n ;whilep-scoreiscorei100;s=s+p-scorei ; /* 累加各门成果 */p-sum=s;/
19、* 将总分储存 */p-average=floats/3 ; /* 先用强制类型转换将s 转换成 float 型,再求平均值 */ p-order=0 ;/* 未排序前此值为 0*/p-next=head ;/* 将头结点做为新输入结点的后继结点*/ head=p;/* 新输入结点为新的头结点*/returnhead;欢迎下载精品学习资源/* 显示全部记录函数 */ void printSTUDENT *headint i=0 ; /* 统计记录条数 */ STUDENT *p ; /* 移动指针 */ clrscr ;p=head; /* 初值为头指针 */printfn*STUDENT*n
20、;printf-n;printf| Rec |Num|Name| Sc1 | Sc2 | Sc3 | Sum |Ave| Order |n ;printf-n;whilep.=NULLi+ ;printf| %3d | %4s|%-4s| %3d | %3d | %3d | %3d | %4.2f | %-5d|n,i, p-num,p-name,p-score0,p-score1,p-score2,p-sum,p-average,p-order;p=p-next ;printf-n;printf*END*n;/* 查找记录函数 */void searchSTUDENT *headSTUDEN
21、T *p;/*移动指针 */char s5 ;/* 存放姓名用的字符数组*/ clrscr ;printfPlease enter name for searching.n ;scanf%s,s ;欢迎下载精品学习资源p=head; /* 将头指针赋给 p*/whilestrcmpp-name,s & p .= NULL /*当记录的姓名不是要找的,或指针不为空时*/ p=p-next ;/* 移动指针,指向下一结点*/ifp.=NULL/*假如指针不为空 */printfn*FOUND*n;printf-n;printf|Num|Name| sc1 | sc2 | sc3 | Sum |Av
22、e| Order |n ;printf-n;printf|%4s|%4s| %3d | %3d | %3d | %3d | %4.2f | %-5d|n,p-num,p-name,p-score0,p-score1,p-score2,p-sum,p-average,p-order;printf-n;printf*END*n;elseprintfnThere is no num %s student on the list.n,s; /* 显示没有该同学 */* 删除记录函数 */STUDENT *deleteSTUDENT *headint n ;STUDENT *p1,*p2; /*p1 为
23、查找到要删除的结点指针,p2 为其前驱指针 */ char c,s6;/*s6 用来存放学号 ,c 用来输入字母 */clrscr ;printfPlease enter the deleted num: ;scanf%s,s ;p1=p2=head; /* 给 p1 和 p2 赋初值头指针 */whilestrcmpp1-num,s & p1 .= NULL/*当记录的学号不是要找的,或指针不为空时*/p2=p1 ;/* 将 p1 指针值赋给 p2 作为 p1 的前驱指针 */欢迎下载精品学习资源p1=p1-next ;/* 将 p1 指针指向下一条记录 */ifstrcmpp1-num,s
24、=0 /*学号找到了 */printf*FOUND*n;printf-n;printf|Num|Name| sc1 | sc2 | sc3 | Sum |Ave| Order |n ;printf-n;printf|%4s|%4s| %3d | %3d | %3d | %3d | %4.2f | %-5d|n,p1-num,p1-name,p1-score0,p1-score1,p1-score2,p1-sum,p1-average,p1-order ;printf-n;printf*END*n;printfAre you sure to delete the student Y/N .; /
25、* 提示是否要删除 ,输入 Y 删除,N 就退出*/for ; scanf%c,&c;ifc=n|c=N break ; /* 假如不删除 ,就跳出本循环 */ ifc=y|c=Yifp1=head/* 如 p1=head,说明被删结点是首结点*/ head=p1-next ;/* 把其次个结点地址赐予head*/elsep2-next=p1-next ; /* 否就将一下结点地址赋给前一结点地址*/ n=n-1 ;printfnNum %s student have been deleted.n,s ;printfDont forget to save.n;break; /* 删除后就跳出循
26、环*/欢迎下载精品学习资源elseprintfnThere is no num %s student on the list.n,s; /* 找不到该结点 */ returnhead;/* 排序函数 */STUDENT *sortSTUDENT *headint i=0 ;/* 储存名次 */STUDENT *p1,*p2,*t,*temp;/* 定义临时指针 */temp=head-next ;/* 将原表的头指针所指的下一个结点作头指针*/ head-next=NULL ;/* 第一个结点为新表的头结点*/ whiletemp.=NULL/*当原表不为空时,进行排序*/t=temp ;/*
27、 取原表的头结点*/ temp=temp-next ; /* 原表头结点指针后移 */p1=head;/* 设定移动指针 p1,从头指针开头 */p2=head;/* 设定移动指针 p2 做为 p1 的前驱,初值为头指针 */ whilet-averageaverage&p1.=NULL /*作成果平均分比较 */p2=p1 ;/* 待排序点值小,就新表指针后移*/ p1=p1-next ;ifp1=p2/*p1=p2,说明待排序点值大,应排在首位*/t-next=p1 ;/* 待排序点的后继为p*/ head=t;/* 新头结点为待排序点 */else/* 待排序点应插入在中间某个位置p2
28、和 p1 之间,如 p 为空就是尾部 */t-next=p1 ; /*t 的后继是 p1*/欢迎下载精品学习资源p2-next=t ; /*p2 的后继是 t*/p1=head;/* 已排好序的头指针赋给p1,预备填写名次 */ whilep1.=NULL /*当 p1 不为空时,进行以下操作*/i+ ;/* 结点序号 */p1-order=i ; /* 将结点序号赋值给名次*/ p1=p1-next ; /* 指针后移 */printfSorting is sucessful.n; /* 排序成功 */ return head;/* 插入记录函数 */STUDENT *insertSTUDE
29、NT *head,STUDENT *newSTUDENT *p0,*p1,*p2;int n,sum1,i ;p1=head; /* 使 p1 指向第一个结点 */ p0=new; /*p0 指向要插入的结点*/printfnPlease enter a new record.n ;/* 提示输入记录信息 */ printfEnter the num:;scanf%s,new-num ;printfEnter the name: ;scanf%s,new-name ;printfPlease enter the %d scores.n,3 ;sum1=0; /* 储存新记录的总分,初值为0*/
30、 fori=0 ;iscorei;欢迎下载精品学习资源ifnew-scorei100|new-scoreiscorei100|new-scoreiscorei ; /* 累加各门成果 */new-sum=sum1 ; /* 将总分存入新记录中 */ new-average=floatsum1/3 ;new-order=0 ;ifhead=NULL /*原先的链表是空表*/head=p0 ;p0-next=NULL ; /* 使 p0 指向的结点作为头结点*/ elsewhilep0-averageaverage&p1-next.=NULLp2=p1 ; /* 使 p2 指向刚才 p1 指向的结
31、点 */ p1=p1-next ; /*p1 后移一个结点 */ifp0-average=p1-averageifhead=p1head=p0 ; /* 插到原先第一个结点之前*/ else p2-next=p0 ;/* 插到 p2 指向的结点之后 */p0-next=p1 ;elsep1-next=p0 ; p0-next=NULL ; /* 插到最终的结点之后*/n=n+1 ; /* 结点数加 1*/head=sorthead; /* 调用排序的函数 ,将同学成果重新排序 */ printfnStudent %s have been inserted.n,new-name ;printfD
32、ont forget to save the new file.n;returnhead;/* 储存数据到文件函数 */ void saveSTUDENT *headFILE *fp;/* 定义指向文件的指针 */欢迎下载精品学习资源STUDENT *p ;/* 定义移动指针 */ char outfile10 ;printfEnter outfile name,for example c:scoren;scanf%s,outfile ;iffp=fopenoutfile,wb=NULL/*为输出打开一个二进制文件,为只写方式 */printfCannot open the filen;ret
33、urn; /* 如打不开就返回菜单 */printfnSaving the file.n;p=head;/* 移动指针从头指针开头*/ whilep.=NULL/*如 p 不为空 */fwritep,LEN,1,fp;/* 写入一条记录 */ p=p-next ;/* 指针后移 */fclosefp ;/* 关闭文件 */ printfSave the file successfully.n;/* 从文件读数据函数 */ STUDENT *loadSTUDENT *p1,*p2,*head=NULL; /* 定义记录指针变量*/ FILE *fp ;/* 定义指向文件的指针 */char in
34、file10 ;printfEnter infile name,for example c:scoren;scanf%s,infile ;iffp=fopeninfile,rb=NULL/*打开一个二进制文件,为只读方式*/printfCan not open the file.n;returnhead;欢迎下载精品学习资源printfnLoading the file.n;p1=STUDENT *mallocLEN; /* 开创一个新单元 */ if.p1printfOut of memory.n;returnhead;head=p1;/* 申请到空间,将其作为头指针*/ while.feoffp /*循环读