1、C语言程序设计学生信息管理系统 C语言课程设计姓 名: 徐宗博 学 号: * 班 级: 061092 指导教师: 曹老师 2011 年 6 月 25 日 第一章:实习内容 1.1实习内容简介(2) 1.2程序代号说明(3)第二章:程序流程图第三章:函数模块介绍 3.1读取文件、存储文件(6)3.2 管理系统模块(8)3.3 恢复区系统模块(12)3.4 功能展示(12)第四章:实习总结(16)第五章:实习体会(17)附录:参考文献(19)源代码(19)第一章:实习内容1.1实习内容简介题目:学生通讯录管理系统要求:1.可实现信息的添加、删除,可按学号、姓名查询; 2.学生信息必须包含学号、姓名
2、、学院、专业、籍贯。地址、电话号码; 3.必须有注释。日期:2011年6月20日至27日,共8个半天。地点:信息楼301指导老师:曹雪莲完成情况:1. 程序可完成信息的添加,可按学号、姓名分别查询;2. 程序可按姓名、学号分别删除,并在删除前显示删除学生的全部信息;按姓名删除,若出现同名情况,会依次出现系统提示是否删除,可选择删除或跳过;3. 在程序文件夹中有一“学生信息库”的文件,可查看学生系统里全部学生信息;4. 设置有一个恢复区系统,可输出、查询删除的信息,并在可同文件夹中“删除信息库”的文件中查看删除信息;总体结构如下:1.2程序代号说明代号说明结构体结构体全局变量学号学生信息,包含左
3、结构体全部信息n链表节点数量姓名本类型结构体指针恢复区链表头指针学院目标个数专业省份地址电话号码函数增加删除(按姓名或学号)查找搜索学号搜索姓名输出链表上信息1输出链表上单个节点的信息以二进制格式储存数据以文本格式储存数据从二进制文件中读取信息,建立链表将删除信息导入恢复区链表管理系统主要程序恢复区系统主要程序此外,局部变量的含义比较固定:链表头指针,若与一同出现则代表管理系统链表头指针、为选择的值文件名第二章:程序流程图程序流程图: 本次实习我的思路就是,先从二进制文件中读取信息,形成链表,对链表进行基本操作,如输出、添加、删除、查找。程序结束时将链表保存在二进制文件和文本文件中。管理系统流
4、程图:运行管理系统部分时,先从文件“”中读取数据(若无该文件则创建文件),构建链表;后续操作都是对于链表进行操作,如添加、查找、删除、输出等;离开该部分时则保存链表里的信息到已存在的“”,并以形式存储至“学生信息库”,方便检查。恢复区系统流程图:恢复区系统思路与管理系统思路类似,连函数调用都是一样的,二进制文件名为“”,文本文件名为“删除信息库”。具体函数模块功能将在第三章中具体介绍。第三章:函数模块介绍程序分为管理系统和恢复区系统两部分和读取文件、存储文件四部分,以下分别介绍。3.1读取文件、存储文件读取文件该函数模块(程序名为)于管理系统或恢复区系统运行前运行,目的是读取二进制文件信息,构
5、建链表;若无目标文件,则创建文件。返回值为头指针。函数主体为: *p1,*p2; *;(&(p1-),1)读取数据 1若读取数据成功节点数加一 (1) 1给头结点赋值 p2-1加新的结构体 p21; p1=( *)(); (); p2-尾结点处指针置0 ();存储文件 该函数模块分为两部分,以二进制形式存储链表信息(程序名为)和以文本形式存储(程序名为)。二进制形式文件是为了读取文件,优点是快速;文本文件是为了方便检查,优点是明确可见。无返回值。二进制形式存储程序为: ( * 20)存储链表信息 *; *p; ; (,)以二进制方式打开文件 ()(&(),1)写入文件 ; ();其中为链表头指
6、针,为存储文件名,在主函数中已有定义。 存储在文本文件程序为: ( * 20)以文本形式将链表输入文件 *; *p; ; (,w)以文本形式打开 ()链表不到尽头不停止 (,()向文本文件中写入数据 (,%10s,(); (,%10s,(); (,%10s,(); (,%10s,(); (,%10s,(); (,%20sn,(); ; 3.2管理系统模块 管理系统(名为)主要有四个函数功能部分,分别为添加、删除、查找、输出,以下依次介绍:添加该模块函数名为,无返回值,参数为链表头指针,功能为向已建立的链表中从键盘上输入信息。函数主体为: *p1,*p2建立结构体指针 p2; p1=( *)()
7、输入信息 (n学号(输入数值请小于32756):)(p1-); (n姓名:)(,(p1-); (n学院:)(,(p1-); (n专业:)(,(p1-); (n省份:)(,(p1-); (n地址:)(,(p1-); (n电话号码:)(,(p1-); (p2-)移动指针到链表尾 p22-; p2-1; 移动指针 p21; p2-;删除函数名为,返回值为指向结构体的链表头指针,参数为链表头指针,可按姓名和学号删除。若按姓名删除时,为防止同名情况,则查询到一个目标,就显示出信息,并提示是否删除。1.按学号查找的函数主体为:(请输入拟删除学生学号:n); 0; (); *p1,*p2; p1; (1-1
8、-)1指向的学号不是要找的节点,并且后面还有节点 p2111-;1后移 (1-)找到目标 1(p1)(p1)1()为输出相应指针指向的节点信息()为向恢复区系统链表输入信息的函数,在后续3.3中会提及 (p1) 1-若p1指向头节点,将第二个节点位置赋予 p2-1-否则将下一结点位置赋给前一节点位置 ; (该学生不存在); (); 2.按姓名查找(包含同名情况): 00选择删除与否代表删除次数 20定义要搜的名字 *p1,*p2; p12; (请输入学生姓名:n); ()输入学号 (p1)历遍链表 (1-)0) 与目标名字是否一致,相同为0 1(p1)若符合姓名条件,显示信息 (删除该生信息?
9、n删除选1n按其它键不删除n)保证达到目标姓名时显示学生信息,可选择不删除 (); (1) p2111-;不删除就再次循环 ; (p1); 删除数加一 (p1) 1-删除信息 p2-1-更改指针,绕过目标 p2111-; (0) (该生信息不存在)若未删除则视为未发现目标学生 ();查找函数名为,参数为链表头指针,无返回值。其中查找可按姓名与学号进行查找,若找到目标即出现在屏幕;若出现同名情况,则依次显示。查找与删除函数语句类似,但是删除要求目标的前一个节点的指针与目标节点的指针都能知道;而查找要求则低多了。因为这个原因,在加上我是先写的查找,所以删除中未调用查找函数。按学号查找函数主体如下:
10、 定义要查询学号变量 (请输入学号:n); ()输入学号 ()历遍链表 ()此为调用函数,效果是查找到与目标相同的信息然后返回相应指针 () 1(p)若查找到目标,输出 ; 传递指针,继续 按姓名查找函数主体如下: 20定义要查询姓名的变量 (请输入姓名:n); ()输入姓名 () ()与上文中类似,返回同名目标的指针 () 1(p)若查找到目标,输出 ; 传递指针 输出函数名为,参数为链表头指针,无返回值。函数作用就是沿链表依次输出学生信息。函数主体为: (全体学生数据如下:n); (0) (无学生信息);若节点为0则返回 *p; ; ()循环输出 (n学号 ,(); (n姓名 ,(); (
11、n学院 ,(); (n专业 ,(); (n省份 ,(); (n地址 ,(); (n电话号码 n,(); ; 3.3恢复区系统模块恢复区系统(其名为)是为了显示被删除信息而建立的,在函数运行之初便建立了恢复区链表,头指针设为,与管理系统头指针相区别。并且,被设为全局变量,方便被函数调用。恢复区系统主要有查找、输出功能,其功能模块基本调用管理系统的函数,所以不再赘述。而恢复区的输入函数,即管理区删除信息时将信息输入恢复区链表的函数,上文已提及,即,此为连接恢复区与管理系统的桥梁,只不过是单行的。函数为: ( *p)将删除信息导入恢复区链表,p为要删除信息的指针 *p1,*p2; p1恢复区链表头节
12、点位置 (p1-)指针置于链表尾端 p11-; p21; p1=( *)()复制结构体信息 p1-; (p1-); (p1-)复制字符数组,以下类似 (p1-); (p1-); (p1-); (p1-); p2-1; p1-链表尾设为以上程序函数模块基本介绍完毕,由于篇幅有限,很多函数模块只摘录了主体,若仍有疑惑处,可参考附录中的源代码。3.4功能展示主界面:管理系统: ()添加: ( *)可连续添加查找: ( *)删除: *( *)按学号删除:按姓名查询,可面对重名情况:输出: ( *)恢复区系统菜单: ()文本形式保存: ( * 20)删除信息导入恢复区链表: ( *p)第四章:实习总结本
13、次实习,我制作了两个版本的程序,一个是简版,一个是升级版。其实,简版就是管理系统,升级版在简版的基础上还包含了恢复区系统。这也算是实现了程序的升级吧,安全性方面算是达标了。本次实习的不足主要有:1实用性不足。程序中学生信息定义的是长整型,故范围有限,不能大于32756,否则就会溢出;如果定义为无符号的长整,也不过翻一番而已,并未增添多少位,我校学号可是有11位。但这样方便比较给变量赋值,并且在查找中已有查找姓名字符串的应用了,用长整型丰富了查找类型; 其实完全可以定义学号为字符型数组,虽说浪费空间,但是方便输入较长数值,且比较也很方便,可以直接调用查找姓名字符串的函数。2程序中函数模块利用率不
14、高,除了读取、存储、查找、输出这四个模块被两个系统调用外,其他删除、添加只有管理系统用到;倒是1这么一个输出单一节点信息的程序被调用多次;3函数模块十分庞大,很多程序语句充斥在其中,没有很好的分成几部分子函数,方便调用,这也导致了函数调用率不高;4因为思路原因,程序中有三个全局变量,不利于程序的移植,可移植性不高;5程序中查找模块与删除模块没有结合好,导致在删除中又查找了一遍;说到底还是目标不一样,查找函数只要求目标节点的指针,而删除函数要前一个节点和目标节点的指针,而且链表是单向的,知道后一个节点但不能知道前一个节点。若用双向链表,那样就可以将删除与查找较好的结合在一起了。6恢复区只有查找、
15、输出功能,没有恢复与删除功能,如此只能添加不能删除,恢复区文件会越来越大;因为时间问题没有建立恢复函数,其实建立也不难,只是会与恢复区导入函数类似,再增加一全局变量而已;7使用链表所以未排序。如果要给链表排序,可以在插入信息时就按顺序插入,但是这势必增加程序运行负担,而且效率不高,因为链表是单向的。可以用二叉树,如果那样的话效率就高多了,但是二叉树我还不会。8.程序视图就是C语言的黑框,没有美观可言。的视图好一些,我也想过用编译一个窗口,然后在程序中调用。但是还没学会,而且在调试程序的过程中遇到一些困难让我遗忘了这个想法,曾看程序看到凌晨两点,所以想法没有实践。9.在软件技术普及的今天,做个数
16、据库已是小菜一碟,很到软件可以使用,如 ,并且功能极其强大,比我花了几天时间做出来的高级不知多少倍。与那些专业程序相比,我的这程序不值一提,也就是练习练习C语言而已。第五章:实习感受此次实习在一个凉爽的夏日开始,这在武汉极反常。因为我们考试基本考完了,只剩下一门英语了,所以实习时间比较充裕。实习的题目也不算太难,思路很清晰,总共三步走:1.读取文件;2.处理链表;3.保存文件。操作的主体是链表,原以为会很轻松,但还是遇到很多问题,以前上课时从未想到过。经历过基本一天都在看程序的时间,我发现我懂的太少,要学的太多。对文件的操作我一直都没注意,现在才发现其乐无穷;以前觉得链表很难,现在轻松写出程序
17、。学习与实践果然是不可分割的。实习中,大家八仙过海各显神通,用链表是比较传统的,而且节省内存,有的用数组,这也可以理解,方便使用,排序便利;有的直接用文件C语句查询、删除,让我大开眼界,文件还能这么用!在写报告时看到一篇用指针数组做的程序,相当有意思。发现水平还是不够,同学可以用C语言编出一个比较漂亮的界面,还可以随意调用文件操作,实在让人赞叹不已。此次实习加强了我对链表的理解,很多以前迷糊的概念得到了明确,亦让我感到C语言强大之处,直接操作内存,实在很暴力。一句诗概括此次实习,“山重水复疑无路,柳暗花明又一村”;如今C语言实习已然结束,但是对于计算机语言的学习决不能放松,“雄关漫道真如铁,
18、而今迈步从头越”。现在的世界是信息化的,我们现在对于的要求也很大,C语言也是其基础。路漫漫其修远兮,吾将上下而求索。感谢曹老师抽出时间将C语言实习提前和这八天来的指导,同时亦感谢大家这些天来的支持与帮助,此外额外感谢武汉夏天罕见的凉爽天气,感谢生活。附录参考书目 1.谭浩强著 C语言程序设计 2005年7月第3版298-299、300、302-303、338页 2. 吴煌坚学长的实习报告源代码 0 ( ) ( ) 学生信息结构体 学生学号 20学生姓名 20学院 10专业 10省份 20地址 11电话号码; 带学生信息结构体的链表单位 ; *后续链表地址; 记录节点个数 搜索个数,保证未搜索到
19、时可显示没搜到 *方便全局调用恢复区链表 *( 120)创建链表,从文件中读取数据,返回头指针 *链表头指针 *p1,*p2指针变量 p12=( *)(); *打开文件读取数据 (1,)若文件不存在则建立文件 (暂无任何学生信息n); (1,)建立文件 (); p1-; (p1); 读取文件信息,建立链表 0此时无结点 1; (&(p1-),1) 1; (1) 1给头结点赋值 p2-1加新的结构体 p21; p1=( *)(); (); p2-尾结点处指针置0 (); ( * 20)存储链表信息 *; *p; ; (,)以二进制方式打开文件 ()(&(),1)写入文件 ; (); ( *p)将
20、删除信息导入恢复区链表 *p1,*p2; p1恢复区链表头节点位置 (p1-)指针置于链表尾端 p11-; p21; p1=( *)()复制结构体信息 p1-; (p1-); (p1-); (p1-); (p1-); (p1-); (p1-); p2-1; p1-; ( * 20)以文本形式将链表输入文件 *; *p; ; (,w)以文本形式打开 ()链表不到尽头不停止 (,()向文本文件中写入数据 (,%10s,(); (,%10s,(); (,%10s,(); (,%10s,(); (,%10s,(); (,%20sn,(); ; 1( *p)输出单个学生结构体信息 (n学号 ,(); (
21、n姓名 ,(); (n学院 ,(); (n专业 ,(); (n省份 ,(); (n地址 ,(); (n电话号码 n,(); *( * 20)按姓名搜索 () ()0) (p);若查找到目标,返回指针 ; (0) (没有该学生信息); ()返回以保证返回值 *( * )按学号搜索 () () (p);若查找到目标,返回指针 ; (0) (没有该学生信息); ()返回以保证返回值 ( *)添加信息 1给输入按钮赋初值 *p1,*p2建立结构体指针 p2; (0) (请选择:n输入0 返回主菜单n输入1 继续n); ()输入按钮赋值 (0) 判断是否返回主菜单 (0) 链表无节点,给*填充数据 (n
22、学号(输入数值请小于32756):)(); (n姓名:)(,(); (n学院:)(,(); (n专业:)(,(); (n省份:)(,(); (n地址:)(,(); (n电话号码:)(,(); 2-增加节点,节点数n加1,同时跳出此次循环,进入下一次 p1=( *)()输入信息 (n学号(输入数值请小于32756):)(p1-); (n姓名:)(,(p1-); (n学院:)(,(p1-); (n专业:)(,(p1-); (n省份:)(,(p1-); (n地址:)(,(p1-); (n电话号码:)(,(p1-); (p2-)移动指针到链表尾 p22-; p2-1; 移动指针 p21; p2-; 节
23、点数加1 ( *)搜索信息 0; (0) (此时无数据);节点数为0状态 *p; ; (请输入拟搜索信息:n); (按姓名查找请按1n按学号查找请按2n)分类查找 0; ()导入分类 (1)按姓名查找 20; (请输入姓名:n); ()输入姓名 () (); () 1(p)若查找到目标,输出 ; 传递指针 (2)按学号查找 ; (请输入学号:n); ()输入学号 () (); () 1(p)若查找到目标,输出 ; 传递指针 (输入错误); *( *)删除信息 (0) (无学生信息)(); 0选择变量:学号、姓名 (按姓名删除请按1n按学号删除请按2n)分类删除 (); (2)按学号删除(学号默
24、认唯一) (请输入拟删除学生学号:n); 0; (); *p1,*p2; p1; (1-1-)1指向的学号不是要找的节点,并且后面还有节点 p2111-;1后移 (1-)找到目标 1(p1)(p1); (p1) 1-若p1指向头节点,将第二个节点位置赋予 p2-1-否则将下一结点位置赋给前一节点位置 ; (该学生不存在); (); (1)按姓名删除(姓名可以重复) 00选择删除与否 20; *p1,*p2; p12; (请输入学生姓名:n); ()输入学号 (p1)历遍链表 (1-)0) 1(p1)若符合姓名条件,显示信息 (删除该生信息?n删除选1n按其它键不删除n)保证达到目标姓名时显示学生信息,可选择不删除 (); (1) p2111-;不删除就再次循环 ; (p1); 删除数加一 (p1) 1-删除信息 p2-1-更改指针,绕过目标 p2111-; (0) (该生信息不存在)若未删除则视为未发现目标学生 (); (输入错误)(); ( *)输出全部数据数据 (全体学生数据如下:n); (0) (无学生信息);若节点为0则返回 *p; ; ()循环输
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1