1、学生信息管理程序一、设计目的:使用结构体数组结构实现简单的学生信息管理功能,要求具有数据输入、数据输出、数组排序、元素插入、元素删除、查询信息等功能。程序最多容纳60名学生的记录。二、设计要求:1、int Input(void);/使用程序中一个空白结构体,输入一名学生的个人及学习信息信息。此功能区返回一个值记录程序存储学生记录的数量*/2、 void Change_record(void);/修改学生的记录选项。3、void Delete_record(void);/删除学生记录选项。4、void Sort_record(void);/根据学生某项信息排序学生记录选项。5、 void Que
2、ry_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_tex
3、t()删除函数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(stui.name, 0);stui.num = 0;stui.score = 0;for (;)/通过for语句实现使用户自由决定是否重复使用此程序。switc
4、h (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;ca
5、se 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);/防止程序
6、运行窗口闪退。return 0;2、菜单模块:菜单3:提示用户输入修改某信息的选择菜单模块包括主菜单和部分功能中要调用的附属菜单,作用是向用户说明其输入的选择信息将使程序实现什么样的功能。具体流程图:菜单2、4、6:(分别在修改、查询、删除功能中被调用)提示用户输入某信息锁定某位学生菜单5:提示用户输入删除某信息的选择菜单7:提示用户输入查询某信息的选择结果主菜单1:(switch语句调用)菜单9:提示用户输入选择信息调用升序或降序排序功能菜单8:提示用户输入选择信息调用以某项信息排序功能结束菜单3、功能模块 功能模块的设计就是通过编写多个的函数对应程序所要求实现的功能。函数在主函数中将被编号
7、,使用户向程序输入的编号就能调用相应的函数体现程序的功能。查询学生记录功能具体流程图:修改学生记录功能寻找锁定学生记录功能删除学生记录功能排序学生记录功能提示选择具体的运用某功能,如修改、查询、删除某项信息、升序或降序排列、输入提取或写入文件的路径等等主菜单显示插入学生记录功能显示全部学生记录功能可从文本文件中提取学生记录功能结果显示或操作是否成功的说明可将学生记录写入文本文件中保存功能退出程序功能返回桌面四、详细设计及源代码:#include#include/提供system();语句。#include/提供strlen()函数。#define N 60 /定义全局常量N作为结构体数组stu
8、下标。 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(
9、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);/声明程序要调用的两个判断特殊
10、情况的函数。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);/声明两个在有排序
11、功能的函数中腰使用的函数。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, &stun.name);printf(请输入学生序号:);stun.num = judgement();printf(请输入学生信息:);s
12、canf(%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;)
13、/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+)/f
14、or语句打印出当时的所有学生记录。printf(第%d位学生姓名为%sn, i + 1, stui.name);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)/对有可从文本
15、文件中提取学生记录的函数的定义。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.name, &stui.num, &stui.score);printf(已提取出文本文件名称为%s中的所有学生记录!n, name0)
16、;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);f
17、or (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)/对在有查询学生记录功能的函数中要调用的函数的定义。
18、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-
19、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()函数被调用,在其
20、内调用前已经将寻找到得项的地址付给了全局指针变量point1*/printf(请按回车键确认您的操作!n);for (;)if (getchar(sure) = n)point2 = &stun - 1;swap(point1, point2);n-;break;system(cls);printf(删除记录成功,感谢使用!);system(pause);/*这里删除一个学生的全部记录的实现方法是:锁定要删除的学生记录将其地址赋给point1,通过地址来 把此时存入得学生记录中最后一位的信息存入该名学生信息存储的位置,然后清空最后一位学生的占用的结构体 数组元素并对程序中记录存入学生记录数量的
21、全局变量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
22、);/调用函数交换两个结构体数组元素内的所有信息。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)/对在有排序学生记录功能的函数中要调用的第二个函数的定义,即通过
23、学习信息排序。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 = &st
24、uc;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)/*对一个形参是指向函数的指针的函数的定义,此函
25、数将在查询、删除、修改函数中被使用,即通过用户输入的一名学生的名字或班内序号锁定该名学生记录的地址,保存在全局指针变量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
26、(请输入学生的序号:);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(stui.name, 0);stui.num = 0;stui.score = 0;for (;)/通过for语句实现使用户自由决定是否重复使用此程序。switch (Menu_select1()/使用switch语句
27、调用用户指定菜单项对应的函数。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)/对第二
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100