1、用C+编写通讯录课程设计报告课程名称:数据结构与算法设计题目:用散列表建立通讯录系 别:专 业:组 别:起止日期:指导教师:计算机科学与技术系二一 一年制课程设计任务书课程设计题目建立通讯录组长学号班级系别专业组员指导教师课程设计目的(1)熟练掌握C语言的基本知识和技能;(2)基本掌握面向对象程序设计的基本思路和方法;(3)能够利用所学的基本知识和技能,解决简单的程序设计问题。课程设计所需环境Microsoft Visual C+ 6.0课程设计任务要求(1) 设每个记录有下列数据项:、用户名、地址;(2) 从键盘输入各记录,分别以为关键字建立散列表;(3)采用二次探测再散列法解决冲突;(4)
2、查找并显示给定的记录;(5) 通讯录信息文件保存;(6) 要求人机界面友好,使用图形化界面;课程设计工作进度计划序号起止日期工 作 内 容分工情况12调试与操作说明3需求分析4详细代码5引言6总结与体会教研室审核意见:教研室主任签字: 年 月 日一、引言二、需求分析(1)课程设计题目这一组的课程设计题目是用哈希表建立通讯录,并实现语言选单、创建、修改、查询、删除、文件的操作等。(2) 课程设计的目的掌握数据结构的基础技术,学会分析研究计算机加工的数据结构的特性,以便应用涉及的数据选择适当的逻辑结构、存储结构及其相应的算法,应用相关知设计设散列表实现查找系统。(3) 课程设计的要求【基本要求】设
3、每个记录有下列数据项:、用户名、地址;从键盘输入各记录,分别以为关键字建立散列表;采用二次探测再散列法解决冲突;查找并显示给定的记录; 通讯录信息文件保存; 要求人机界面友好,使用图形化界面;【选做内容】系统功能的完善;设计不同的散列函数,比较冲突率;在散列函数确定的前提下,尝试各种不同类型处理冲突的方法,考察平均查找长度的变化。 使用汉字显示。(4)课程设计的主要思想课程设计中,通过不同的选择输入,实现不同的功能。有语言提示,它是通过不同的输入选择不同的语言。在通信录的创建中,把输入的信息保存在一个数组里,通过输入的,将其转化为数据,通过取余,找到它在哈希表的位置,如果位置冲突,就用二次探测
4、处理。在查找中,通过输入的,调用哈希表寻找它在哈希表的位置,并把它输出。同样,修改于删除都是通过同样的的道理找到它在哈希表中的位置。在修改的时候,通过不同的修改选单实现不同的修改,在删除的时候,找到它的位置,在输出的的时候不输出,其实它并没有真正意义的被删除。三、概要设计(1)流程图概括图图 1 概括图创建图 2 创建的流程图查找图 3 查找的流程图修改图4 修改的流程图删除图 5 删除的流程图(2)设计方法及原理主函数里,对不同的子函数,通过的到的不同字符对其进行调用。在建立通讯录中,用了哈希表的建立,在哈希表中,是将字符型数字转化为整形数据,并对哈希表的原有长度取余得到存储的位置,而得到的
5、位置可能已被使用,故有调用了二次哈希,并以最后处理的下标是否为非负,来决定是存储还是不存储。,而在下面的查询、删除、修改中,都是调用哈希表,找到它在哈希表中的位置来进行不同的操作。其中,在删除时,用了一个全局变量来存储要删除的位置的下标,在输出的时候不将其输出,而真正意义上,它并没有从保存的位置删除。在修改中,通过选择不同。来修改不同的信息。这个设计,主要就是对哈希表的调用与冲突的处理。四、详细内容程序代码#include#include#include#include /为了使用getch()方法#include#define MAXSIZE 200 /薄记录数量 #define MAX_S
6、IZE 20 /人名的最大长度#define HASHSIZE 67 /定义表长 #define LEN sizeof(HashTable)typedef int Status;typedef char FRIMAX_SIZE;int ss = 201; /用于帮助删除typedef struct /记录 FRI name; FRI tel; FRI add;Record;typedef struct /哈希表 Record *elemHASHSIZE; /数据元素存储基址 int count; /当前数据元素个数 int size; /最大容量HashTable;void SystemTim
7、e() /显示系统时间 SYSTEMTIME sys; GetLocalTime( &sys );printf(%4d/%02d/%02dn%02d:%02d:%02d.%03d,sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds); void PR1() printf(tt* * * * * * * * * * * * * * * * * * * * * * * *n); SystemTime(); printf(ttt通讯录操作的目录nn); printf(tt* * * *
8、* * * * * * * * * * * * * * * * * * * *nn);void PR11() printf(tt* * * * * * * * * * * * * * * * * * * * * * * *nn); printf(tttDirectories operation directorynn); printf(tt* * * * * * * * * * * * * * * * * * * * * * * *nn);void PR2() printf(t按a键,显示语言提示选单tt); printf(按b键,创建新的通讯录nn); printf(t按c键,在通信录的末尾
9、写入新的信息tt); printf(按d键,查询某人的信息nn); printf(t按e键,修改某人的信息tt); printf(按f键,删除某人的信息nn); printf(t按g键,显示通讯录中的所有记录tt); printf(按h键,退出选单nn); printf(t按i键,保存通讯录中的所有记录到指定文件中nn); printf(t按j键,从指定文件中读取通讯录中的记录n); printf(n友情提示:nt先建立方可进行查找、修改、删除、显示,在从文件读取前,应先存入文件nn); printf(t);void PR22() printf(tPressing a key, Languag
10、e menunn); printf(tPressing b key,Create a new address booknn); printf(tPressing c key,The end of the munication record to write a new ntinformationnn); printf(tPressing d key,Inquires the information. Someonenn); printf(tPressing e key,Modify someones informationnn); printf(tPressing f key,Remove s
11、omeones informationnn); printf(tPressing g key,All the records show directoriesnn); printf(tPressing h key,Exit menunn); printf(tPressing i key,Save all the records to the specified directory filenn); printf(tPressing j key,Read directories from a specified file record innn); printf(nHelpful hints:n
12、tTo create can search, modify, delete, display,in read from the file,); printf(ntshould first before deposit filesnn); printf(t);void PR3() printf(ntt* * * * * * * * * * * * * * * * * * * * * * * *n); SystemTime(); printf(ttt创建通讯录nn); printf(tt* * * * * * * * * * * * * * * * * * * * * * * *nn);void
13、PR4(int i) printf(ntt* * * * * * * * * * * * * * * * * * * * * * * *n); SystemTime(); printf(ttt查询某人的信息nn); printf(tt* * * * * * * * * * * * * * * * * * * * * * * *nn);void PR5() printf(ntt* * * * * * * * * * * * * * * * * * * * * * * *n); SystemTime(); printf(ttt修改某人的信息nn); printf(tt* * * * * * * *
14、 * * * * * * * * * * * * * * * *nn);void PR6() printf(ntt* * * * * * * * * * * * * * * * * * * * * * * *n); SystemTime(); printf(tttt删除某人的信息nn); printf(tt* * * * * * * * * * * * * * * * * * * * * * * *nn);void PR7() printf(ntt* * * * * * * * * * * * * * * * * * * * * * * *n); SystemTime(); printf(tt
15、t 在通信录的末尾写入新的信息nn); printf(tt* * * * * * * * * * * * * * * * * * * * * * * *nn);void PR8() printf(ntt* * * * * * * * * * * * * * * * * * * * * * * *n); SystemTime(); printf(ttt通讯录中已存信息nn); printf(tt* * * * * * * * * * * * * * * * * * * * * * * *nn);void PR9() printf(ntt* * * * * * * * * * * * * * *
16、* * * * * * * * *n); SystemTime(); printf(ttt从文件中读取结果nn); printf(tt* * * * * * * * * * * * * * * * * * * * * * * *nn);void Menu() system(cls); int n; printf(nnnnnnnnnttt输入 1(汉语)、 2(英语) 选择语言: ); scanf(%d,&n); system(cls); if(n = 1) PR1(); PR2(); if(n = 2) PR11(); PR22(); int NUM_BER = 0;int collision
17、(int p,int &c) int a,pp; a = c/2+1; while(a0) return pp; else a = c/2+1; else pp = (p -2*a)%HASHSIZE; c+; if(pp0) return pp; else a = c/2+1; return -1;int HASH(FRI te) /哈希函数 int m; long n; n = atoi(te); m = n%HASHSIZE; return m;void Append() /写入后继内容 system(cls); FILE *fp; FRI pa; PR7(); if(fp = fope
18、n(D:wo.txt,ab+) =NULL) printf(tFile open erroe!); printf(nt输入追加的内容: ); gets(pa); fwrite(pa,sizeof(FRI),1,fp); fclose(fp); printf(nnntt按 Esc 键,返回主菜单);void CreateHash(HashTable *H,Record *a) /以为关键字/ SystemTime(); int i,c,p = -1,pp; for(i=0;ielempp!=NULL) pp = collision(p,c); if(ppelempp = &(ai); H-cou
19、nt+; printf(nttt建表完成!nntt散列表的容量为 %d ,当前容量为 %d ,HASHSIZE,H-count);void getin(Record *a,HashTable *H) /键盘输入个人的信息 system(cls); PR3(); printf(t输入要添加的个数: ); scanf(%d,&NUM_BER); int i; for(i=0;ielempp!=NULL & bj(tel,H-elempp-tel) = 0) pp = collision(p,c); if(H-elempp!=NULL & bj(tel,H-elempp-tel) = 1) prin
20、tf(nttt查找成功nn); printf(tXX: %snnt: %snnt联系地址: %sn,H-elempp-name,H-elempp-tel,H-elempp-add); else printf(nt此人不存在,失败!n); printf(nt按 Esc 键,返回主菜单);void Alter(HashTable* H,int &c) /修改 system(cls); PR5(); fflush(stdin); FRI tel; FRI gai; int p,pp,i; printf(nt输入要修改信息的: ); gets(tel); p = HASH(tel); pp = p;
21、while(H-elempp!=NULL & bj(tel,H-elempp-tel) = 0) pp = collision(p,c); if(H-elempp!=NULL & bj(tel,H-elempp-tel) = 1) printf(nt输入1 , 2来选择修改项【1:修改XX,2:修改地址】: ); scanf(%d,&i); switch(i) case 1 : fflush(stdin); printf(nt输入要修改后的XX: ); gets(gai); strcpy(H-elempp-name,gai); break; case 2: fflush(stdin); pri
22、ntf(nt输入要修改后的地址: ); gets(gai); strcpy(H-elempp-add,gai); break; default: printf(nt输入错误!); else printf(nt此人不存在,失败!n); printf(nnnt按 Esc 键,返回主菜单);void Delete(HashTable *&H,int c,Record *a) /删除 system(cls); PR6(); fflush(stdin); FRI tel; printf(nnt输入要删除的: ); gets(tel); int i = 0; while(strcmp(ai.tel,tel
23、)!=0) i+; ss = i; int p,pp; p = HASH(tel); pp = p; while(H-elempp!=NULL & bj(tel,H-elempp-tel) = 0) pp = collision(p,c); if(H-elempp!=NULL & bj(tel,H-elempp-tel) = 1) H-elempp = NULL; H-count -; printf(nt按 Esc 键,返回主菜单);void List(Record *a,HashTable *H) /输出 system(cls); PR8(); int i; printf(ttXXttt联系
24、地址nn); for(i=0;iNUM_BER;i+) if(i!=ss) printf(tt%st%stt%snn,ai.name,ai.tel,ai.add); printf(nnttt按 Esc 键,返回主菜单);void Save(Record *a) /写入文件 FILE *fp; Record *pp; if(fp=fopen(D:wo.txt, wb)=NULL) printf(nFile open error); pp = a; fwrite(pp,sizeof(Record),NUM_BER,fp); fclose(fp); printf(nt按 Esc 键,返回主菜单); void Load(Record *a) /从文件读取 system(cls); FILE *fp; Record *pp; pp = a; PR9(); if(fp=fopen(D:wo.txt, rb)=NULL) printf(nFile open error); printf(tXXttt联系地址nn); fread(pp,sizeof(Record),NUM_BER,f
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1