收藏 分销(赏)

学生信息管理系统c语言课程设计大学论文.doc

上传人:快乐****生活 文档编号:5176184 上传时间:2024-10-28 格式:DOC 页数:42 大小:514KB 下载积分:12 金币
下载 相关 举报
学生信息管理系统c语言课程设计大学论文.doc_第1页
第1页 / 共42页
学生信息管理系统c语言课程设计大学论文.doc_第2页
第2页 / 共42页


点击查看更多>>
资源描述
湖南商学院 《C语言程序设计》课程设计(实习)报告 题 目 学生信息管理系统 姓 名: 田怡慧 学 号: 120910024 专 业: 电子信息工程 班 级: 1201班 指导教师: 罗新密 职 称: 副教授 计算机与信息工程学院 2013年6月 课程设计(实习)评审表 姓 名 田怡慧 学 院 计算机与信息学院 学 号 120910024 专业班级 电信1201班 题 目 学生信息管理系统 评 审 意 见 评审成绩 指导教师签名 职称 评审时间 年 月 日 课程设计(实习)作品验收表 题目 学生信息管理系统 参与人员 姓 名 田怡慧 班 级 电信1201班 学 号 120910024 设计任务与要求: 1、录入学生信息时要求对学号做验证,要求不能重复,年龄和性别做验证,要求合法 2、删除学生信息可以按2种方式删除:学号和姓名 3、按学号修改学生相关信息,要求对新数据录入时做验证 4、按照学号或姓名查询学生信息,其中按姓名查询要实现模糊查询 5、打印功能为打印出所有学生信息 6、写日志功能为开流向文件中写入当前所有已经保存的学生信息 作品完成情况: 学生信息管理系统的新增、删除、修改、查询、打印、写日志、退出七个功能完成良好。 验收情况: 验收教师签名:___________       年 月 日 目录 1 实验目的与要求 1 1.1 设计任务 1 1.2 问题分析 1 2总体设计 2 2.1系统设计思想、设计方案的选择 2 2.2 系统结构图 2 3详细设计及实现 3 3.1 确定所需模块 3 3.2 各子模块功能描述 3 3.3 模块间调用关系 5 4测试 12 4.1系统测试用例的设计 12 4.2系统测试结果 12 5课程设计总结 16 参考文献 17 附录 17 38 课程设计(实习)题目:学生信息管理系统 1 实验目的与要求 1.1 设计任务 设计要求: (1)强化学生编码、调试错误的能力。 (2)了解和掌握C语言相关技术和开发流程。 (3)了解软件开发的流程和项目管理控制 (4)IT行业及职业人应具备的素质。 (5)增强团队意识和团队合作精神。 设计任务: 实现学生信息化的管理,要求实现一个学生管理的系统,要求完成下列功能: (1)学生信息内容包括:学号(不重复)、姓名、年龄、性别、专业。 (2)录入学生信息时要求对学号做验证,要求不能重复,年龄和性别做验证,要求合法。 (3)删除学生信息可以按2种方式删除:学号和姓名。 (4)按学号修改学生相关信息,要求对新数据录入时做验证。 (5)按照学号或姓名查询学生信息,其中按姓名查询要实现模糊查询。 (6)打印功能为打印出所有学生信息。 (7)写日志功能为开流向文件中写入当前所有已经保存的学生信息。 1.2 问题分析 该题主要考察学生对结构体,指针,文件的操作,以及C语言算法的掌握,所以完成此道题目要求较强的设计能力,尤其是要有一种大局观的意识。如何调程序也非常重要,通过这个程序可以学习到以前调试短程序没有的的经验。 菜单中的每一个选项都对应一个子程序,子程序的算法几乎囊获了所有C语言学过的技巧,下面就各个子程序中的功能进行说明: 功能1为新增的功能,因为考虑到原来给出的函数中竟然没有对学生信息的统计功能,因此新增此功能,可以得出所有的记录个数,并输出相关的学生信息等。 功能2为按姓名删除记录,先输入姓名,再一一比较,如果没有则返回失败信息,如果找到就将此记录都向前移一位,返回n-1。 功能3为按学号和姓名查询记录,先输入学号,再一一比较,如果没有则返回失败信息,如果找到就将此记录输出。输入姓名查找时,采用模糊查找法。 功能4的算法在2中就已经体现了,输入姓名,一一比较。 功能5是显示所有的记录,通过循环输出,格式也比较重要。 功能6是对文件的操作,提前准备好数据。 2总体设计 2.1系统设计思想、设计方案的选择 建立学生信息管理系统,要求各模块共同实现其功能。那么具体怎样实现呢?首先,写出一个主函数main(),相当于一个主菜单,实现对子函数功能的选择,然后,写出各个子函数。采用函数,可以避免代码的重复出现,节省了空间,且提高了代码运算的效率。 2.2 系统结构图 主菜单 main()函数 新增addSer() 删除 delSer() 修改modify() 查询find() 打印priStuInfo() 写日志write() 退出 quit() 3详细设计及实现 本系统在编辑过程中一共使用了4个头文件、定义了14个函数和1个结构体以实现菜单、输入数据,删除信息,查询信息,修改信息,打印信息、写日志、退出八个主要的功能,各个不同的功能的函数的调用通过一个main()主函数和四个其他的菜单函数实现功能的选择和切换。 3.1 确定所需模块 addSer():输入某个学生的信息 delSer():输入要删除的学生学号,并且做空判定 modify():修改学生信息 find():查询学生信息 priStuInfo()::打印学生信息 write():写入日志 quit():实现退出程序,在退出前清理内存 3.2 各子模块功能描述 菜单部分: 菜单函数在本程序中是实现各个不同的功能的函数之间的反复调 用,因此是实现系统运行的很重要的部分。在本系统中为了实现操作界面的简单化,设计了1个主菜单函数,主菜单函数显示出了新增、删除、修改、查询、打印、写日志、退出七个主要的功能。 因为在设计函数时,为了让函数之间可以彼此调用,实现功能的模块化,我选择了每一个函数都返回所处理的链表的首地址,因此定义的是返回指针的函数,因此在主函数中定义了struct stuInfo型指针变量p用于接受每个函数返回的地址,同时定义一个新的整形变量用于录入使用者的选择,代入if else函数进行判断从而调用不同功能的函数,在本系统中默认输入0为返回主目录,便于进行其他的操作。 新增部分: 自定义函数int valiNum(char *num)判断学号是否合法,判断学号是否已经存在,若已存在则不合法。 自定义函数int valiAge(int age)判断年龄是否合法,若年龄等于0则不合法。 自定义函数int valiSex(char sex)判断性别是否合法,若输入的性别不是男或女,则不合法。 自定义函数int addStuInfo(struct stuInfo s) 将传入的学生信息实现保存到集合中。 自定义一个函数int addSer()新增学生信息,此函数运用前面的自定义函数来判断学号、年龄、性别是否合法,以此来新增学生信息,并将这个函数运用到主函数中 删除部分: 删除信息部分包括一个查询模块和一个执行删除函数,删除函数 是根据学生的学号查询学生的信息进行删除操作,因此在删除之前如果不知道学号可以根据查询功能首先进行查询,得到具体的信息之后读取学号,进行删除。 修改部分: 修改信息部分用了一个strcmp函数,首先判定学生信息是否为空,如果为空,则修改失败。否则就将输入的学生信息与之前输入的学生信息进行比较,如果相同则能执行修改。修改可以按学号或者按姓名修改。 查询部分: 本系统为了使用方便同样定义了一个函数find以实现学号,姓名的查找。在查找中,首先把查找链表的首地址p传递进入find函数的形参, 函find数中又定义了一个变量(根据不同的函数查找功能的不同而变化,如学好查找就定义long int型)函数find根据首地址进行读取,用for函数进行判断,如果p= =NULL则直接输出链表空置,请补充信息,其余状况才实现继续扫描。其实现过程实质是链表的遍历及按条件输出的结果。当结点的 num 成员与用户的输入值吻合时,则输出该结点的信息,否则则扫描下一个结点的信息,依次类推。当所有的结点均被扫描但仍未发现吻合的 num值时,会提示“不存在的信息”,并跳转到主菜单以实现重新操作。如果发现吻合的信息,用printf函数输出该结点的信息,即为我们所需要查找学生的信息,此时查找终止,返回主菜单。在查询函数中不改变原来连表内部保存的数值信息。 打印部分: 输出函数定义为无返回值(void)型,定义一个for循环,判断循环条件是当变量小于学生人数时,通过printf输出每一个结点信息。当读入最后一个结点时,循环终止,函数结束。 写日志部分: 首先获得系统当前时间。如果获得成功,返回时间。再写入日志。time_t nowtime声明变量nowtime为time_t 型。struct tm *timeinfo声明变量timeinfo为tm型结构指针。time_t,tm都是time.h头文件里定义的类型。time(&nowtime)调系统函数time(),获得现在时间。timeinfo=(localtime(&nowtime)) 调系统函数,获得当地现在时间,时间数据是tm型结构。 退出部分: 实现退出程序,在退出前清理内存。 3.3 模块间调用关系 注:“→”代表调用 (1)主函数 开始 main() addSer() modify() quit() delSer() write() find() priStuInfo() 结束 1 2 3 4 5 6 7 (2)新增 开始 判断学生信息是否存在 输入学生信息 输入要新增的学生学号 判断学生学号是否存在 新增成功 新增失败 结束 1 0 (3)删除 开始 1 0 结束 判断学生信息是否存在 输入要删除的学生学号 1 判断学生学号是否存在 删除失败 0 删除成功 (4)修改 结束 开始 判断学生信息是否存在 输入学生学号 判断学生学号是否存在 修改失败 修改成功 输入要修改的学生学号 1 1 0 0 (5)查询 i=0 find() i<student strcmp((p+i)->num,str1) == 0 输出(p+i)->num的信息 i++ 0 1 开始 结束 (6)打印 开始 0 判断学生信息是否存在 1 打印学生信息 结束 (7)写日志 判断学生信息是否存在 开始 写日志成功 结束 写日志失败 1 0 (8)退出 开始 退出程序 结束 4测试 4.1系统测试用例的设计 ⑴进入界面 ⑵输入选项1,回车;按提示输入新增数据; ⑶回到主菜单,输入2,回车;按提示输入学号,删除数据;出现删除成功的信息 ; ⑷回到主菜单,输入3,回车;出现修改学生信息; ⑸回到主菜单,输入4,回车;提示按输入学号或按输入姓名,进行查询信息 ; ⑹回到主菜单,输入5,回车;出现删除、修改后的学生信息; ⑺回到主菜单,输入6,回车;出现成功写入文件的信息; ⑻回到主菜单,输入7,回车;退出系统 。 4.2系统测试结果 ⑴ 测试学生信息管理系统的新增功能成功和失败时情况 图1 新增成功 图2 新增失败 ⑵ 测试学生信息管理系统的能否打印情况 图3 实现打印 ⑶ 测试学生信息管理系统的删除功能情况 图4 删除成功 ⑷ 测试学生信息管理系统的修改功能情况 图5 修改成功 ⑸ 测试学生信息管理系统的查询功能情况 图6 实现按学号查询和按姓名查询 ⑹ 测试学生信息管理系统的能否写日志情况 图7 写日志成功 ⑺ 测试学生信息管理系统的能否退出情况 图8 实现退出 5课程设计总结 进入本学期以来,我们开始学习C语言课程,这是对于计算机的 学习与使用过程中极为重要的一门课程。本次实习经历,让我对于C语言的理解不仅仅局限在了书本上,而且获得了一次难得的机会去实践所学内容,综合运用一个学期所学习的知识,进行一次系统而复杂的程序编写工作,提高了自己的编程能力,加深了我对与C语言的理解 同时积累了可贵的编程经验,获益匪浅。其中有几点很大的收获如下: ①C语言是一门实践性的课程,只是学习书本知识是远远不够熟练的掌握它的,要想充分的理解和运用C语言,我们不仅仅需要理解每一个语句的含义和使用方法,而且要通过大量的编写程序来熟练的使用他。而本次实习课程正是为我们创造了这样的条件。学生信息管理系统就目前阶段而言,对我们来说是比较复杂的一个系统,在编写系统过程中,为了实现我们想要的各种功能,我几乎用到了所有的学习过的内容,这一次程序编写是对自己C语言的一次综合考察,全面的测试了自己的学习情况,我就在本次事件中了解到了自己结构数组的知识还不够熟练,有待提高。 ②本次实习我深刻的学习到了计算机编程的思想,即把复杂 的问题简单化,这一种处理问题的思想在本系统中定义的许多函数中都有体现,如删除函数,查找函数。 ③程序模块化设计的方法,在本次系统设计之中,处处体现着这一种思想,想染大量的定义和使用函数让主程序更加的清晰和简单化,同时还可以通过增加和减少,改变函数的内容来修改整个系统的功能和运行情况,而不回影响到其他的程序的运行。编写的程序在一定的条件下可以实现重复使用大大减少了所需要编写的程序的数量,极大的方便了我们的程序编写工作。学习编写和调用函数是我们在熟练使用计算机语言过程中 必不可少了的一项能力。 ④整体思想,在模块化思想的基础上整体思想极为重要,因为要把如此众多的函数反复的调用,许多的模块都不再是单一的完成该项功能,他还需要与其他的函数相配合完成该项功能,因此许多的语句都有很重要的意义,比如输出函数本不需要返回值,但 是为了配合全部的函数同样定义为了一个返回指针的函数 。 ⑤在实习过程中,我锻炼了自己解决问题的能力,编写程序往往会出现很多的问题导致无法运行,或者应有的功能无法实现,折旧需要我们深刻的理解每一个语句的含义从中找到问题,并加以改正,这一次实习我充分经历了这样的过程,提高了自己,现在已经基本能够迅速发现各种问题,加深了常见的集中错误的影响,为以后的进一步的学 习和实践提供了基础。 参考文献 1、谭浩强 C语言设计(第二版)[M]. 北京:清华大学出版社,1999年12月 2、谭浩强 C语言程序设计解题与上机指导[M]. 北京:清华大学出版社,2000年11月 3、谭浩强. C程序设计(第三版)[M]. 北京:清华大学出版社,2010 4、Herbert Schitldt 著.戴建鹏译.c语言大全(第二版).北京:电子工业出版社,1994 5、孟彩霞.计算机软件基础[M].西安:西安电子科技大学出版社,2003. 附录 源代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> int valiNum(char *num); int valiAge(int age); int valiSex(char sex); int addStuInfo(struct stuInfo s); int addSer(); void priStuInfo(); void quit(); int empty(); int delSer(); int getStuInfoByNum(char *num); int delStuInfo(char *num); void find(); void modify(); void write(); struct stuInfo { char *num; char *name; char sex; int age; char *mgr; }; //定义存放学生信息集合的全局变量 struct stuInfo *p = NULL; //存放学生的人数 int student = 0; int main() { char select; while(1) { printf("\t\t$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n"); printf("\t\t$ 学生信息管理系统 $\n"); printf("\t\t$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n"); printf("请选择功能:\n"); printf("1.新增 2.删除 3.修改 4.查询 5.打印 6.日志 7.退出\n"); fflush(stdin); scanf("%c",&select); fflush(stdin); if(select == '1') { if(addSer()) { printf("新增成功\n"); }else { printf("新增失败\n"); } }else if(select == '2') { if(delSer()) { printf("删除成功\n"); }else { printf("删除失败\n"); } }else if(select == '3') { modify(); }else if(select == '4') { find() ; }else if(select == '5') { priStuInfo(); }else if(select == '6') { write(); }else if(select == '7') { quit(); }else { printf("选择错误\n"); } } return 0; } /* 功能:验证学号是否存在 返回值:如果学号存在,返回1,否则返回0 形参:num:传入要验证的学号,数据类型为:char * */ int valiNum(char *num) { int flag = 0; int i; if(p == NULL) { return flag; } for(i = 0;i < student;i++) { if(strcmp((p+i)->num,num) == 0) { flag = 1; break; } } return flag; } /* 功能:验证性别是否合法 返回值:如果性别合法,返回1,否则返回0 形参:sex:传入要验证的性别,数据类型为:char */ int valiSex(char sex) { int flag = 0; if(sex != 'm' && sex != 'M' && sex != 'f' && sex != 'F') { return flag; } flag = 1; return flag; } /* 功能:验证年龄是否合法 返回值:如果年龄合法,返回1,否则返回0 形参:age:传入要验证的年龄,数据类型为:int */ int valiAge(int age) { int flag = 0; if(age < 1 || age > 60) { return flag; } flag = 1; return flag; } /* 功能:打印学生信息 返回值:无 形参:无 */ void priStuInfo() { int j; printf("学号\t姓名\t性别\t年龄\t专业\n"); for(j = 0;j< student;j++) { printf("%s\t%s\t%c\t%d\t%s\n",(p+j)->num,(p+j)->name,(p+j)->sex,(p+j)->age,(p+j)->mgr); } } /* 功能:将传入的学生信息实现保存到集合中 返回值:如果新增成功,返回1,否则返回0 形参:s:要新增的学生信息,为一个结构体 */ int addStuInfo(struct stuInfo s) { int flag = 0; if(student == 0) { p = (struct stuInfo *)malloc(sizeof(struct stuInfo)); if(p == NULL) { printf("空间分配失败"); return flag; } student++; }else { student++; p = (struct stuInfo *)realloc(p,student*sizeof(struct stuInfo)); if(p == NULL) { printf("空间分配失败"); student--; return flag; } } *(p+student-1) = s; flag = 1; return flag; } /* 功能:输入某个学生的信息 返回值:如果新增成功,返回1,否则返回0 形参:无 */ int addSer() { //存放验证通过的学生信息 struct stuInfo s; char sno[50]; char name[50]; char sex; int age; char mgr[100]; printf("请输入学号\n"); gets(sno); if(student != 0) { if(valiNum(sno)) { printf("该学号已经存在\n"); return 0; } } printf("请输入姓名\n"); fflush(stdin); gets(name); printf("请输入性别\n"); fflush(stdin); scanf("%c",&sex); if(valiSex(sex) == 0) { printf("性别非法\n"); return 0; } printf("请输入年龄\n"); scanf("%d",&age); if(valiAge(age) == 0) { printf("年龄非法\n"); return 0; } printf("请输入专业\n"); fflush(stdin); s.mgr = (char *)malloc(100*sizeof(char)); if(s.mgr == NULL) { return 0; } s.num = (char *)malloc(50*sizeof(char)); if(s.num == NULL) { return 0; } s.name = (char *)malloc(50*sizeof(char)); if(s.name == NULL) { return 0; } gets(mgr); s.age = age; s.sex = sex; strcpy(s.mgr,mgr); strcpy(s.name,name); strcpy(s.num,sno); return addStuInfo(s); } /* 功能:验证学生信息是否为空 返回值:如果学生信息为空,返回1,否则返回0 ,返回值类型int 形参:无 */ int empty() { if(student == 0) { return 1; } return 0; } /* 功能:输入要删除的学生学号,并且做空判定 返回值:如果删除成功,返回1,否则返回0 形参:无 */ int delSer() { int flag = 0; char num[100]; if(empty()) { printf("学生信息为空,不能删除\n"); return flag; } printf("请输入要删除的学生学号\n"); fflush(stdin); gets(num); return delStuInfo(num); } /* 功能:按学生学号获得学生信息下标 返回值:如果存在该学生信息,返回其下标,否则返回-1 形参:num:要查询的学生学号,数据类型char * */ int getStuInfoBynum(char *num) { int m; //用于存放学生信息下标 int c = -1; for(m = 0;m < student;m++) { if(strcmp((p+m)->num,num) == 0) { c = m; break; } } return c; } /* 功能:根据学号删除学生信息 返回值:如果删除成功,返回1,否则返回0 形参:num:要删除的学生学号,数据类型char * */ int delStuInfo(char *num) { int flag = 0; int n; if(valiNum(num)) { int c = getStuInfoBynum(num); if(student == 1) { free(p->num); free(p->name); free(p->mgr); free(p); p = NULL; student--; flag = 1; }else if(c == student - 1) { student --; p = (struct stuInfo *)realloc(p,student*sizeof(struct stuInfo)); flag = 1; }else { for(n = c;n < student-1;n++) { *(p+n) = *(p+n+1); } student --; p = (struct stuInfo *)realloc(p,student*sizeof(struct stuInfo)); flag = 1; } } if(flag == 0) { printf("学号不存在\n"); } return flag; } /* 功能:修改学生信息 返回值:如果修改成功,返回1,否则返回0 形参:无 */ void modify() { char str[50]; int i; struct stuInfo temp; if(student== 0) { printf("学生信息为空,修改失败\n"); return; } printf("请输入修改的学号\n"); fflush(stdin); gets(str); for(i = 0;i < student;i++) { if(strcmp((p+i)->num,str) == 0) { break; } } if(i >= student) { printf("该学号不存在\n修改失败\n"); }else { temp = *(p+i); printf("请输入姓名\n"); fflush(stdin); gets((p+i)->name); printf("请输入年龄\n"); fflush(stdin); scanf("%d",&(p+i)->age); if(((p+i)->age) >= 30 || ((p+i)->age) < 10) { printf("输入年龄有误,修改失败\n"); *(p+i) = temp; return; } printf("请输入性别\n"); fflush(stdin); scanf("%c",&(p+i)->sex); if(((p+i)->sex) != 'f' && ((p+i)->sex) != 'F' && ((p+i)->sex) != 'm' && ((p+i)->sex) != 'M') { printf("输入性别有误,修改失败\n"); *(p+i) = temp; return; } printf("请输入专业\n"); fflush(stdin); gets((p+i)->mgr); } } /* 功能:查询学生信息 返回值:如果查询学生信息存在,返回该学生信息 形参:无 */ void find() { int i; char s; char str1[50]; char str2[50]; if(student == 0) { printf("学生信息为空,查询失败\n"); return; } printf("1.学号\t2.姓名\n"); fflush(stdin); scanf("%c",&s); if(s == '1') { printf("请输入你要查询的学号\n"); fflush(stdin); gets(str1); for(i = 0;i <student;i++) { if(strcmp((p+i)->num,str1) == 0) { printf("学号\t\t姓名\t\t年龄\t性别\t专业\n"); printf("%s\t\t%s\t\t%d\t%c\t%s\n",(p+i)->num,(p+i)->name,(p+i)->age,(p+i)->sex,(p+i)->mgr); return; } } printf("你所查询的学号不存在,查询失败\n"); }else if(s == '2') { printf("请输入你要查询的名字\n"); fflush(stdin); gets(str2); printf("学号\t\t姓名\t\t年龄\t性别\t专业\n"); for(i = 0;i < student;i++) { if(strstr((p+i)->name,str2) != NULL) { printf("%s\t\t%s\t\t%d\t%c\t%s\n",(p+i)->num,(p+i)->name,(p+i)->age,(p+i)->sex,(p+i)->mgr); } } } } /* 功能:获得系统当前时间 返回值:如果获得成功,返回时间 形参:无 */ char* getTime() { //存放系统时间的字符串 char * t=NULL; time_t nowtime; struct tm *timeinfo; time(&nowtime); timeinfo=(localtime(&nowtime)); t=asctime(timeinfo); return t; } /* 功能:写入日志 返回值:如果写入成功,返回1,否则返回0 形参:无 */ void write() { FILE *fp; int i; char *t = NULL; time_t nowtime; struct tm * timeinfo; time(&nowtime); timeinfo = localtime(&nowtime); t = asctime(timeinfo); if(student == 0) { printf("学生信息为空,写日志失败\n"); }else { printf("当前操作时间:%s\n\n",t); fp = fopen("D://C语言学生信息.txt","a"); fprintf(fp,"当前操作时间:%s\n\n",t); for(i = 0;i < student
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 毕业论文/毕业设计

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服