简单个人电话号码查询系统数据结构课程设计

合集下载

数据结构电话号码查询系统设计报告及代码

数据结构电话号码查询系统设计报告及代码

数据结构电话号码查询系统设计报告及代码郑州轻工业学院课程设计任务书题目电话号码查询系统专业、班级计科10-01学号41姓名王平主要内容:设计哈希表实现电话号码查找系统基本要求:从键盘输入各记录,分别以电话号码和用户名为关键字设计哈希表;采用不同的哈希函数,比较冲突率;采用适当的方法解决冲突;在哈希函数确定的前提下,尝试不同类型处理冲突的方法,考察平均查找长度的变化;查找并显示给定电话号码的记录;查找并显示给定用户名的记录。

主要参考资料等:数据结构课本(c语言版)完成期限:21012年6月21号指导教师签名:课程负责人签名:12年 6 月 21 日郑州轻工业学院本科数据结构课程设计总结报告设计题目:电话号码查询系统学生姓名:王平系别:计算机科学与通信工程学院专业:计算机科学与技术班级:10-01学号:541007010141指导教师:卢冰、李晔2012年6月21 日2找)方式:这个过程中,我选取了数字分析法,解释如上。

主菜单的设计在设计效果上已经显示,不过多说明。

算法的流程主菜单建立->除留取余和数字分析法存储->开放地址法解决冲突->查找。

算法设计分析这段代码是哈希存储时从第三个数开始求,提高了代码效率。

int i = 3;while(s.num[i]!='\0') //关键字{key+=(s.num[i]-'0'); //关键字求和i++;}key=key%21;线性探测再散列处理冲突if(!strcmp(W.t[key].num,""))//查找,解决冲突W.t[key]=s;else{//第一次没解决彻底,继续解决冲突int j=1;while(strcmp(W.t[(key+j)%21].num,"")) j++;W.t[(key+j)%21]=s;}}查找代码;while(xnum[i]!='\0'){key+=(xnum[i]-'0'); //求和i++;}key=key%21;if(!strcmp(W.t[key].num,xnum))//第一次查找,如果值相等直接赋值printf("%s %s %s\n",W.t[key].name,W.t[key].address,W.t[ke y].num);else2{//第一次没找到,继续查找int j=1;while(strcmp(W.t[(key+j)%21].num,xnum)) j++;if(j==20)printf("查找元素不存在!");elseprintf("%s %s %s\n",W.t[(key+j)%21].name,W.t[(key+j)%21 ].address,W.t[(key+j)%21].num);//输出查找到得元素}主界面:printf("********电话号码查询系统********\n");printf(" 用电话号码查询1 \n");printf(" 用用户名查询 2 \n");printf("********************************\n");printf("请输入您要的选项:\n");int x,y;while(scanf("%d",&x)!=-1){if(x==1){printf("********电话号码查询********\n");printf(" 除留取余法1 \n");printf(" 数字分析法2 \n");3printf("****************************\n");printf("请输入y值:\n");scanf("%d",&y);while(y<3){switch(y){case 1:chuliu();break;//调用除留取余函数case 2:shuzi();break;//调用数字分析函数default:printf("输入指令不存在!\n");}printf("********电话号码查询********\n");printf(" 除留取余法1 \n");printf(" 数字分析法2 \n");printf("****************************\n");printf("请输入您要的选项:\n");scanf("%d",&y);}}else if(x==2){printf("********用户名查询********\n");printf(" 分析法 3 \n");printf("****************************\n");fenxi();//调用分析函数4}elseprintf("查找方式不存在!请重新输入\n");}}运行结果分析56测试实例:wangping kaifeng 123456wangdoudou luoyang 456789zhaijiajai zhengzhou 147258sunxueping zhoukou 258369收获及体会本次试验电话号码查询系统,看起来也不是想我想象中的那么难,他比较具有针对性,要求我们用哈希函数解决这倒比较实用的题目,但是这道题目用到的哈希函数仅仅是哈希中的九牛一毛,虽然写了大程序,但是对哈希表的了解还是一无所知,数据结构这门课程我认为有点难,也许是我c语言基础不够强吧,好多代码都不是很理解,以至于不能够灵活运用,其实通过每次实验我们都可以发现,数据结构的知识好像就是草原的草,密密麻麻的等待我们去拔掉,这是一项浩大的工程等待我们去建设,与此同时,也要求我们要踏实的完成每一次作业,认真的去分析重要的代码,只有端正自己的态度,才能不断地学到新的知识,提高自己。

简单个人电话号码查询系统数据结构课程设计

简单个人电话号码查询系统数据结构课程设计

一、课题任务人们在日常生活中经常要查找某个人或某个单位的电话号码,本实验将实现一个简单的个人电话号码查询系统,根据用户输入的信息(例如姓名等)进行快速查询二、设计要求(1)在外存上,用文件保存电话号码信息;(2)在内存中,设计数据结构存储电话号码信息;(3)提供查询功能:根据姓名或编号实现快速查询;(4)提供其他维护功能,例如插人、删除、修改等。

三、程序的结点设计现假设链表结点仅含有一个数据域和一个指针域。

