《程序设计与算法分析》课程设计报告.docx
《《程序设计与算法分析》课程设计报告.docx》由会员分享,可在线阅读,更多相关《《程序设计与算法分析》课程设计报告.docx(23页珍藏版)》请在冰豆网上搜索。
《程序设计与算法分析》课程设计报告
数据结构课程设计报告
设计名称:
1)简单个人电话号码查询系统
2)哈希表设计
《程序设计与算法分析》课程设计报告
一、简单个人电话号码查询系统
1、需求分析
1、程序的功能:
实现一个简单的个人电话号码查询系统,根据用户输入的信息进行排序(按电话号码)并且可以进行快速查询(按姓名),同时还可以进行插入、删除、修改等维护功能
2、输入输出的要求:
电话本中每个人的各项信息需要由键盘进
行输入,应用getch函数进行输入,printf函数实现输出。
3、测试数据。
2、概要设计
1、存储结构设计说明:
应用结构体类型的数组对电话本中的记录进行存储。
structrecord
{
charname[20];
charphone[20];
charmailbox[20];
}people[60];
2、程序设计组成框图
3、详细设计
1、主函数
函数功能:
对写入文件函数及主菜单函数进行调用。
实现主菜单的显示
函数类型:
未调用参数,且无返回值。
函数调用关系描述:
调用主菜单函数及写入文件函数,实现主菜单的显示。
2、从文件导入函数
函数功能:
判断文件是否存在,存在进行导入,不存在进行文件导入。
函数类型:
未调用参数,且无返回值。
算法说明(流程图表示)
3、主菜单函数
函数功能:
输出主菜单,并利用多分枝选择结构调用各功能函数。
函数类型:
未调用参数,且无返回值。
算法说明:
利用多分枝选择结构实现程序中各程序之间的转换和方便用户进行选择。
调用各功能函数。
4、添加记录函数
函数功能:
电话本为空时,实现电话本中信息的创建;电话本不为空时,实现电话本信息的添加。
函数类型:
未调用参数,且无返回值。
算法说明:
,从键盘输入联系人的姓名和电话、邮箱等信息,应用系统printf函数输出,scanf函数输入,继续添加——递归调用添加记录函数
5、显示所有函数
函数功能:
遍历输出电话本中的所有信息。
函数类型:
未调用参数,且无返回值。
算法说明:
(流程图表示)
6、修改菜单函数
函数功能:
显示修改菜单,实现修改函数与主菜单之间的转换。
函数类型:
未调用参数,且无返回值。
算法说明:
实现主函数与修改函数之间的转换,多分支选择结构调用删除函数及主菜单函数。
7、修改函数
函数功能:
实现电话本中记录的修改。
函数类型:
未调用参数,且无返回值。
算法说明:
(流程图表示),进行继续修改时递归调用修改函数。
8、查询菜单函数
函数功能:
显示查询菜单,实现查询函数与主菜单之间的转换。
函数类型:
未调用参数,且无返回值。
算法说明:
实现主函数与查询函数之间的转换,多分支选择结构调用查询函数及主菜单函数。
9、查询函数
函数功能:
实现对电话本中指定记录(按姓名)的查询。
函数类型:
未调用参数,且无返回值。
算法说明:
(流程图表示)
10、删除菜单函数
函数功能:
显示删除菜单,实现删除函数与主菜单之间的转换。
函数类型:
未调用参数,且无返回值。
算法说明:
实现主函数与删除函数之间的转换,多分支选择结构调用删除函数及主菜单函数。
11、删除函数
函数功能:
实现对指定记录(按姓名)的删除操作。
函数类型:
未调用参数,且无返回值。
算法说明:
(用流程图表示)继续删除则递归调用删除函数。
删除函数
12、排序菜单
函数功能:
显示排序菜单,实现排序函数与主菜单之间的转换。
函数类型:
未调用参数,且无返回值。
算法说明:
实现主函数与排序函数之间的转换,多分支选择结构调用排序函数及主菜单函数。
13、排序函数
函数功能:
对电话本中已经存在的函数实现按电话号码的排序。
函数类型:
未调用参数,且无返回值。
算法说明:
(流程图表示)
14、写入文件函数
函数功能:
显示文件中信息并保存文件
函数类型:
未调用参数,且无返回值。
算法说明:
通过输出文件中的信息,判断是否信息已经全部存入文件中。
4、调试分析
一)测试数据:
1、主菜单
2、修改菜单及修改函数
3、查询菜单和查询函数
4、删除菜单和删除函数
5、排序菜单和排序函数
6、显示所有函数
二)时间复杂度
1、主菜单函数:
O
(1)
2、增加联系人函数:
每次添加记录的时间复杂度为O
(1)(继续添加时进行了递归调用)。
3、修改函数:
每次进行修改的时间复杂度为O(n)(继续修改时进行了递归调用)。
4、查询函数:
O(n)
5、删除函数:
O(
)
6、排序函数:
O(
)
7、写入文件函数:
O(n)
8、显示所有函数:
O(n)
三)存在的问题及解决设想
存在的问题:
多分枝选择结构较多应用,一开始没有注意函数声明问题,以致很多函数在其他函数中被调用出错。
解决办法:
在函数最前面对所有函数全部进行声明。
个别函数中if...else语句对应问题和括号匹配有问题。
解决办法:
小组中成员团结协作,仔细检查,解决了这些错误。
5、核心源程序清单和执行结果
1、核心源程序
附件一
2、执行结果:
同调试分析。
6、分析与讨论
本次个人电话本系统的设计,我小组主要使用的方法包括多分枝选择结构实现菜单项以及递归调用函数进行继续操作,其中调试过程中出现的种种问题都在我们的合作商量下共同解决,这充分体现了在课程设计中团队协作的重要性,同时我们的电话本系统编写的程序还比较稚嫩,在很多方面都需要继续改进和提高。
二、哈希表设计
1、需求分析
1、程序的功能;
(1)针对某个集体中的人名设计一个哈希表,使得平均查找长度不超过R,完成相应的建立和查表程序。
(2)人名为汉语拼音形式,最长不超过19个字符(如:
杨欢yanghuan)。
(3)假设待填入哈希表的人名有30个,平均查找长度的上限为2。
哈希表用除留余数法构造,用伪随机探测在散列法处理冲突。
(4)在输入人名过程中能自动识别非法输入,并给与非法输入的反馈信息要求重新输入。
(5)查找成功时,显示姓名及关键字,并计算和输出查找成功的平均查找长度。
2、输入输出的要求;分别用scanf函数和printf函数实现函数的输入和输出。
3、测试数据。
2、概要设计
1、存储结构设计说明:
应用结构体类型的数组对姓名记录进行存储
并且定义结构体类型的哈希表。
typedefstruct//姓名表
{
char*py;//名字的拼音
intm;//拼音所对应的
}NAME;
NAMENameTable[HASH_LEN];//全局定义姓名表
typedefstruct//哈希表
{
char*py;//名字的拼音
intm;//拼音所对应的ASCII总和
intsi;//查找长度
}HASH;
同时,在一下函数中具有的结构
2、程序设计组成框图
3、详细设计
1、初始化函数
函数功能:
对姓名表进行初始化,获取哈希表的关键字并将拼音的ASCII码转化出来。
函数说明:
函数为空类型,无返回值。
算法设计说明:
直接给姓名表赋初值,并利用函数获取姓名拼音的ASCII码达到为姓名表进行初始化的目的。
2、创建函数
函数功能:
初始化哈希表,并用除留取余法为哈希表填值并处理冲突。
函数说明:
函数为空类型,无返回值。
算法设计说明:
(流程图表示)
初始化哈希表
为哈希表填值,对哈希表进行创建:
3、显示函数(分为姓名表遍历函数和哈希表遍历)
函数功能:
分别显示姓名表和哈希表,对两表进行遍历输出。
函数说明:
函数为空类型,无返回值。
算法设计说明:
(流程图表示)
4、查找函数
函数功能:
根据输入的指定的拼音对哈希表进行查找。
函数说明:
函数为空类型,无返回值。
算法设计说明:
(流程图表示)
查找函数流程
5、主函数
函数功能:
调用各函数,并应用多分枝选择结构实现其他函数的关于哈希表的功能。
函数说明:
函数为空类型,无返回值。
算法设计说明:
调用各个函数,并利用多分枝选择结构实现各个函数与主菜单之间的转化。
6、存在的问题及解决方法
哈希表创建可能有多种方法,本次我们选取了除留取余数法对哈希表进行填值,处理冲突中出现了考虑可能结果不完善,函数不能顺利运行。
解决办法:
小组成员仔细分析函数,并查找资料和询问其他同学最后使得程序能够顺利进行。
4、调试分析
1、测试数据及测试测试输出的结果。
主菜单显示
显示姓名表
显示哈希表
查找操作
2、时间复杂度分析,
初始化函数:
O(n)
创建函数:
O(n)
显示函数(姓名表和哈希表):
O(n)
查找函数:
O(n)
主函数:
O(n)
5、核心源程序清单和执行结果
1、核心源程序
附件2
2、执行结果
见数据调试和分析
6、分析与讨论
本程序的思路较简单,主要是对哈希表的建立,查找和输出,在写程序时最重要的是正确书写哈希函数和用伪随机探测再散列法处理冲突,真确处理可以有效减少查找长度,提高程序运行效率。
通过此程序的编写,慢慢了解了哈希表原理和功用
查找过程中曾遇到输入不同的名字。
会显示相同的结果,说明哈希函数还有待改进。