




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学生信息管理程序一、设计目的:使用结构体数组结构实现简单的学生信息管理功能,要求具有数据输入、数据输出、数组排序、元素插入、元素删除、查询信息等功能。程序最多容纳60名学生的记录。二、设计要求:1、int Input(void);/使用程序中一个空白结构体,输入一名学生的个人及学习信息信息。此功能区返回一个值记录程序存储学生记录的数量*/2、 void Change_record(void);/修改学生的记录选项。3、void Delete_record(void);/删除学生记录选项。4、void Sort_record(void);/根据学生某项信息排序学生记录选项。5、 void Query_record(void);/查询学生记录选项。6、void Display(void);/显示出当前程序存储的所有学生信息选项。7、void Add_from_text(int e);/从文本中提取学生记录输入程序进行处理。8、void Write_to_text(void);/将当前程序中存储的学生记录写入一个文本文件中。9、void Ending(void);/退出选项。三、总体设计:1、主函数模块: 主函数设计较为简单,主要是使用switch语句通过选择结构将整个程序能够实现的功能提示用户选择。修改函数Change_record();具体流程图:提取文本函数Add_from_text()删除函数Delete_record()调用菜单模块中的函数提示用户正确输入选择信息写入文本函数Write_to_text()主函数main()查询函数Query_record()排序函数Sort_record()结果展示函数Display()插入函数Input()桌面退出函数Ending()主函数代码: 25 / 25int main(void)/对主函数的定义。n = 0;for (i = 0; i N; i+)strcpy(, 0);stui.num = 0;stui.score = 0;for (;)/通过for语句实现使用户自由决定是否重复使用此程序。switch (Menu_select1()/使用switch语句调用用户指定菜单项对应的函数。case 1:Input(n);/插入学生记录函数。for (i = 0, n = 0; i N; i+)if (stui.num != 0)n+;break;case 2:Change_record();/修改学生的记录函数。break;case 3:Delete_record();/删除学生记录函数。break;case 4:Sort_record();/排序函数。break;case 5:Query_record();/查询函数。break;case 6:Dispaly();/展示函数。break;case 7:printf(请输入文件的路径:);scanf(%s, name0);printf(请输入此文本中有多少名学生的记录:);scanf(%d, &j);Add_from_text(j, name0);/从文本中添加学生记录的函数。n += j;break;case 8:printf(请输入文件的路径:);scanf(%s, name0);Write_to_text();/将学生记录写入文本的函数。break;case 9:/结束程序使用界面选项。Ending();break;default:continue;/菜单循环显示。system(cls);system(pause);/防止程序运行窗口闪退。return 0;2、菜单模块:菜单3:提示用户输入修改某信息的选择菜单模块包括主菜单和部分功能中要调用的附属菜单,作用是向用户说明其输入的选择信息将使程序实现什么样的功能。具体流程图:菜单2、4、6:(分别在修改、查询、删除功能中被调用)提示用户输入某信息锁定某位学生菜单5:提示用户输入删除某信息的选择菜单7:提示用户输入查询某信息的选择结果主菜单1:(switch语句调用)菜单9:提示用户输入选择信息调用升序或降序排序功能菜单8:提示用户输入选择信息调用以某项信息排序功能结束菜单3、功能模块 功能模块的设计就是通过编写多个的函数对应程序所要求实现的功能。函数在主函数中将被编号,使用户向程序输入的编号就能调用相应的函数体现程序的功能。查询学生记录功能具体流程图:修改学生记录功能寻找锁定学生记录功能删除学生记录功能排序学生记录功能提示选择具体的运用某功能,如修改、查询、删除某项信息、升序或降序排列、输入提取或写入文件的路径等等主菜单显示插入学生记录功能显示全部学生记录功能可从文本文件中提取学生记录功能结果显示或操作是否成功的说明可将学生记录写入文本文件中保存功能退出程序功能返回桌面四、详细设计及源代码:#include#include/提供system();语句。#include/提供strlen()函数。#define N 60 /定义全局常量N作为结构体数组stu下标。 int b, c, num0, n, i = 0, j = 0;char name040;/*将程序中多次定义的标识符设置为全局变量。*/struct studentchar name40;int num;int score;stuN;int Menu_select1(void);int Menu_select2(void);int Menu_select3(void);int Menu_select4(void);int Menu_select5(void);int Menu_select6(void);int Menu_select7(void);int Menu_select8(void);int Menu_select9(void);/声明程序中用到的多种菜单函数。struct student *point1, *point2;/全局定义程序中多次用到得结构体指针变量。int(*pot2)(void) = Menu_select2;int(*pot4)(void) = Menu_select4;int(*pot6)(void) = Menu_select6;int(*pot8)(void) = Menu_select8;/定义指向菜单函数的指针。int judgement(void);int judgement_small(void);/声明程序要调用的两个判断特殊情况的函数。FILE *fp;/定义指向文件型数据的指针变量。void Change_service(void);void Query_service(void);void Delete_service(void);void(*ser1)(void) = Change_service;void(*ser2)(void) = Delete_service;void(*ser3)(void) = Query_service;/定义指向在有特定功能的函数内部使用的函数的指针。void Sort_service1(int po);void Sort_service2(int po);/声明两个在有排序功能的函数中腰使用的函数。void swap(struct student *po1, struct student *po2);/对交换函数的声明。void Ending(void);/对有结束功能的函数的声明。void find(int(*p)(void), void(*q)(void);/对一个形参是指向函数的指针的函数的声明。void Input(int n)/对有插入学生记录功能的函数的定义。printf(请输入学生姓名:);scanf(%s, &);printf(请输入学生序号:);stun.num = judgement();printf(请输入学生信息:);scanf(%d, &stun.score);system(cls);/此语句执行后将清除运行窗口显示的结果。void Change_record(void)/对有修改学生记录功能的函数的定义。find(pot2, ser1);/在函数内部调用函数。void Delete_record(void)/对有删除学生记录功能的函数的定义。find(pot4, ser2);void Sort_record(void)/对有排序学生记录功能的函数的定义。j = Menu_select8();/通过菜单函数的返回值提供用户的选择信息来执行用户选定的功能for (; judgement_small() 0;)/for语句中的判断用判断函数处理后以提示是否输入错误。if (j = 1)j = Menu_select9();Sort_service1(j);/通过菜单函数的返回值作为另一个函数的实参来执行用户选定的功能。break;else if (j = 2)j = Menu_select9();Sort_service2(j);break;elsecontinue;void Query_record(void)/对有查询学生记录功能的函数的定义。find(pot6, ser3);void Dispaly(void)/对有显示全部学生记录功能的函数的定义。for (i = 0; i n; i+)/for语句打印出当时的所有学生记录。printf(第%d位学生姓名为%sn, i + 1, );printf(班内序号为%dn, stui.num);printf(学习信息为%dnn, stui.score);system(pause);/防止运行窗口闪退。void Ending(void)/对有退出功能的函数的定义。system(cls);printf(nt *nnnn);printf(nttt 欢迎下次继续使用,再见!nn);printf(nnnt *nnt);exit(0);/正常退出程序。void Add_from_text(int e, char ch)/对有可从文本文件中提取学生记录的函数的定义。fp = fopen(name0, r);/使指针指向文件。if (fp = fopen(name0, r) = NULL)/判断指针所指向的文件是否存在,不存在退出此函数。printf(无法找到路径为%s的文本文件。n, name0);system(pause);return;else/存在则从此文件中提取学生记录。for (i = n; i (n + e + 1); i+)fscanf(fp, %s%d*%d, &, &stui.num, &stui.score);printf(已提取出文本文件名称为%s中的所有学生记录!n, name0);system(pause);fclose(fp);/关闭文本文件,即指针fp不再指向任何文件。void Write_to_text(void)/对可将程序中存储并处理后的学生记录输出至一个文本文件。fp = fopen(name0, w);/使指针指向文件。if (fp = fopen(name0, w) = NULL)/判断指针所指向的文件是否存在,不存在退出此函数。printf(无法找到名为%d的文本文件。n, name0);system(pause);return;else/存在则将程序中储存的学生记录写入该文件。fprintf(fp, 姓名ttttt*班内序号t *学习信息*n);for (i = 0; i name, temp1);break;case 2:printf(此学生当前序号为%d,请输入要修改后的序号;, (*point1).num);temp2 = judgement();(*point1).num = temp2;break;case 3:printf(此学生当前信息为%d,请输入要修改后的信息;, (*point1).score);scanf(%d, &temp3);(*point1).score = temp3;break;default:break;void Query_service(void)/对在有查询学生记录功能的函数中要调用的函数的定义。switch (Menu_select7()/同上,选择项较多用switch语句。case 1:printf(此学生当前姓名为%s,班级内序号为%d,学习信息为%dn, point1-name, point1-num,point1-score);/*由于此函数作为实参在find()函数被调用,在其内调用前已经将寻找到得项的地址付给了 全局指针变量point1*/system(pause);break;case 2:printf(此学生当前姓名为%d。n, point1-name);system(pause);break;case 3:printf(此学生当前班内序号为%d。n, point1-num);system(pause);break;case 4:printf(此学生当前班内序号为%d。n, point1-score);system(pause);default:break;void Delete_service(void)/对在有删除学生记录功能的函数中要调用的函数的定义。j = Menu_select5();/选择项较少用if语句。if (j = 1)char sure;printf(此学生当前姓名为%s,班级内序号为%d,学习信息为%dn, point1-name, point1-num,point1-score);/*由于此函数作为实参在find()函数被调用,在其内调用前已经将寻找到得项的地址付给了全局指针变量point1*/printf(请按回车键确认您的操作!n);for (;)if (getchar(sure) = n)point2 = &stun - 1;swap(point1, point2);n-;break;system(cls);printf(删除记录成功,感谢使用!);system(pause);/*这里删除一个学生的全部记录的实现方法是:锁定要删除的学生记录将其地址赋给point1,通过地址来 把此时存入得学生记录中最后一位的信息存入该名学生信息存储的位置,然后清空最后一位学生的占用的结构体 数组元素并对程序中记录存入学生记录数量的全局变量n做减一处理*/else if (j = 2)/只删除一名学生的信息的功能。point1-score = 0;/指定学生信息清零。elsesystem(pause);void Sort_service1(int po)/对在有排序学生记录功能的函数中要调用的第一个函数的定义,即通过班内序号排序。int m = judgement_small();if (po = 1)/成立做降序处理。for (i = 0; i m; i+)for (c = i + 1; c stub.num)point1 = &stuc;point2 = &stub;b = c;swap(point1, point2);/调用函数交换两个结构体数组元素内的所有信息。printf(排序成功!感谢使用!n);system(pause);else/不成立则做升序处理。for (i = 0; i m; i+)for (c = i + 1; c m + 1; c+)b = i;if (stuc.num stub.num)point1 = &stuc;point2 = &stub;b = c;swap(point1, point2);printf(排序成功!感谢使用!n);system(pause);void Sort_service2(char po)/对在有排序学生记录功能的函数中要调用的第二个函数的定义,即通过学习信息排序。int m = judgement_small();if (po = 1)/做升序处理for (i = 0; i m; i+)for (c = i + 1; c stub.score)point1 = &stuc;point2 = &stub;b = c;swap(point1, point2);printf(排序成功!感谢使用!n);system(pause);return;else/做降序处理。for (i = 0; i m; i+)for (c = i + 1; c m + 1; c+)b = i;if (stuc.score stub.score)point1 = &stuc;point2 = &stub;b = c;swap(point1, point2);printf(排序成功!感谢使用!n);system(pause);return;void swap(struct student *po1, struct student *po2)/*对一个具有交换值功能的函数的定义,具体功能是交换两个结构体数组元素内的所有信息*/struct student temp0;temp0 = *po1;po1 = po2;*po2 = temp0;void find(int(*p)(void), void(*q)(void)/*对一个形参是指向函数的指针的函数的定义,此函数将在查询、删除、修改函数中被使用,即通过用户输入的一名学生的名字或班内序号锁定该名学生记录的地址,保存在全局指针变量point1中,然后用_service函数处理*/for (;)j = p();/通过函数的指针调用函数if (j = 1)printf(请输入学生的姓名:);scanf(%s, name0);name0strlen(name0) + 1 = 0;/防止字符数组越界。for (i = 0; i n)/对特殊情况的处理。printf(经寻找后没有发现姓名为%s的学生记录存入程序!n, name0);system(pause);break;else if (j = 2)printf(请输入学生的序号:);scanf(%d, &num0);for (i = 0; i n)printf(经寻找后没有发现序号为%d的学生记录存入程序!n, num0);system(pause);break;elsecontinue;/用户在选择出错时可以重新输入选择。int main(void)/对主函数的定义。n = 0;for (i = 0; i N; i+)strcpy(, 0);stui.num = 0;stui.score = 0;for (;)/通过for语句实现使用户自由决定是否重复使用此程序。switch (Menu_select1()/使用switch语句调用用户指定菜单项对应的函数。case 1:Input(n);/插入学生记录函数。for (i = 0, n = 0; i N)system(cls);printf(序号为1到60之间的一个整数,请重新输入:);scanf(%d, &final);if (final = 60)for (i = 0, k = 0; i N; i+)if (final = stui.num)k+;break;if (k = 0)break;elsesystem(cls);printf(您输入的序号已被使用请再次输入不同的序号:);scanf(%d, &final);return(final);int judgement_small(void)/对第二个判断函数的定义,针对于排序函数中的一类特殊情况设计。int m = -1;for (i = 0; i N; i+)if (stui.num != 0)m+;if (m = 0)printf(程序当前只存储了%d位学生的信息,无法排序!n, m + 1);system(pause);return m;五、程序调试: 运行程序:显示:* *欢迎使用学生信息管理程序* 功能菜单1、添加学生记录信息选项2、修改学生的记录选项3、删除学生记录选项4、根据学生某项信息排序学生记录选项5、查询学生记录选项6、显示当前存储的所有学生记录选项7、从文本文件中提取学生记录选项8、将当前存入程序的学生记录写入文本文件9、退出选项* 此时程序中存储了0个学生的记录请输入您的选择:输入:1 回车显示:请输入学生姓名:输入:a 回车显示:请输入学生序号:输入:1 回车显示:请输入学生信息:输入:78 回车(回到菜单,在菜单的下面一行中将变为“此时程序中存储了1个学生的记录”)输入:2 回车显示:1、通过名字找出要修改的学生记录(换行)2、通过序号找出要修改的学生记录(换行)请输入1或者2: (下面演示通过名字找到的学生的效果,用序号找输入方法类似,便不在下面说明)输入:1 回车显示:(原选项菜单依然显示)请输入学生姓名:输入:a 回车(输入错误时按回车后显示如下:“经寻找后没有发现姓名为s的学生记录存入程序!”请按任意键继续,按下回车后将返回主菜单)显示:1、修改学生的姓名(换行)2、修改学生的序号(换行)3、修改学生的信息(换行)请输入1或2或者3:输入:2 回车显示:此学生当前序号为1,请输入要修改的序号:输入:2 回车(返回主菜单,此时在输入1加入一个学生的记录为姓名是s,班内序号为1,信息为89。返回主菜单后菜单下方则变为“2个学生”)输入:3 回车(显示的菜单与上面演示修改功能是出现的菜单相似,只有修改变成了删除)输入:1 回车显示:请输入学生的姓名:输入:a 回车显示:1、删除此学生的所有信息2、删除此学生的学习信息请输入1或者2:输入:1 回车显示:删除记录成功,感谢使用!请按任意键继续(按回车后返回主菜单,此时主菜单下变为“此时程序中存储了1个学生的记录”。由此使用排序功能无意义则在此时不演示选项4的操作)输入:5 回车(菜单选项与上面的删除和修改菜单类似,对于显示的内容描述省略) 输入:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 英语学习发言稿
- 2025年多肉植物项目提案报告
- 光电类知识培训内容课件
- 2025-2030中国氢化丁腈橡胶行业发展趋势及投资风险分析报告
- 光学竞赛课件
- 2025版城市基础设施建设专项授信额度短期借款合同
- 二零二五年度厂房出租安全与环保达标协议
- 2025电力运维技术服务外包合同(含预防性维护)
- 2024年长兴县医院招聘真题
- 二零二五年定制化车牌租赁合同
- 黄田坝泥石流工程地质勘查报告
- 惠州2024年广东惠州城市职业学院第一批合同制教职工招聘37人笔试上岸历年典型考题与考点剖析附带答案详解
- 学习强安应急第一响应人理论考试答案
- 情绪管理游戏方案
- 消防主题毕业答辩
- 重庆第二外国语学校数学新初一分班试卷含答案
- 06黄伯荣、廖序东《现代汉语》增订6版课件-第2章-语音-第七、八、九节
- 孕产妇营养指导与咨询制度
- 70周岁换证三力测试题,老人反应能力驾考模拟测试题
- 美容注射操作规范培训课件
- 新进人员院感培训
评论
0/150
提交评论