数据域是为了描述通讯者的相关信息,定义通讯者的结点类型:typedef struct{char num[10]; //编号char name[15]; //姓名char phone[11]; //电话号码}dataType;因此,,线性表的链式存储结构定义如下:typedef struct node{ //结点类型定义dataType data; //结点的数据域struct node *next ; //结点指针域}listnode , * linklist ;linklist head ; //定义指向单链表的头指针listnode * p ; //定义一个指向结点的指针变量四、程序的功能设计创建:创建通讯录文件添加:添加通讯录记录输出:显示通讯录记录删除:删除通讯录记录查找:查询通讯录记录修改:修改通讯录记录保存:将信息保存到文件中五、程序的数据设计该系统用下面六个功能模块编写,每个模块执行不同的功能,体现了模块化设计的思想。

下面六个模块都是利用C语言文件,向文件中追加数据、修改数据、查询数据和删除数据。

建立:可以建立通讯录记录,利用C语言文件,向文件中按顺序输入编号、姓名、电话号码,这里实际上是要求建立一个带头结点的单链表。

添加:可以添加通信录记录,向链表中继续增加结点,但只是输入到内存中,如果要输入到文件中还得调用保存函数。

输出:也是用通过循环依次输出文件中的数据,即输出所有通讯录里的记录。

数据结构 手机号码查询系统

数据结构 手机号码查询系统

报告编号:第5组综合课程设计报告手机号码查询系统指导教师:所在系:电子工程系所学专业:计算机科学与技术年级: 2012级2014 年 6 月目录1、课程设计目的和要求 (1)1.1 设计目的 (1)1.2 设计要求 (1)2、课程设计的主要工作 (1)2.1 需求分析 (1)3、课程基本设计说明 (1)3.1 概要设计和数据结构选择 (1)3.2程序具体设计 (2)3.3 程序流程图 (2)4、程序详细设计 (4)4.1 创建 (4)4.2 对哈希函数的定义 (4)4.3 哈希查找 (5)4.4 主函数 (6)5、程序运行结果界面 (8)6、课程设计总结 (12)7、参考文献 (13)8、附录 (13)摘要本文主要介绍了手机号码查询系统,实现对用户手机号码、用户名以及地址的添加、查询、存储。

程序主要以手机号码和姓名为关键字建立哈希表,并实现查找功能。

其中,以手机号为关键字建立哈希表时采用线性探测法解决冲突、以姓名为关键字建立哈希表时用拉链法解决冲突,成功通过设计哈希表实现对用户的手机号码、姓名、地址显示、查询等功能。

通过课程设计,巩固和加深对结构体、哈希表等理论知识的理解,掌握现实复杂的分析建模和解决方法,掌握包括问题描述、系统分析、设计建模、代码实现、结果分析等的方法;提高利用计算机分析解决综合性实际问题的基本能力;锻炼个人的动手能力,历练自身素质;提高大家的合作能力。

关键字:哈希表线性探测法链地址法1、课程设计目的和要求1.1 设计目的本题目最主要的的是设计散列函数,本程序需要设计两个散列函数才能解决问题,程序需要分别为以号码和用户名为关键字建立哈希表。

所以要分别以用户名、号码为关键字建立两个散列函数。

1.2 设计要求(1)每个记录有下列数据项:手机号码、用户名、地址;(2)从键盘输入各记录,分别以手机号码和用户名为关键字建立哈希表(哈希函数自选);(3)以手机号为关键字建立哈希表时采用线性探测法解决冲突、以姓名为关键字建立哈希表时用拉链法解决冲突;(4)查找并显示给定手机号码的记录;(5)查找并显示给定用户名的记录。

电话号码系统课程设计

电话号码系统课程设计

电话号码系统课程设计一、课程目标知识目标:1. 学生能理解电话号码的基本组成结构,掌握我国电话号码的编码规则;2. 学生能了解电话号码系统的分类及其功能,如固定电话号码、移动电话号码、紧急电话号码等;3. 学生能掌握电话号码相关的数学知识,如数字组合、排列等。

技能目标:1. 学生能运用所学知识,正确拨打和接听电话,熟练使用电话通信功能;2. 学生能通过分析电话号码,提高逻辑思维能力和问题解决能力;3. 学生能运用电话号码系统进行简单的数据统计和分析。

情感态度价值观目标:1. 学生能认识到电话通信在现代生活中的重要性,增强信息社会的适应能力;2. 学生能尊重他人隐私,正确使用电话号码,培养诚信意识和责任感;3. 学生能关注电话通信技术的发展,激发对科学技术的兴趣和热爱。

课程性质:本课程为信息技术与数学相结合的综合性课程,旨在通过电话号码系统教学,提高学生的实际操作能力、逻辑思维能力和信息素养。

学生特点:六年级学生具备一定的数学基础和信息素养,对新鲜事物充满好奇,善于合作与探究。

教学要求:结合学生特点,注重理论与实践相结合,鼓励学生主动参与、积极思考,提高解决问题的能力。

将课程目标分解为具体的学习成果,以便在教学过程中进行有效评估和调整。

二、教学内容1. 电话号码的基本组成与编码规则- 电话号码的位数及其含义- 区号、座机号、移动电话号的区别与联系- 各地区电话号码的编码特点2. 电话号码系统的分类与功能- 固定电话号码:家庭、单位、公共服务等- 移动电话号码:运营商、手机号、携号转网等- 紧急电话号码:110、120、119等3. 电话号码相关的数学知识- 数字组合与排列- 电话号码的数学性质:唯一性、可重复性等- 电话号码的统计分析方法4. 实践操作与技能培养- 拨打和接听电话的正确方法- 电话通信功能的运用:语音、短信、视频等- 电话号码查询与信息安全教学大纲安排:第一课时:电话号码的基本组成与编码规则第二课时:电话号码系统的分类与功能第三课时:电话号码相关的数学知识第四课时:实践操作与技能培养教材章节关联:《信息技术》六年级下册第四章:通信技术及其应用《数学》六年级下册第八章:概率与统计教学内容进度:第一周:电话号码基本组成与编码规则第二周:电话号码系统分类与功能第三周:电话号码相关数学知识第四周:实践操作与技能培养三、教学方法本课程将采用以下多样化的教学方法,以激发学生的学习兴趣和主动性:1. 讲授法:- 通过生动的语言和实际案例,讲解电话号码的基本知识,如编码规则、数学性质等;- 结合教材内容,系统介绍电话号码系统的分类、功能及其在日常生活中的应用;- 在讲授过程中,注重启发式教学,引导学生主动思考问题。

数据结构课程设计个人电话号码查询系统.

数据结构课程设计个人电话号码查询系统.

2014-2015学年 第二学期 《数据结构》 课程设计报告 题目:个人电话号码查询系统 专业:、 班级:、 姓名:、 指导教师:、 成绩:计算机与信息工程系2014 年 12月 15 日目录1设计内容及要求 (1)1.1课程设计目的 (1)1.2设计内容及要求 (1)2概要设计 (2)2.1设计功能 (2)2.2个人电话号码查询系统功能说明图 (2)2.3个人电话号码查询各模块调用关系 (3)3设计过程或程序代码 (3)3.1管理系统功能模块设计 (3)3.2数据结构及各模块分析 (4)3.2.1 基本数据类型(结构体) (4)3.2.2附助常量,变量 (4)3.2.3函数 (4)4设计结果与分析 (5)4.1整体大纲 (5)4.2启动程序截图,代码 (6)4.2.1代码分析 (6)4.3进入主菜单截图,代码 (8)4.3.1代码分析 (8)4.4新添记录截图,代码 (9)4.4.1 新添模块代码 (10)4.5查找记录截图,代码 (11)4.5.1代码分析 (12)4.6删除记录截图,代码 (13)4.6.1代码分析 (13)4.7保存文件,不保存文件 (16)4.8总结 (16)5参考文献 (17)1设计内容及要求1.1课程设计目的通过设计一个《个人电话号码查询系统》,进一步熟悉C中的概念、基本知识和技能利用所学的基本知识和技能解决简单的面向对象的程序设计问题。

了解系统开发的需求分析、层次设计、模块分解、编码测试、模块组装与整体调试的全过程,加深对C的理解与Visual C++环境的使用:逐步熟悉程序设计的方法,并养成良好的编程习惯。

1.2设计内容及要求编写一个个人电话号码查询系统把所学数据结构知识应用到实际软件开发中。

设计内容:本系统应完成一下几方面的功能:1)输入信息enter();2)显示信息display( );3)查找以姓名作为关键字search( );4)删除信息delete( );5)存盘save ( );6)装入load( ) ;设计要求:1)每条信息至包含:姓名(NAME )电话(TELL)地址(CITY)QQ几项;2)作为一个完整的系统,应具有友好的界面和较强的容错能力。

数据结构 手机号码查询系统

数据结构 手机号码查询系统

数据结构方式号码查询系统数据结构方式号码查询系统1、系统概述在现代社会中,方式号码被广泛使用,人们需要通过方式号码进行通信和联系。

为了方便用户快速查询和管理方式号码,我们设计了一个方式号码查询系统,可实现以下功能:- 添加方式号码信息- 查询方式号码信息- 修改方式号码信息- 删除方式号码信息2、系统架构2.1 数据结构设计系统中使用以下数据结构来存储方式号码信息:- 链表:用于存储不同用户的方式号码信息,每个节点代表一个用户的信息,包括姓名、方式号码、地质等。

- 哈希表:用于快速查询方式号码,通过方式号码可以直接找到对应的用户信息。

2.2 模块设计系统分为以下几个模块:- 添加模块:用于用户添加新的方式号码信息,并将其存储到链表和哈希表中。

- 查询模块:提供根据方式号码查询用户信息的功能。

- 修改模块:允许用户修改已有的方式号码信息。

- 删除模块:用户可以删除不再需要的方式号码信息。

3、功能实现3.1 添加方式号码信息用户可以通过输入姓名、方式号码、地质等信息将新的方式号码添加到系统中。

3.2 查询方式号码信息用户可以通过输入方式号码进行查询,系统将返回对应的用户信息。

3.3 修改方式号码信息用户可以选择要修改的方式号码,并输入新的信息进行修改。

3.4 删除方式号码信息用户可以选择要删除的方式号码进行删除操作。

4、附件本文档附带的附件为系统的源代码和使用说明书。

5、法律名词及注释5.1 方式号码:指由数字组成的方式号码,用于流动通信。

5.2 链表:是一个线性数据结构,由一系列节点组成,节点之间通过指针连接。

5.3 哈希表:是根据关键码值(Key-value)进行访问的数据结构,通过将关键码值映射到表中的一个位置来访问数据。

数据结构课程设计报告——哈希表实现电话号码查询

数据结构课程设计报告——哈希表实现电话号码查询

数据结构课程设计报告一、需求分析1问题描述:根据需要设计出合理的函数,并由此建立相应的表。

要求:1)每个电话用户信息包括(姓名,电话,住址)信息。

2)可以使用姓名与地址查找相应的用户信息。

3)使用表实现。

使用开放定址法解决冲突。

2 基本要求:1)记录每个用户的姓名、地址和电话。

2)从键盘输入,以姓名和地址为关键字分别建立表。

3)用开放地址法解决冲突。

4)分别按姓名和地址查找并显示电话号码。

