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