C语言课程设计报告(1)_第1页
C语言课程设计报告(1)_第2页
C语言课程设计报告(1)_第3页
C语言课程设计报告(1)_第4页
C语言课程设计报告(1)_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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(, "0");stui.num = 0;stui.score = 0;for (;)/通过for语句实现使用户自由

4、决定是否重复使用此程序。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:Di

5、spaly();/展示函数。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();/将学生记录写入文本的函

6、数。break;case 9:/结束程序使用界面选项。Ending();break;default:continue;/菜单循环显示。system("cls");system("pause");/防止程序运行窗口闪退。return 0;2、菜单模块:菜单3:提示用户输入修改某信息的选择菜单模块包括主菜单和部分功能中要调用的附属菜单,作用是向用户说明其输入的选择信息将使程序实现什么样的功能。具体流程图:菜单2、4、6:(分别在修改、查询、删除功能中被调用)提示用户输入某信息锁定某位学生菜单5:提示用户输入删除某信息的选择菜单7:提示用户输入查询某信息的选择

7、结果主菜单1:(switch语句调用)菜单9:提示用户输入选择信息调用升序或降序排序功能菜单8:提示用户输入选择信息调用以某项信息排序功能结束菜单3、功能模块 功能模块的设计就是通过编写多个的函数对应程序所要求实现的功能。函数在主函数中将被编号,使用户向程序输入的编号就能调用相应的函数体现程序的功能。查询学生记录功能具体流程图:修改学生记录功能寻找锁定学生记录功能删除学生记录功能排序学生记录功能提示选择具体的运用某功能,如修改、查询、删除某项信息、升序或降序排列、输入提取或写入文件的路径等等主菜单显示插入学生记录功能显示全部学生记录功能可从文本文件中提取学生记录功能结果显示或操作是否成功的说明

8、可将学生记录写入文本文件中保存功能退出程序功能返回桌面四、详细设计及源代码:#include<stdio.h>#include<windows.h>/提供system();语句。#include<string.h>/提供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

9、_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;

10、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) = Ch

11、ange_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)

12、, void(*q)(void);/对一个形参是指向函数的指针的函数的声明。void Input(int n)/对有插入学生记录功能的函数的定义。printf("请输入学生姓名:");scanf("%s", &);printf("请输入学生序号:");stun.num = judgement();printf("请输入学生信息:");scanf("%d", &stun.score);system("cls");/此语句执行后将清除运行窗口显示

13、的结果。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 = Men

14、u_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位学生姓名为%

15、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");e