二、概要设计三、详细设计定义结构表{定义表内的所有成员}[];( x[])关键字转换为数值{求字符数组x每个字符对应的值的绝对值之和,并返回最后结果}( )创建表{创建表,并初始化它}( d) 按姓名插入{以姓名为关键字,调用关键字转换函数将对应的电话号码存储到相应的存储空间。

若该位置已经被存储,则向后移一位(当移到最后一位,就移到头部继续)。

若还有冲突重复上一步。

当所有空间都查过一遍,发现没有空位,则输出“没有存储空间”。

}( d)按地址插入{以地址为关键字,调用关键字转换函数将对应的电话号码存储到相应的存储空间。

若该位置已经被存储,则向后移一位(当移到最后一位,就移到头部继续)。

若还有冲突重复上一步。

当所有空间都查过一遍,发现没有空位,则输出“没有存储空间”。

}( )表插入{输入用户姓名、地址和电话,分别调用按姓名插入和按地址插入函数进行插入。

重复上面的步骤,直到你不想继续或空间已满。

}( )按姓名查找{输入你想要查询的姓名,对它进行转换,再查找。

若该位置不空或求得的关键字所对应的数值与该位置的数值不相等,则向后移一位(当移到最后一位,就移到头部继续)。

若还有冲突重复上一步。

当所有空间都查过一遍,发现没有找到,则输出“不存在”。

若该位置空,则输出“不存在”。

若查找到,则输出电话号码。

}( )按地址查找{输入你想要查询的地址,对它进行转换,再查找。

若该位置不空或求得的关键字所对应的数值与该位置的数值不相等,则向后移一位(当移到最后一位,就移到头部继续)。

电话号码小型查询系统设计

电话号码小型查询系统设计

皖西学院课程设计报告系别:机电系专业:电子信息学生姓名:学号:课程设计题目:电话号码小型查询系统设计起迄日期:课程设计地点:指导教师:完成日期: 09年 6月 23日课程设计任务书1、摘要 (4)2、设计思想及方案制定 (4)3、设计的基本思路 (5)4、程序流程图 (6)5、源程序代码清单 (7)5、设计体会 (11)6、参考文献 (12)7、鸣谢 (12)电话号码查询管理系统是用于辅助个人完成其通讯信息有序管理的计算机软件系统,系统实施的目的旨在帮助用户完成其私人通讯信息管理的数字化,以提供较手工方式下更高的效率和更低的出错率。

电话号码查询系统是为了方便用户查找所需的电话号码,本设计详细的介绍了软件设计原理和设计流程图及程序清单。

使用者只须输入用户的姓名就可查询到所需电话号码。

设计方案的制定(划分设计阶段、时间安排、拟采用方法):第一阶段:围绕程序设计进行相关的技术讨论,查找相关文档资料第二阶段:画好流程图,方案设计第三阶段:编写源代码、完成程序设计第四阶段:连接,调试(测试),完成最终程序,保存源代码及已编译的可执行程序第五阶段:、完成课程设计报告书,相关内容存盘设计基本思路该课题的目标是用汇编语言编写一个程序,实现通过姓名查询其电话号码的功能,按照设计任务的要求,一般的设计思路要分几个模块。

1.设某单位内部电话号码为4位,姓名均用汉语拼音表示,查询时,应键入用户姓名(小写字母),如果位合法用户,显示:姓名——电话号码否则显示姓名——X X X X2.由于汉字具有同音不同字的特点,汉语拼音相同的姓名也许不是同一人,具有不同的电话号码是必然的,本设计仅作这样的要求:把姓名拼音相同的电话号码全部找出并显示。

3.本例只假设有九个用户,电话号码和姓名的对照见下表,在这九个用户中,姓名长度分别为5个字符,6个字符和11个字符3类,对于其他长度的姓名串,一律按非法键入处理。

姓名汉语拼音电话号码李莉li li 2345于特yu te 2765马乐ma le 2456皮敏pi min 2289李梅li mei 2761于青果yu qing guo 2221丘宝梅qiu bao mei 2554俞庆国yu qing guo 2876田利秋tian li qiu 29014.编程的关键问题,首先是组织“姓名-电话号码表”,把长度相同的姓名组织在一张表中,本例应有3张“姓名-电话号码表”,表头分别用N5,N6,N11表示。

数据结构课程设计-利用散列表做一个电话号码查找系统

数据结构课程设计-利用散列表做一个电话号码查找系统

数据结构课程设计-利⽤散列表做⼀个电话号码查找系统【基本要求】(1)设每个记录有下列数据项:电话号码、⽤户名、地址;(2)从键盘输⼊各记录,分别以电话号码和⽤户名为关键字建⽴散列表;(3)采⽤⼀定的⽅法解决冲突;(4)查找并显⽰给定电话号码的记录;(5)查找并显⽰给定⽤户名的记录。

【选做内容】(1)系统功能的完善;(2)设计不同的散列函数,⽐较冲突率; (3)在散列函数确定的前提下,尝试各种不同类型处理冲突的⽅法,考察平均查找长度的变化。

⽤的C++开发,基本实现了3种哈希函数+3种解决冲突的⽅法。

因为要求同时有姓名散列与按号码散列,所以⽤了flag标记每次的散列类型,针对不同的要求对散列函数做了个别优化。

哈希表类的结构如下1class HashTable{2public:3 HashTable(int size = MAXSIZE-1);4 ~HashTable(){ delete[]E; delete[]tag; delete[]E2; delete[]tag2; }5int hash1(string name, int flag);//哈希函数1 除数求余法6int hash2(string tel);//哈希函数2 折叠法7int hash3(string tel);//哈希函数3 数字分析法8int solve1(int hashVal, int flag);//线性探测法解决冲突9int solve2(int hashVal, int flag);//⼆次探测法解决冲突10 Node* solve3(int hashVal, int flag);//拉链法解决冲突11 User input();//往电话薄中添加⽤户12void creat(int flag); //创建散列表13void show(int flag); //列出电话薄所有元素14void search(int flag,string at); //搜索指定⽤户15void searchByNode(int flag, string at); //拉链法搜索指定⽤户16void insert(int flag, User newUser); //插⼊17void del(int flag, string by);//删除18void save(int flag);//将电话薄保存⾄本地⽂件19int length; //要创建的电话本长度20 Node** ht;21private:22 User* E; //⽤户数组按姓名散列23 User* E2; //⽤户数组2 按电话号码散列24int* tag; //标记散列表1每个桶的存储状态 0为空 1为实25int* tag2;//标记散列表2每个桶的存储状态26int flag; //1表⽰是按姓名 2表⽰按电话号码新建的哈希表27int maxSize; //哈希表最⼤长度28int f;//⽐例因⼦主要⽤于折叠法29 };View CodeUser类的结构class User{public:string name;string tel;string address;bool operator==(const User&target){if (this->name == &&this->address == target.address&&this->tel == target.tel)return true;elsereturn false;}};哈希函数1int HashTable::hash1(string name,int flag) //除留求余法{int hashValue; long a = 0;switch (flag){case1:for (int i = 0; i < name.length(); i++)a += int(name[i]);hashValue = a%maxSize;break;case2:int temp = atof(name.c_str());hashValue = temp%maxSize;break;}return hashValue;};哈希函数2int HashTable::hash2(string tel) //折叠法--移位法{int hashValue;int temp; //移位法求和temp = atof(tel.substr(0, 3).c_str()) + atof(tel.substr(3, 3).c_str())+ atof(tel.substr(6, 3).c_str()) + atof(tel.substr(9, 2).c_str());//取计算之后的数的最后三位if (temp >= 999){char p[10];sprintf(p, "%d", temp);string lastThree = p;lastThree = lastThree.substr(lastThree.length() - 3, 3);hashValue = atof(lastThree.c_str());return hashValue;}hashValue = temp;return hashValue;};哈希函数3int HashTable::hash3(string tel)//数字分析法做哈希函数{int hashValue;hashValue = atof(tel.substr(8, 3).c_str()); //因为电话号码⼀般后4位不同return hashValue;};解决冲突的⽅法1.线性探测法int HashTable::solve1(int hashVal,int flag) //线性探查法处理冲突{int output = hashVal;switch (flag){case1:for (int j = 1; j < MAXSIZE; j++){output = (hashVal + j) % MAXSIZE;if (tag[output] == 0){tag[output] = 1;return output;}}return -1;break;case2:for (int j = 1; j < MAXSIZE; j++){output = (hashVal + j) % MAXSIZE;if (tag2[output] == 0){tag2[output] = 1;return output;}}return -1;default:break;}};2.⼆次探查法int HashTable::solve2(int hashVal, int flag) //⼆次探查法解决冲突{int i = hashVal; //i为初始桶号int k = 0; //k为探查次数int odd = 0; //odd为控制加减的标志int save; //缓存上⼀次的桶号switch (flag){case1:while (tag[i]==1){if (odd == 0){k++; save = i;i = (i + 2 * k-1) % MAXSIZE;odd = 1;}else{i = (save - 2 * k+1) % MAXSIZE;odd = 0;if (i<0){i = i + MAXSIZE;}}}return i;break;case2:while (tag2[i] == 1){if (odd == 0){k++; save = i;i = (i + 2 * k - 1) % MAXSIZE;odd = 1;}else{k++;i = (save - 2 * k + 1) % MAXSIZE;odd = 0;if (i<0){i = i + MAXSIZE;}}}return i;break;default:break;}};3.拉链法Node* HashTable::solve3(int hashVal, int flag)//拉链法解决冲突{int i = hashVal; //第i条链Node*p = ht[i]; //该链上的头指针while (p!=NULL)p = p->next;//往后遍历直到找到⼀个空节点⽤于存放userreturn p;};所有代码如下1 #include <iostream>2 #include <string>3 #include <fstream>45using namespace std;67const int MAXSIZE = 12;//默认最⼤表长89101112//存储项13class User{14public:15string name;16string tel;17string address;18bool operator==(const User&target)19 {20if (this->name == &&this->address == target.address&&this->tel == target.tel) 21return true;22else23return false;24 }25 };2627//⽤于拉链法28struct Node{29 User user;30 Node* next;31 };32class HashTable{33public:34 HashTable(int size = MAXSIZE-1);35 ~HashTable(){ delete[]E; delete[]tag; delete[]E2; delete[]tag2; }36int hash1(string name, int flag);//哈希函数1 除数求余法37int hash2(string tel);//哈希函数2 折叠法38int hash3(string tel);//哈希函数3 数字分析法39int solve1(int hashVal, int flag);//线性探测法解决冲突40int solve2(int hashVal, int flag);//⼆次探测法解决冲突41 Node* solve3(int hashVal, int flag);//拉链法解决冲突42 User input();//往电话薄中添加⽤户43void creat(int flag); //创建散列表44void show(int flag); //列出电话薄所有元素45void search(int flag,string at); //搜索指定⽤户46void searchByNode(int flag, string at); //拉链法搜索指定⽤户47void insert(int flag, User newUser); //插⼊48void del(int flag, string by);//删除49void save(int flag);//将电话薄保存⾄本地⽂件50int length; //要创建的电话本长度51 Node** ht;52private:53 User* E; //⽤户数组按姓名散列54 User* E2; //⽤户数组2 按电话号码散列55int* tag; //标记散列表1每个桶的存储状态 0为空 1为实56int* tag2;//标记散列表2每个桶的存储状态57int flag; //1表⽰是按姓名 2表⽰按电话号码新建的哈希表58int maxSize; //哈希表最⼤长度59int f;//⽐例因⼦主要⽤于折叠法60 };6162 HashTable::HashTable(int size)63 {64 maxSize = size; //⽤作除数65 E = new User[MAXSIZE];66 E2 = new User[MAXSIZE];67 tag = new int[MAXSIZE];68 tag2 = new int[MAXSIZE];69for (int i = 0; i < MAXSIZE; i++)70 {71 tag[i] = 0;72 tag2[i] = 0;73 }74 f = maxSize / 512; //⽤于折叠法产⽣的哈希值过⼤保留3位数的地址范围为0~51175 ht = new Node*[maxSize]; //存放节点的⼀维数组拉链法76 };7778int HashTable::hash1(string name,int flag) //除数求余法79 {80int hashValue; long a = 0;81switch (flag)82 {83case1:84for (int i = 0; i < name.length(); i++)85 a += int(name[i]);86 hashValue = a%maxSize;87break;88case2:89int temp = atof(name.c_str());90 hashValue = temp%maxSize;91break;9293 }94return hashValue;95 };9697int HashTable::hash2(string tel) //折叠法--移位法98 {99int hashValue;100int temp; //移位法求和101 temp = atof(tel.substr(0, 3).c_str()) + atof(tel.substr(3, 3).c_str())102 + atof(tel.substr(6, 3).c_str()) + atof(tel.substr(9, 2).c_str());103//取计算之后的数的最后三位104if (temp >= 999)105 {106char p[10];107 sprintf(p, "%d", temp);108string lastThree = p;109 lastThree = lastThree.substr(lastThree.length() - 3, 3);110 hashValue = atof(lastThree.c_str());111return hashValue;112 }113 hashValue = temp;114return hashValue;115 };116117int HashTable::hash3(string tel)//数字分析法做哈希函数118 {119int hashValue;120 hashValue = atof(tel.substr(8, 3).c_str()); //因为电话号码⼀般后4位不同121return hashValue;122 };123124int HashTable::solve1(int hashVal,int flag) //线性探查法处理冲突125 {126int output = hashVal;127switch (flag)128 {129case1:130for (int j = 1; j < MAXSIZE; j++)131 {132 output = (hashVal + j) % MAXSIZE;133if (tag[output] == 0)134 {135 tag[output] = 1;136return output;137 }138 }139return -1;140break;141case2:142for (int j = 1; j < MAXSIZE; j++)143 {144 output = (hashVal + j) % MAXSIZE;145if (tag2[output] == 0)146 {147 tag2[output] = 1;148return output;149 }150 }151return -1;152default:153break;154 }155156 };157158int HashTable::solve2(int hashVal, int flag) //⼆次探查法解决冲突159 {160int i = hashVal; //i为初始桶号161int k = 0; //k为探查次数162int odd = 0; //odd为控制加减的标志163int save; //缓存上⼀次的桶号164switch (flag)165 {166case1:167while (tag[i]==1)168 {169if (odd == 0)170 {171 k++; save = i;172 i = (i + 2 * k-1) % MAXSIZE;173 odd = 1;174 }175else176 {177 i = (save - 2 * k+1) % MAXSIZE;178 odd = 0;179if (i<0)180 {181 i = i + MAXSIZE;182 }183 }184 }185return i;186break;187case2:188while (tag2[i] == 1)189 {190if (odd == 0)191 {192 k++; save = i;193 i = (i + 2 * k - 1) % MAXSIZE;194 odd = 1;195 }196else197 {198 k++;199 i = (save - 2 * k + 1) % MAXSIZE;200 odd = 0;201if (i<0)202 {203 i = i + MAXSIZE;204 }205 }206 }207return i;208break;209default:210break;211 }212213 };214215/*216Node* HashTable::solve3(int hashVal, int flag)//拉链法解决冲突217218{219 int i = hashVal; //第i条链220221 Node*p = ht[i]; //该链上的头指针222 while (p!=NULL)223 p = p->next;//往后遍历直到找到⼀个空节点⽤于存放user 224 return p;225};226227void HashTable::searchByNode(int flag, string at)//调⽤拉链法搜索228{229 int i = hash1(at,1);230 Node** ht = new Node*[maxSize]; //存放节点的⼀维数组231 Node*p = ht[i]; //该链上的头指针232 while (p!=NULL&&p->!=at)233 {234 p = p->next;235 }236};237*/238 User HashTable::input()239 {240 User user;241 cout << "请输⼊姓名:" << endl;242 cin >> ;243 cout << "请输⼊电话号码:" << endl;244 cin >> user.tel;245 cout << "请输⼊地址:" << endl;246 cin >> user.address;247return user;248 };249250void HashTable::creat(int flag)251 {252switch (flag)253 {254case1: //按姓名哈希创建哈希表255for (int i = 0; i < length; i++)256 {257 User newUser = input();258int val = hash1(,1);259if (tag[val] == 1)260 val = solve1(val,1);//线性探测法解决冲突261 E[val] = newUser;262 tag[val] = 1;263 }264break;265case2: //按电话号码哈希创建哈希表266for (int i = 0; i < length; i++)267 {268 User newUser = input();269int val = hash1(newUser.tel,2);270if(tag2[val] == 1)271 val = solve1(val,2);//线性探测法解决冲突272 E2[val] = newUser;273 tag2[val] = 1;274 }275break;276 }277 };278void HashTable::show(int flag)279 {280switch (flag)281 {282case1:283for (int i = 0; i < MAXSIZE; i++)284 {285if (tag[i] == 1)286 cout << E[i].name << "" << E[i].tel << "" << E[i].address << " 位于: " << i << endl; 287 }288break;289case2:290for (int i = 0; i < MAXSIZE; i++)291 {292if (tag2[i] == 1)293 cout << E2[i].name << "" << E2[i].tel << "" << E2[i].address << " 位于: " << i << endl; 294 }295break;296 }297298 };299300void HashTable::search(int flag,string at) //at表⽰索引内容301 {302int i = 0;303switch (flag)304 {305case1: //调⽤线性探测法查找姓名306 i = hash1(at,1);307if (tag[i] == 1 && E[i].name != at)308 i = solve1(i, 2);309if (i < 0 || tag2[i] == 0)310 {311 cout << "查⽆此⼈!" << endl;312return;313 }314if (tag[i] == 1 && E[i].name == at)315 cout << E2[i].name << "" << E2[i].tel << "" << E2[i].address << endl;316break;317case2: //调⽤⼆次探测法查找电话号码318 i = hash2(at);319if (tag2[i] == 1&&E2[i].tel!=at)320 i = solve2(i,2);321if (i < 0||tag2[i]==0)322 {323 cout << "查⽆此⼈!" << endl;324return;325 }326if (tag2[i] == 1 && E2[i].tel==at)327 cout << E2[i].name << "" << E2[i].tel << "" << E2[i].address << endl;328break;329 }330 };331332void HashTable::insert(int flag, User newUser){333int i = -1;334switch (flag)335 {336case1:337 i = hash1(,1);338if (tag[i] == 1||E[i]==newUser)339 i = solve1(i, 1);340if (i < 0)341 {342 cout << "表满!插⼊失败!" << endl;343return;344 }345if (tag[i] == 0)346 {347 E[i] = newUser;348 tag[i] = 1;349 length++;350 cout << "插⼊成功" << endl;351 }352case2:353 i = hash1(newUser.tel,2);354if (tag2[i] == 1 || E2[i] == newUser)355 i = solve1(i, 2);356if (i < 0)357 {358 cout << "表满!插⼊失败!" << endl;359return;360 }361if (tag2[i] == 0)362 {363 E2[i] = newUser;364 tag2[i] = 1;365 length++;366 cout << "插⼊成功" << endl;367 }368default:369break;370 }371 };372373void HashTable::del(int flag, string by) //by表⽰按照何种标签进⾏删除374 {375int i = -1;376int select;//选择是否删除377switch (flag)378 {379case1: //调⽤线性探测法查找姓名380 i = hash1(by,1);381if (tag[i] == 1 && E[i].name != by)382 i = solve1(i, 2);383if (i < 0 || tag2[i] == 0)384 {385 cout << "查⽆此⼈!" << endl;386return;387 }388if (tag[i] == 1 && E[i].name == by)389 {390 cout << E2[i].name << "" << E2[i].tel << "" << E2[i].address << endl; 391 cout << "是否删除 0.删了 1.算了" << endl;392 cin >> select;393if (select == 0)394 tag[i] = 0;//伪删除395 }396break;397case2: //调⽤⼆次探测法查找电话号码398 i = hash2(by);399if (tag2[i] == 1 && E2[i].tel != by)400 i = solve2(i, 2);401if (i < 0 || tag2[i] == 0)402 {403 cout << "查⽆此⼈!" << endl;404return;405 }406if (tag2[i] == 1 && E2[i].tel == by)407 {408 cout << E2[i].name << "" << E2[i].tel << "" << E2[i].address << endl; 409 cout << "是否删除 0.删了 1.算了" << endl;410 cin >> select;411if (select == 0)412 tag2[i] = 0;//伪删除413 }414break;415 }416 };417418void HashTable::save(int flag)419 {420 fstream out1("电话薄(姓名散列).txt", ios::out);421 fstream out2("电话薄(号码散列).txt", ios::out);422switch (flag)423 {424case1:425for (int i = 0; i < maxSize; i++)426 {427if (tag[i] == 1)428 out1 << E[i].name << "" << E[i].tel << "" << E[i].address << endl; 429 }430 cout << "已存⾄电话薄(姓名散列).txt" << endl;431return;432break;433case2:434for (int i = 0; i < maxSize; i++)435 {436if (tag2[i] == 1)437 out2 << E2[i].name << "" << E2[i].tel << "" << E2[i].address << endl; 438 }439 cout << "已存⾄电话薄(号码散列).txt" << endl;440return;441break;442default:443break;444 }445446 };hashtable.h1 #include <iostream>2 #include <string>3 #include <fstream>4 #include "hashtable.h"5using namespace std;67//菜单8void menu()9 {10 cout << " ****************************" << endl;11 cout << "|| 0.建表 ||" << endl;12 cout << "|| 1.查看 ||" << endl;13 cout << "|| 2.搜索 ||" << endl;14 cout << "|| 3.添加 ||" << endl;15 cout << "|| 4.删除 ||" << endl;16 cout << "|| 5.保存 ||" << endl;17 cout << "|| 6.退出 ||" << endl;18 cout << " ****************************" << endl;1920 }2122int main()23 {24 User user;25int size;//第⼀次创建的数据量⼤⼩26int select;//主菜单选项27int select_;//⼦菜单选项28 cout << "欢迎使⽤电话簿" << endl;29 HashTable ht;30while (1)31 {32 menu();33 cin >> select;34switch (select)35 {36case0:37 cout << "第⼀次使⽤,请输⼊要新建的电话本⼤⼩:" << endl;38 cin >> size;39 ht.length = size;40 cout << "1.姓名散列 2.电话号码散列" << endl;41 cin >> select_;42 ht.creat(select_);43break;44case1:45 cout << "1.姓名散列 2.电话号码散列" << endl;46 cin >> select_;47 ht.show(select_);48break;49case2:50 cout << "1.按姓名查找 2.按电话号码查找" << endl;51 cin >> select_;52if (select_==1)53 {54 cout << "输⼊姓名" << endl;55string name;56 cin >> name;57 ht.search(1, name);58 }59else if (select_ == 2)60 {61 cout << "输⼊号码" << endl;62string tel;63 cin >> tel;64 ht.search(2, tel);65 }66else67 cout << "不合法操作" << endl;68break;69case3:70 user = ht.input();71 cout << "1.插⼊到姓名散列表 2.插⼊到电话号码散列" << endl;72 cin >> select_;73 ht.insert(select_,user);74break;75case4:76 cout << "1.根据姓名删除 2.根据电话号码删除" << endl;77 cin >> select_;78if (select_ == 1)79 {80 cout << "输⼊姓名" << endl;81string name;82 cin >> name;83 ht.del(1, name);84 }85else if (select_ == 2)86 {87 cout << "输⼊号码" << endl;88string tel;89 cin >> tel;90 ht.del(2, tel);91 }92else93 cout << "不合法操作" << endl;94break;95case5:96 cout << "1.保存姓名散列表到本地 2.保存电话号码散列表到本地" << endl;97 cin >> select_;98 ht.save(select_);99case6:100return0;101 }102 }103 }main.cpp通过这次课程设计,总结如下1. C++技艺不精,语法不熟悉,⽐如模版类与运算符重载,指针更是不⼤熟练。

简单个人电话号码查询系统

简单个人电话号码查询系统

课程设计任务书2011—2012学年第1学期电子与信息工程系专业班级课程设计名称:数据结构课程设计设计题目:简单个人电话号码查询系统完成期限:自2012 年1月2日至2012 年1月 6 日共 1 周一、设计目的熟悉各种数据结构和运算,会使用数据结构的基本操作解决一些实际问题。

二、设计要求在本课程设计过程中要求学生:(1)重视课程设计环节,用严谨、科学和踏实的工作态度对待课程设计的每一项任务;(2)按照课程设计的题目要求,独立地完成各项任务,严禁抄袭;凡发现抄袭,抄袭者与被抄袭者皆以零分计入本课程设计成绩。

凡发现实验报告或源程序雷同,涉及的全部人员皆以零分计入本课程设计成绩。

(3)学生在接受设计任务后,根据要求认真完成。

(4)认真编写课程设计报告。

三、设计内容1) 问题描述人们在日常生活中经常需要查找某个人或某个单位的电话号码,本实验将实现一个简单的个人电话号码查询系统,根据用户输入的信息(例如姓名等)进行快速查询。

2) 基本要求(1) 在外存上,用文件保存电话号码信息;(2) 在内存中,设计数据结构存储电话号码信息;(3) 提供查询功能:根据姓名实现快速查询;(4) 提供其他维护功能:例如插入、删除、修改等;(5) 按电话号码进行排序。

3) 设计思想由于需要管理的电话号码信息较多,而且要在程序运行结束后仍然保存电话号码信息,所以电话号码信息采用文件的形式存放到外存中。

在系统运行时,需要将电话号码信息从文件调入内存来进行查找等操作,为了接收文件中的内容,要有一个数据结构与之对应,可以设计如下结构类型的数组来接收数据:const int max=10;struct TeleNumber{string name; //姓名string phoneNumber; //固定电话号码string mobileNumber; //移动电话号码string email; //电子邮箱} Tele[max];为了实现对电话号码的快速查询,可以将上述结构数组排序,以便应用折半查找,但是,在数组中实现插入和删除操作的代价较高。

个人电话号码查询系统设计报告

个人电话号码查询系统设计报告

问题描述:实现一个简单个人电话号码查询系统,根据用户输入信息(如姓名等)进行快速查询。

基本要求:(1)在内存中,设计数据结构存储电话号码信息;(2)在外存上,用文件保存电话号码信息;(3)提供查询功能:根据姓名实现快速查询;(4)提供其他维护功能,例如插入、删除、修改等。

需求分析:(1)输入数据建立个人电话号码查询系统。

(2)输出个人电话号码查询系统中的所有联系信息。

(3)插入新的联系人信息。

(4)查询该系统中满足要求的信息。

(5)删除不需要的联系人信息。

数据结构设计:(一)模块设计本程序包含两个模块:主程序模块和链表操作模块。

其调用关系如下图所示.(二)系统子程序及功能设计本系统中共设置5个子程序,子程序的函数名及功能说明如下,其中大部分都是链表的基本操作函数。

(1)LinkList Book_Creat(LinkList list) //1.新建个人电话号码信息(2)LinkList Book_Print(LinkList list) //2.浏览个人电话号码信息(3)Book_Search(LinkList list) //3.查找个人电话号码信息(4)LinkList Book_Del(LinkList list) //4.删除个人电话号码信息(5)main() //主函数。

设定界面颜色和大小,调用链表操作模块(三)函数主要调用关系图算法设计:(一)概要设计:为了实现需求分析中的功能,可以从三个方面着手设计。

1.主界面设计为了实现个人电话号码查询系统各功能的管理,设计一个含有多个菜单项的主菜单子程序已链接系统各项子功能,方便用户使用本系统。

本系统主控菜单运行界面如图所示:2.存储结构设计本系统主要采用链表结构类型来表示存储在“简单个人电话号码查询系统”中的信息。

其中,链表结点由4个分量构成:成员姓名、电话号码1、电话号码2、指向该结构体的指针。

3.系统功能设计本系统设置了5个子功能菜单,设计描述如下:(1)新建个人电话号码信息。

《数据结构》课程设计电话查询系统

《数据结构》课程设计电话查询系统

数据结构课程设计实验名称班级学号姓名指导教师时间:成绩指导教师签字年月日《数据结构》课程设计一.题目:散列表的实现与电话查询系统二.算法思想描述:1.课程设计的主要研究内容:(1) 设每个记录有下列数据项:电话号码、用户名、地址;(2) 从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表;(3) 采用一定的方法解决冲突;(4) 查找并显示给定电话号码的记录;(5) 查找并显示给定用户名的记录。

2.设计概要:设定该事件的抽象数据类型三.程序结构三.数据结构和功能设计四.程序结构分析1、程序模块●哈希函数1●哈希函数2●输入函数●添加节点函数●新建节点函数1●新建节点函数2●显示列表函数1●显示列表函数2●查找用户信息函数●保存用户信息函数●菜单函数●2、程序主要结构●流程的名称解释如下——main()是主函数,负责调用其他所有的函数,hash1()号码哈希函数,hash2()名字哈希函数,node* input()函数用于输入节点,apend()函数用于添加节点,creat()函数用于新建电话号码节点,creat2()函数用于新建名字节点,list()用于显示按电话号码排列的列表,list2()用于显示按姓名排列的列表,find()按号码查询,infd()按姓名查询,save()保存用户信息,menu()是菜单函数。

五、程序运行结果1、源程序#include "iostream.h"#include "string.h"#include "fstream"#define NULL 0unsigned int key;unsigned int key2;int *p;struct node //建节点{char name[8],address[20];char num[11];node * next;};typedef node* pnode;typedef node* mingzi;node **phone;node **nam;node *a;using namespace std; //使用名称空间void hash(char num[11]) //哈希函数{int i = 3;key=(int)num[2];while(num[i]!=NULL){key+=(int)num[i];i++;}key=key%20;}void hash2(char name[8]) //哈希函数{int i = 1;key2=(int)name[0];while(name[i]!=NULL){key2+=(int)name[i];i++;}key2=key2%20;}node* input() //输入节点{node *temp;temp = new node;temp->next=NULL;cout<<"输入姓名:"<<endl; cin>>temp->name;cout<<"输入地址:"<<endl; cin>>temp->address;cout<<"输入电话:"<<endl; cin>>temp->num;return temp;}int apend() //添加节点{node *newphone;node *newname;newphone=input();newname=newphone;newphone->next=NULL;newname->next=NULL;hash(newphone->num);hash2(newname->name); newphone->next = phone[key]->next;phone[key]->next=newphone;newname->next = nam[key2]->next;nam[key2]->next=newname;return 0;}void create() //新建节点{int i;phone=new pnode[20];for(i=0;i<20;i++){phone[i]=new node;phone[i]->next=NULL;}}void create2() //新建节点{int i;nam=new mingzi[20];for(i=0;i<20;i++){nam[i]=new node;nam[i]->next=NULL;}}void list() //显示列表{int i;node *p;for(i=0;i<20;i++){p=phone[i]->next;while(p){cout<<p->name<<'_'<<p->address<<'_'<<p->num<<endl; p=p->next;}}}void list2() //显示列表{int i;node *p;for(i=0;i<20;i++){p=nam[i]->next;while(p){cout<<p->name<<'_'<<p->address<<'_'<<p->num<<endl; p=p->next;}}}void find(char num[11]) //查找用户信息{hash(num);node *q=phone[key]->next;while(q!= NULL){if(strcmp(num,q->num)==0)break;q=q->next;}if(q)cout<<q->name<<"_" <<q->address<<"_"<<q->num<<endl; else cout<<"无此记录"<<endl;}void find2(char name[8]) //查找用户信息{hash2(name);node *q=nam[key2]->next;while(q!= NULL){if(strcmp(name,q->name)==0)break;q=q->next;}if(q)cout<<q->name<<"_" <<q->address<<"_"<<q->num<<endl; else cout<<"无此记录"<<endl;}void save() //保存用户信息{int i;node *p;for(i=0;i<20;i++){p=phone[i]->next;while(p){fstream iiout("out.txt", ios::out);iiout<<p->name<<"_"<<p->address<<"_"<<p->num<<endl; p=p->next;}}}void menu() //菜单{cout<<"1.添加记录"<<endl;cout<<"2.查找记录"<<endl;cout<<"3.姓名散列"<<endl;cout<<"4.号码散列"<<endl;cout<<"5.清空记录"<<endl;cout<<"6.保存记录"<<endl;cout<<"7.退出系统"<<endl;}int main(){char num[11];char name[8];create();create2() ;int sel;while(1){menu();cin>>sel;if(sel==2){ cout<<"9号码查询,8姓名查询"<<endl;int b;cin>>b;if(b==9){ cout<<"请输入电话号码:"<<endl;cin >>num;cout<<"输出查找的信息:"<<endl;find(num);}else{ cout<<"请输入姓名:"<<endl;cin >>name;cout<<"输出查找的信息:"<<endl;find2(name);}}if(sel==3){ cout<<"姓名散列结果:"<<endl;list2();}if(sel==1){ cout<<"请输入要添加的内容:"<<endl;apend();}if(sel==4){ cout<<"号码散列结果:"<<endl;list();}if(sel==5){ cout<<"列表已清空:"<<endl;create();create2();}if(sel==6){ cout<<"通信录已保存:"<<endl;save();}if(sel==7) return 0;}return 0;}2、本程序在VC++环境下实现的,下面将演示该软件的使用方法主菜单添加记录输入姓名,地址,电话通信记录保存查询记录按号码查询按用户名查询五.体会通过这次课程设计,我有很深的体会,具体如下:1.巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。

数据结构课程设计-简易手机通讯录管理系统

数据结构课程设计-简易手机通讯录管理系统

一、课题名称简易手机通讯录管理系统(线性表、查找、排序)二、主要内容简易手机通讯录管理系统的设计主要是实现对手机通讯录的管理和相关操作。

基本功能如下:(1)联系人信息录入、添加功能:包括手机号(此处用短号,5位,不能重复)、姓名、家庭住址的录入和添加。

(2)联系人信息查询功能:能①按手机号进行查询。

②按联系人姓名进行查询。

(3)排序:①能按手机号升序进行排序;②能按姓名进行升序排序,姓名相同时按手机号从小到大进行排序(4)联系人信息的修改、删除功能:①按手机号进行联系人信息的修改和删除。

②按姓名进行联系人信息的修改和删除,多个姓名时,再指定具体的号码。

(5)统计功能:统计自己的联系人有多少个。

三、课题设计的基本思想,原理和算法描述(1)本次课程设计题目为简易手机通讯录管理系统,主要运用到线性表中顺序表的相关知识,以及顺序查找的思想和冒泡排序算法。

(2)界面设计//菜单函数int menu(){int c;printf("\n\n\t☆☆☆☆☆☆☆手机通讯录信息管理系统☆☆☆☆☆☆☆☆\n\n");printf("******************************************************************* ***\n");printf(" 1.添加联系人信息\n");printf(" 2.查询联系人信息\n");printf(" 3.对联系人信息进行排序\n");printf(" 4.修改联系人信息\n");printf(" 5.删除联系人信息\n");printf(" 6.统计联系人个数\n");printf(" 0.退出信息管理系统\n");printf("******************************************************************* ***\n\n");printf("★请输入您的选择(0-6):");while(1){scanf("%d",&c);if(c<0||c>6)printf("\n▲输入错误!请重新选择:");elsebreak;}return c;}//主函数void main(){SqList * L;InitList(L);system("color 3f");while(1){switch(menu()){case 1:system("cls");printf("\n\t\t\t信息的增加\n");ListAdd(L);break;case 2:system("cls");printf("\n\t\t\t信息的查询\n");Search(L);break;case 3:system("cls");printf("\n\t\t\t对信息进行排序\n");Paixu(L);break;case 4:system("cls");printf("\n\t\t\t信息的修改\n");ListModify(L);break;case 5:system("cls");printf("\n\t\t\t信息的删除\n");Delete(L);break;case 6:system("cls");printf("\n\t\t\t统计联系人个数\n");ListLength(L);break;case 0:printf("再见!\n");return;default:printf("\n▲输入错误!请重新选择:");break;}}}(3)功能模块的实现初始化顺序表void InitList(SqList *&L)L=(SqList *)malloc(sizeof(SqList));L->length=0;}增加信息函数。

电话号码查找统课程设计

电话号码查找统课程设计

电话号码查找统课程设计一、课程目标知识目标:1. 学生能够理解电话号码查找系统的基本原理和操作流程。

2. 学生能够掌握运用数据查找和统计方法,解决实际问题。

3. 学生能够了解我国电话号码的构成及其规律。

技能目标:1. 学生能够运用所学知识,设计简单的电话号码查找系统。

2. 学生能够运用计算机软件或手工方式,进行电话号码的查找和统计。

3. 学生能够通过实际操作,提高信息处理和分析能力。

情感态度价值观目标:1. 学生能够认识到电话号码查找系统在生活中的实际应用,增强学以致用的意识。

2. 学生在小组合作中,培养团队协作精神和沟通能力。

3. 学生在解决问题的过程中,培养耐心、细心的品质,提高面对困难的勇气和信心。

课程性质:本课程为信息技术与数学学科融合的实践性课程,旨在培养学生的信息素养和实际操作能力。

学生特点:五年级学生具备一定的数学基础和信息素养,对新鲜事物充满好奇心,善于动手实践。

教学要求:结合学生特点,注重理论知识与实际操作的相结合,鼓励学生主动探究,发挥学生的主体作用。

通过课程学习,使学生能够将所学知识应用于生活实际,提高解决问题的能力。

在教学过程中,关注学生情感态度价值观的培养,促进学生的全面发展。

二、教学内容1. 电话号码的构成与规律- 电话号码的位数及其含义- 各地区电话号码的特点与规律2. 数据查找与统计方法- 顺序查找法- 二分查找法- 数据的统计与分析方法3. 电话号码查找系统设计- 系统需求分析- 系统设计思路- 系统实现与测试4. 实践操作与案例分析- 利用计算机软件进行电话号码查找与统计- 手工制作电话号码查找表- 分析实际生活中的电话号码查找案例教学内容安排与进度:第一课时:电话号码的构成与规律,数据查找与统计方法(顺序查找法)第二课时:数据查找与统计方法(二分查找法),实践操作与案例分析第三课时:电话号码查找系统设计,实践操作与案例分析教材章节:《信息技术》五年级下册:第三章 数据处理与应用《数学》五年级下册:第八章 统计与概率教学内容注重科学性和系统性,结合课程目标,以实践操作为主,引导学生将所学知识应用于解决实际问题。

电话查找系统课程设计

电话查找系统课程设计

电话查找系统课程设计一、课程目标知识目标:1. 学生能够理解电话查找系统的基本原理,掌握其功能和使用方法。

2. 学生能够描述电话查找系统的数据库结构,了解数据存储和查询的基本过程。

3. 学生能够运用所学编程知识,实现简单的电话查找功能。

技能目标:1. 学生能够运用信息检索技能,快速准确地查找电话号码。

2. 学生能够运用编程语言,设计并实现一个基本的电话查找系统。

3. 学生能够通过小组合作,进行问题分析、系统设计和编程实践,提高团队协作能力。

情感态度价值观目标:1. 学生培养对信息技术的兴趣和热情,认识到电话查找系统在现代生活中的重要性。

2. 学生在学习过程中,养成积极思考、主动探究的良好习惯,形成自主学习的能力。

3. 学生通过电话查找系统的设计与实现,体验创新过程,培养创新精神和实践能力。

4. 学生在小组合作中,学会尊重他人、倾听意见、沟通交流,形成良好的人际关系。

课程性质:本课程为信息技术课程,旨在让学生结合实际需求,运用所学知识设计和实现电话查找系统,提高学生的编程实践能力和团队协作能力。

学生特点:学生处于初中年级,对信息技术有一定的基础,具备基本的编程知识和技能,具有较强的学习兴趣和动手能力。

教学要求:教师需关注学生的个体差异,提供针对性的指导,引导学生运用所学知识解决实际问题,注重培养学生的实践能力和创新精神。

在教学过程中,将课程目标分解为具体的学习成果,以便于教学设计和评估。

二、教学内容1. 电话查找系统概述- 了解电话查找系统的概念、作用和基本原理。

- 学习电话查找系统的发展历程及其在生活中的应用。

2. 电话查找系统数据库结构- 学习数据库的基本概念,理解电话查找系统中数据库的作用。

- 分析电话查找系统的数据表结构,了解字段定义和数据关系。

3. 编程语言基础- 复习所学的编程语言基础知识,如变量、数据类型、控制结构等。

- 学习如何在编程环境中编写、调试和运行程序。

4. 电话查找系统设计与实现- 分析电话查找系统的功能需求,设计系统界面和功能模块。

数据结构电话号码查询系统设计报告及代码

数据结构电话号码查询系统设计报告及代码

.郑州轻工业学院课程设计任务书题目电话号码查询系统专业、班级计科10-01学号41姓名王平主要内容:设计哈希表实现电话号码查找系统基本要求:从键盘输入各记录,分别以电话号码和用户名为关键字设计哈希表;采用不同的哈希函数,比较冲突率;采用适当的方法解决冲突;在哈希函数确定的前提下,尝试不同类型处理冲突的方法,考察平均查找长度的变化;查找并显示给定电话号码的记录;查找并显示给定用户名的记录。

主要参考资料等:数据结构课本(c语言版)完成期限:21012年6月21号指导教师签名:课程负责人签名:12年 6 月 21 日郑州轻工业学院本科数据结构课程设计总结报告设计题目:电话号码查询系统学生姓名:王平系别:计算机科学与通信工程学院专业:计算机科学与技术班级:10-01学号:541007010141指导教师:卢冰、李晔2012年6月21 日设计题目题目:电话号码查询系统每个记录有下列数据项:电话号码、用户名、地址;从键盘输入各记录,分别以电话号码和用户名为关键字设计哈希表;采用不同的哈希函数,比较冲突率;采用适当的方法解决冲突;在哈希函数确定的前提下,尝试不同类型处理冲突的方法,考察平均查找长度的变化;查找并显示给定电话号码的记录;查找并显示给定用户名的记录。

运行环境(软、硬件环境)Vc6.0算法设计的思想电话号码查询系统主要是考察我们对哈希查找的掌握。

题目要求用电话号码和姓名两种方式查找;第一大部份是用电话号码查找,第二部分是用姓名查找。

1:电话号码查找(先建立哈希表读入数据,然后再处理冲突,查找):在这部分中,我用了除留取余法和数字分析法设计的哈希表,用的是开放定址法进行的冲突处理。

除留取余法思想:取关键字被某个不大于哈希表表长的数p除后所得余数为哈希地址即:H(key)=key%p。

数字分析法:已知关键字是以r为基础的数,哈希表中出现的关键字是事先知道的,选择关键字是候,我们应该尽量避免冲突。

开放地址法:开放地址法主要公式;H=(H+di)%m,di 的取法有三种,但是我的程序中只用到了线性探测在散列,本可以用再哈希函数解决冲突的,但是考虑到再哈希函数会增加计算时间,所以就没用。

数据结构课程设计-简单个人电话号码查询系统

数据结构课程设计-简单个人电话号码查询系统

中南大学二○一一~二○一二学年第二学期信息科学与工程学院课程设计报告书课程名称:简单个人电话号码查询系统班级:电子信息1001学号:zzz姓名:指导教师:李登曾志文设计时间:2012年6月18日~6月30日目录一、绪论 (3)1.1课程设计目的 (3)1.2 问题描述 (3)1.3基本要求 (3)二、数据结构的设计 (4)2.1需求分析 (4)2.2 概要设计 (4)2.3软件模块结构图 (4)2.4程序设计思想 (5)四、程序流程图 (5)4.1主函数流程图 (5)4.2 mainmenu()函数流程图 (6)五、详细设计 (9)5.1头文件,双链表,结构体的建立 (9)5.2主函数算法 (10)5.2.1.main()函数的算法 (10)5.22.mainmenu()函数算法 (10)5.2.3.searchmenu()函数算法 (11)5.2.4.创建新的通讯录enter()函数算法 (11)5.2.5.显示通讯录信息display()函数算法 (12)5.2.6.保存通讯录save()函数算法 (13)5.2.7.增加一个节点listinsert()函数算法 (13)5.2.8.建立头结点 (14)5.2.9.查找search()函数算法 (14)5.2.10.删除delete()函数算法 (15)5.2.11.打开文件load()函数算法 (16)六、调试分析及测试数据 (17)6.1显示菜单 (18)6.2新添记录 (18)6.3查找联系人 (18)6.3.1查找菜单的显示 (18)6.3.2显示所有 (19)6.3.3按姓名查找 (20)6.4删除联系人 (20)6.5保存退出 (21)6.6打开通讯录 (21)七、用户使用手册 (22)八、心得体会 (23)附录(源代码) (23)一、绪论1.1课程设计目的1.训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。

课程设计电话查询系统

课程设计电话查询系统

课程设计电话查询系统一、教学目标本课程的设计旨在让学生掌握电话查询系统的基本原理和应用,培养他们运用信息技术解决问题的能力。

具体的教学目标如下:1.知识目标:使学生了解电话查询系统的历史、现状和发展趋势,理解电话查询系统的组成原理及工作方式,掌握电话查询系统的关键技术。

2.技能目标:培养学生运用电话查询系统进行信息检索的能力,提高他们运用电话查询系统进行沟通交流的技巧,培养他们分析问题和解决问题的能力。

3.情感态度价值观目标:培养学生对电话查询系统的兴趣,增强他们运用信息技术改变生活的信心,提高他们对电话查询系统发展的关注度。

二、教学内容本课程的教学内容主要包括以下几个部分:1.电话查询系统概述:介绍电话查询系统的历史、现状和发展趋势,使学生了解电话查询系统在日常生活和工作中的重要性。

2.电话查询系统的组成原理:讲解电话查询系统的硬件组成、软件结构和通信原理,使学生理解电话查询系统的工作方式。

3.电话查询系统的关键技术:介绍电话查询系统中的关键技术,如语音识别、语音合成、自然语言处理等,使学生掌握电话查询系统的核心技术。

4.电话查询系统的应用案例:分析电话查询系统在各个领域的应用案例,让学生了解电话查询系统的实际应用价值。

5.电话查询系统的操作与维护:教授学生如何操作和维护电话查询系统,提高他们在实际应用中的操作能力。

三、教学方法为了提高教学效果,本课程将采用以下教学方法:1.讲授法:通过讲解电话查询系统的相关知识,使学生了解电话查询系统的基本原理和应用。

2.案例分析法:分析电话查询系统的实际应用案例,让学生了解电话查询系统的实际价值。

3.实验法:学生进行电话查询系统的实验操作,培养他们运用电话查询系统解决问题的能力。

4.讨论法:学生就电话查询系统的相关问题进行讨论,提高他们分析问题和解决问题的能力。

四、教学资源为了支持本课程的教学,我们将准备以下教学资源:1.教材:选用内容丰富、结构合理的电话查询系统教材,为学生提供系统的学习资料。

数据结构课程设计通讯录、电话号码查询系统

数据结构课程设计通讯录、电话号码查询系统

一、课程设计概述:本次数据结构课程设计共完成两个题:电话号码查询系统、通讯录。

使用语言:C编译环境:VC6.0二、课程设计题目一[实验内容]电话号码查询系统[问题描述]设计散列表实现电话号码查找系统。

[需求分析](1)设每个记录有下列数据项:电话号码、用户名、地址;(2)从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表;(3)采用一定的方法解决冲突;(4)查找并显示给定电话号码的记录;(5)查找并显示给定用户名的记录。

整个系统必须满足系统功能要求;设计不同的散列函数,比较冲突率;在散列函数确定的前提下,尝试各种不同类型处理冲突的方法,考察平均查找长度的变化。

[概要设计]void getin(Record* a) // 键盘输入联系人的信息void ShowInformation(Record* a) //显示输入的用户信息Status collision(int p,int &c) // 冲突处理函数,采用二次探测再散列法解决冲突void CreateHash(HashTable* H ,Record* a) // 建表,若哈希地址冲突,进行冲突处理void SearchHash ( HashTable* H,int &c) //在通讯录里查找关键字void Save() //保存void main_menu()[存储结构]typedef struct{//记录NA name;NA tel;NA add;}Record;typedef struct{//哈希表Record *elem[HASHSIZE]; //数据元素存储基址int count; //当前数据元素个数int size; //当前容量}HashTable;[详细设计]#include<iostream> //cout,cin语句的头文件#include<stdlib.h> //清屏函数头文件:使用csl时调用system#include<string> //字符串头文件#include<stdio.h>#include<fstream>#define MAXSIZE 100 //电话薄记录的数量#define MAX_SIZE 50 //用户名、电话号码、地址的最大长度#define HASHSIZE 400 //定义表长#define SUCCESS 1 //查找#define UNSUCCESS -1#define LEN sizeof(HashTable) // 哈希表的长度using namespace std;typedef int Status;//typedef用来定义类型的别名。

201组课程设计报告

201组课程设计报告

数据结构课程设计报告组号:201设计名称:1)简单个人电话号码查询系统2)哈希表设计《程序设计与算法分析》课程设计报告一、简单个人电话号码查询系统1、需求分析1、程序的功能:实现一个简单的个人电话号码查询系统,根据用户输入的信息进行排序(按电话号码)并且可以进行快速查询(按姓名),同时还可以进行插入、删除、修改等维护功能2、输入输出的要求:电话本中每个人的各项信息需要由键盘进 行输入,应用getch 函数进行输入,printf 函数实现输出。