16、xit(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 < (

17、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");/使指针指向文件。i

18、f (fp = fopen(name0, "w") = NULL)/判断指针所指向的文件是否存在,不存在退出此函数。printf("无法找到名为%d的文本文件。n", name0);system("pause");return;else/存在则将程序中储存的学生记录写入该文件。fprintf(fp, "姓名ttttt*班内序号t *学习信息*n");for (i = 0; i < n; i+)fprintf(fp, "%-40s* %-14d* %-5d *n", , s

19、tui.num, stui.score);printf("已将学生记录存储入名称为%s的文件中!n", name0);system("pause");fclose(fp);/关闭文本文件,即指针fp不再指向任何文件。void Change_service(void)/对在有修改学生记录功能的函数中要调用的函数的定义。char temp140;int temp2, temp3;switch (Menu_select3()/*菜单函数的返回值用作switch语句的选择信息 (选择项较多用switch语句较少则用if语句)。*/system("cls

20、");case 1:printf("此学生当前姓名为%s,请输入要修改后的名字;", (*point1).name);/*由于此函数作为实参 在find()函数被调用,在调用前已经将寻找到得项的地址付给了全局指针变量point1*/scanf("%s", temp1);strcpy(point1->name, temp1);break;case 2:printf("此学生当前序号为%d,请输入要修改后的序号;", (*point1).num);temp2 = judgement();(*point1).num = te

21、mp2;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"

22、, 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(&qu

23、ot;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->

24、;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");/*这里删除一个学生

25、的全部记录的实现方法是:锁定要删除的学生记录将其地址赋给point1,通过地址来 把此时存入得学生记录中最后一位的信息存入该名学生信息存储的位置,然后清空最后一位学生的占用的结构体 数组元素并对程序中记录存入学生记录数量的全局变量n做减一处理*/else if (j = 2)/只删除一名学生的信息的功能。point1->score = 0;/指定学生信息清零。elsesystem("pause");void Sort_service1(int po)/对在有排序学生记录功能的函数中要调用的第一个函数的定义,即通过班内序号排序。int m = judgement_sma

26、ll();if (po = 1)/成立做降序处理。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");else/不成立则做升序处理。for (i = 0; i < m; i

27、+)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)/做升序处理

28、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;else/做降序处理。for (i = 0; i < m; i+)for (c = i + 1; c < m + 1; c+)b = i;

29、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;*

30、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'/防止字符数组越界

31、。for (i = 0; i < N; i+)if (strcmp(name0, ) = 0)/比较两个字符数组point1 = &stui;/全局变量存入锁定的学生地址。q();return;/退出函数。if (i > n)/对特殊情况的处理。printf("经寻找后没有发现姓名为%s的学生记录存入程序!n", name0);system("pause");break;else if (j = 2)printf("请输入学生的序号:");scanf("%d", &nu

32、m0);for (i = 0; i < N; i+)if (num0 = stui.num)point1 = &stui;q();return;if (i > n)printf("经寻找后没有发现序号为%d的学生记录存入程序!n", num0);system("pause");break;elsecontinue;/用户在选择出错时可以重新输入选择。int main(void)/对主函数的定义。n = 0;for (i = 0; i < N; i+)strcpy(, "0");stui.nu

33、m = 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;

34、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

35、", name0);Write_to_text();/将学生记录写入文本的函数。break;case 9:/结束程序使用界面选项。Ending();break;default:continue;/菜单循环显示。system("cls");system("pause");/防止程序运行窗口闪退。return 0;int Menu_select1(void)/对第一个菜单函数的定义。printf("t *nn");printf("nttt *欢迎使用学生信息管理程序*nn");printf("ttt

36、t 功能菜单nnn");printf("t 1、添加学生记录信息选项n");printf("t 2、修改学生的记录选项n");printf("t 3、删除学生记录选项n");printf("t 4、根据学生某项信息排序学生记录n");printf("t 5、查询学生信息选项n");printf("t 6、显示出当前存储的所有学生信息n");printf("t 7、从文本文档中添加学生记录n");printf("t 8、将当前存入的学生记

37、录写入文本文档n");printf("t 9、退出选项n");printf("t *nn");printf("ttttt 此时程序中存储了%d个学生的信息nn", n);printf("请输入您的选择:");scanf("%d", &i);/将用户指定的菜单项序号储存在变量i中。system("cls");return (i);/将i作为函数返回值。int Menu_select2(void)/对第二个菜单函数的定义。system("cls&quo

38、t;);printf("t1、通过名字找出要修改的学生记录nn");printf("t2、通过序号找出要修改的学生记录nn");printf("tt请输入1或者2:");scanf("%d", &i);return(i);int Menu_select3(void)/对第三个菜单函数的定义。system("cls");printf("t1、修改学生的姓名nn");printf("t2、修改学生的序号nn");printf("t3、修改学生

39、的信息nn");printf("ttt请输入1或2或者3:");scanf("%d", &i);return(i);int Menu_select4(void)/对第四个菜单函数的定义。system("cls");printf("t1、通过名字找出要删除的学生记录nn");printf("t2、通过序号找出要删除的学生记录nn");printf("tt请输入1或者2:");scanf("%d", &i);return(i);int

40、 Menu_select5(void)/对第五个菜单函数的定义。system("cls");printf("t1、删除此学生的所有信息nn");printf("t3、删除此学生的学习信息nn");printf("ttt请输入1或者2:");scanf("%d", &i);return(i);int Menu_select6(void)/对第六个菜单函数的定义。system("cls");printf("t1、通过名字找出要查询的学生记录nn");p

41、rintf("t2、通过序号找出要查询的学生记录nn");printf("tt请输入1或者2:");scanf("%d", &i);return(i);int Menu_select7(void)/对第七个菜单函数的定义。system("cls");printf("t1、查询此学生的所有信息nn");printf("t2、查询此学生的姓名nn");printf("t3、查询此学生的班内序号nn");printf("t4、查询此学生的学习信

42、息nn");printf("ttt请输入1到4间的一个整数:");scanf("%d", &i);return(i);int Menu_select8(void)/对第八个菜单函数的定义。system("cls");printf("t1、根据学生的班内序号排序学生记录nn");printf("t2、根据学生的学习信息排序学生记录nn");printf("tt请输入1或者2:");scanf("%d", &i);return(i);

43、int Menu_select9(void)/对第九个菜单函数的定义。system("cls");printf("t1、按此组数据对学生记录进行降序排序nn");printf("t2、按此组数据对学生记录进行升序排序nn");printf("tt请输入1或者2:");scanf("%d", &i);return(i);int judgement(void)/对第一个判断函数的定义,判断班内序号是否大于60或者有重复序号的情况。int i, out, k, final;scanf(&quo

44、t;%d", &final);for (out = 1; out = 1;)if (final > 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(&quo

45、t;您输入的序号已被使用请再次输入不同的序号:");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;五、程序调试:

46、运行程序:显示:* *欢迎使用学生信息管理程序* 功能菜单1、添加学生记录信息选项2、修改学生的记录选项3、删除学生记录选项4、根据学生某项信息排序学生记录选项5、查询学生记录选项6、显示当前存储的所有学生记录选项7、从文本文件中提取学生记录选项8、将当前存入程序的学生记录写入文本文件9、退出选项* 此时程序中存储了0个学生的记录请输入您的选择:输入:1 回车显示:请输入学生姓名:输入:a 回车显示:请输入学生序号:输入:1 回车显示:请输入学生信息:输入:78 回车(回到菜单,在菜单的下面一行中将变为“此时程序中存储了1个学生的记录”)输入:2 回车显示:1、通过名字找出要修改的学生记录(换行)2、通过序号找出要修改的学生记录(换行)请输入1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论