3、测试数据。

2、概要设计1、存储结构设计说明:应用结构体类型的数组对电话本中的记录进行存储。

struct record {char name[20]; char phone[20]; char mailbox[20]; }people[60];2、程序设计组成框图3、详细设计1、主函数函数功能:对写入文件函数及主菜单函数进行调用。

实现主菜单的显示函数类型:未调用参数,且无返回值。

函数调用关系描述:调用主菜单函数及写入文件函数,实现主菜个人电话本系统 主菜单 文件导入函数 添加记录函数 修改菜单 按姓名修改 删除菜单 删除函数 查找菜单 查找函数 排序菜单 排序函数 显示所有 写入文件单的显示。

2、从文件导入函数函数功能:判断文件是否存在,存在进行导入,不存在进行文件导入。

函数类型:未调用参数,且无返回值。

算法说明(流程图表示)开始是否为输入打开文件失败是否为输出打开文件失败建立失败通讯录已建立返回主菜单退出指针调到文件尾文件当前位置是否大于0返回文件头部,遍历向电话本中写入信息文件导入成功任意键回主菜单文件导入成功,无任何记录,任意键回主菜单返回主菜单否否否是是是从文件导入函数流程图3、主菜单函数 函数功能:输出主菜单,并利用多分枝选择结构调用各功能函数。

函数类型:未调用参数,且无返回值。

算法说明:利用多分枝选择结构实现程序中各程序之间的转换和方便用户进行选择。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、课题任务人们在日常生活中经常要查找某个人或某个单位的电话号码,本实验将实现一个简单的个人电话号码查询系统,根据用户输入的信息(例如姓名等)进行快速查询二、设计要求(1)在外存上,用文件保存电话号码信息;(2)在内存中,设计数据结构存储电话号码信息;(3)提供查询功能:根据姓名或编号实现快速查询;(4)提供其他维护功能,例如插人、删除、修改等。

三、程序的结点设计现假设链表结点仅含有一个数据域和一个指针域。

数据域是为了描述通讯者的相关信息,定义通讯者的结点类型:typedef struct{char num[10]; //编号char name[15]; //姓名char phone[11]; //电话号码}dataType;因此,,线性表的链式存储结构定义如下:typedef struct node{ //结点类型定义dataType data; //结点的数据域struct node *next ; //结点指针域}listnode , * linklist ;linklist head ; //定义指向单链表的头指针listnode * p ; //定义一个指向结点的指针变量四、程序的功能设计创建:创建通讯录文件添加:添加通讯录记录输出:显示通讯录记录删除:删除通讯录记录查找:查询通讯录记录修改:修改通讯录记录保存:将信息保存到文件中五、程序的数据设计该系统用下面六个功能模块编写,每个模块执行不同的功能,体现了模块化设计的思想。

下面六个模块都是利用C语言文件,向文件中追加数据、修改数据、查询数据和删除数据。

建立:可以建立通讯录记录,利用C语言文件,向文件中按顺序输入编号、姓名、电话号码,这里实际上是要求建立一个带头结点的单链表。

添加:可以添加通信录记录,向链表中继续增加结点,但只是输入到内存中,如果要输入到文件中还得调用保存函数。

输出:也是用通过循环依次输出文件中的数据,即输出所有通讯录里的记录。

删除:输入你要删除的人的姓名或编号后,系统会自动删除他的记录,在删除通过switch语句满足提示你确认删除的功能,只有等你确认删除后才会删除。

查询:为了满足用户的实际需求,设计了两种查询方式,可以用姓名、编号两种方式查找通讯录记录。

这里用到strcmp()函数,通过比较字符串是否相同来判别是否找到相关信息,找到后,就把文件中的数据赋给对应的变量,再把变量所带的值输出到屏幕上。

修改:当你选择修改功能后,系统会在修改函数中调用查询函数来找到需要修改的记录,然后返回该记录的结点。

再通过printf语句来显示他的记录,再通过修改查询函数返回的结点来修改所需要修改的记录。

保存:用到fclose()函数,每次操作成功后会自动保存到指定的文件中。

六、程序的函数设计主函数和菜单选择函数部分:int main(){for( ; ; ){switch( menu_select() ){case 1:printf("\t\t\t建立\n\n");head = createlist();break;case 2:printf("\t\t\t添加\n\n");printf("编号姓名电话号码\n");p = ( linklist ) malloc ( sizeof ( listnode ) );scanf ( "%s%s%s" , p->data.num , p-> , p->data.phone ) ; insertnode(head,p);break;case 3:printf("\t\t\t查询\n\n");p = listfind( head );if(p!=NULL){printf("编号姓名电话号码 \n");printf("%s %s %s\n", p->data.num , p->, p->data.phone ); }elseprintf("没有查询到!\n");break;case 4:modify(head);printf("修改成功!\n");printf("请保存!\n");break;case 5:printf("\t\t\t删除\n\n");delnode(head);break;case 6:printf("\t\t\t输出\n\n");printlist(head);break;case 7:save(head);printf("保存成功!\n");system("pause");break;case 0:printf("\t\t\t亲爱的用户,白白了!我会想你的哦 >3<!!!\n\n"); return 0 ;}}return 0 ;}int menu_select(){int n;printf("\t\t\t**********************\n");printf("\t\t\t *********\n");printf ( "\t\t\t个人电话号码查询系统\n");printf ("\t\t\t<== 1 建立 ==>\n");printf ("\t\t\t<== 2 添加 ==>\n");printf ("\t\t\t<== 3 查询 ==>\n");printf ("\t\t\t<== 4 修改 ==>\n");printf ("\t\t\t<== 5 删除 ==>\n");printf ("\t\t\t<== 6 输出 ==>\n");printf ("\t\t\t<== 7 保存 ==>\n");printf ("\t\t\t<== 0 退出 ==>\n");printf ("\t\t\t<== 请选择 ==>\n");printf("\t\t\t *********\n");printf("\t\t\t**********************\n:");for(; ;){scanf ( "%d" , &n );if( n < 0 || n > 7 )printf ("输入错误,请重选:");else break;}return n;}上面主要是主函数和菜单选择函数程序部分,这部分是通过一个无限循环来执行上述所有的功能模块,(用for和switch语句解决),如果用户要退出的话,只需选择“0”就可以成功退出并且自动将数据保存到指定的文件中。

输入变量为n,它作为menu_selet函数的返回值提供给switch语句。

使用for循环实现重复选择,并在主函数中实现。

实际使用时,只有选择0—7才会有用,对于不符合要求的输入,提示输入错并要求重新输入。

创建模块:1..打开存储的文件,若成功打开,则读取已有信息。

2.若打开存储的文件失败,则自己建立一个文件,并且开始输入相应的信息。

建表表完成判断是继续还是离开。

3.打开存储的文件,若成功打开则,则读取已有信息。

4.若打开存储的文件失败,则自己建立一个文件,并且开始输入相应的信息。

建表表完成判断是继续还是离开。

linklist createlist(){linklist createlist(){ //建立if( ( fp = fopen(dir_name,"r") ) != NULL) { // 打开文件linklist head = ( linklist ) malloc ( sizeof ( listnode ) ) ; //动态建立空间listnode * p ,* rear;rear = head ;char a[30] , b[30] , c[30];fscanf( fp ,"%s%s%s\n",a,b,c); //读取"编号姓名电话号码" 这几个汉字while(!feof(fp)){ // 检测文件是否结束不是则继续循环,是则退出p = ( linklist ) malloc ( sizeof ( listnode ) );fscanf ( fp ,"%s%s%s\n",p->data .num ,p->data .name ,p->data .phone ); //读入信息进文档rear->next =p;rear=p;}rear->next =NULL;fclose(fp);printf("成功读取文件记录!\n");return head;}else{printf("不存在记录文件,请自己输入:\n") ;linklist head=( linklist ) malloc ( sizeof ( listnode ) );//申请新结//点listnode *p,*rear ;int flag=0; // 定义一个变量来判断是否循环rear=head;//尾指针初始指向头结点while(flag==0) {p =( linklist ) malloc ( sizeof ( listnode ) );printf("编号姓名电话号码\n");scanf ( "%s%s%s" , p->data.num , p-> , p->data.phone ) ;rear->next = p; // 新结点连结到尾结点之后rear = p; //尾指针指向新结点printf("按1结束建表,按0继续建表。

\n");printf("结束建表吗?(1/0):");scanf ( "%d" , &flag ); //读入一个标志数据}rear->next =NULL; //终端结点指针域置空return head; //返回链表头指}}在这个函数里,首先看文件是否存在,如果存在,就把信息从外存调到内存中来,如果不存在,就会提示不存在记录文件,请自己输入。

相关文档
最新文档