软件工程通讯录查询系统.doc

上传人:w****2 文档编号:6612218 上传时间:2020-02-29 格式:DOC 页数:36 大小:810.50KB
返回 下载 相关 举报
软件工程通讯录查询系统.doc_第1页
第1页 / 共36页
软件工程通讯录查询系统.doc_第2页
第2页 / 共36页
软件工程通讯录查询系统.doc_第3页
第3页 / 共36页
点击查看更多>>
资源描述
数据结构课程设计报告 计算机学院软件工程专业题目: 通信录查询系统(查找应用)班级:软件102班 第11组 组长: 姓名:李伟 学号:1006550222组员:姓名:李呢 学号:1006550219姓名:李强 学号:1006550221 指导老师:xxx 日期:2011 年 12月 30日程序设计书目录一、程序设计目标二、问题描述三、需求分析(说明课程设计的任务)四、概要设计(说明课程设计中用到的抽象数据类型的定义、主程序的流程以及各程序模块之间的调用关系等)五、详细设计(实现程序模块的具体算法)六、软件说明书(给出软件应如何使用,使用时的注意事项)七、源程序清单(要求400行以上,要有注释说明)八、测试报告(调试过程中遇到的问题及解决方法,并列出测试结果,包括输入和输出) 九、课程设计总结一、 程序设计目标通过本次课设进一步的了解哈希表函数及哈希表等有关概念,掌握哈希表查找的过程及方法。复习巩固大一时期学过的c语言知识。进一步加深对c语言、数据结构、离散数学等基础技能的理解和掌握。让我们有一个既动手又动脑,独立实践的机会,可以让我们将课本上的理论知识和实际邮寄的结合起来,锻炼我们的分析解决实际问题的能力。提高我们实践编程能力。通过本项课程设计,掌握工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相 结合的难关!更加了解了c语言的好处和其可用性!同时增加了同学之间的团队合作精神!更加也体会到以后在工作中团队合作的重要性和必要性!通过C语言课程设计,使学生了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级语言程序设计能力。为后续各门计算机课程的学习和毕业设计打下坚实基础。二、问题描述设计散列表实现通讯录查找系统。(1) 设每个记录有下列数据项:电话号码、用户名、地址;(2) 从键盘输入各记录,分别以电话号码为关键字建立散列表;(3) 采用二次探测再散列法解决冲突;(4) 查找并显示给定电话号码的记录;(5) 通讯录信息文件保存;(6) 要求人机界面友好,使用图形化界面;三、 需求分析一.查询:用户有一个电话号码,但不知道此电话号码是谁的,则需要输入号码来查询该号码是不是此通讯录中已记录的人的号码,若是即显示该号码及姓名、所在地,若不是则显示“无记录”。进入主菜单界面,输入4,进入通讯录查询模块。输入你想要搜索通讯人的电话号码。屏幕输出所搜通讯人的先关信息。二.通讯录信息添加:若要向通讯录中添加新号码,也分两种情况:1若该通讯录是新的,既没有任何通讯记录的,则直接往里添加,需先输入姓名,随即输入号码和所在地,用于存储。2若通讯录不是空的,再添加新号码时则需在最后一个号码后面进行添加(输入姓名、电话号码及所在地),以此类推。进入主菜单,输入1,进入通讯录信息添加模块。按照要求依次输入姓名、电话号码、住址。三.通讯录信息删除:若要对通讯录中的内容进行删除:然后输入所要删除的号码进行删除删除成功。出现提示信息。按任意键回到主菜单。 四、 概要设计对功能键相对应的函数分别对各个函数在程序中进行定义如下: void Menu() void Create() void Append() void CreateHash() void Find() void Delete() void Alter() void List() void Save() void Load()然后根据各功能键的选择主函数分别调用功能键相对应的函数来实现通讯录的查询系统。五、详细设计1、 定义结构体变量 typedef struct people /记录 NA name; NA tel; /关键字 NA add;Record; /查找表中记录类型typedef struct /建立哈希表 Record *elemHASHSIZE; /数据元素存储基址 int count; /当前数据元素个数 int size; /当前容量HashTable; 2、 定义显示函数void Menu() 3、 定义建立时间的函数void benGetTime() 4、 定义创建新的通讯录并添加信息的函数void Create(Record* a) 5、 定义关键字比较函数Status eq(NA x,NA y) 6、 定义添加信息函数void Append(Record* a) 7、 定义显示通讯录中所有信息函数void List(Record* a)8、 定义哈希函数int Hash(NA str) 9、 定义冲突处理函数Status collision(int p,int &c) 10、 定义建立散列表的函数void CreateHash(HashTable* H,Record* a) 11、 定义通讯录查找的函数void Find(HashTable* H,int &c) 12、 定义修改信息的函数void Alter(HashTable* H,int &c) 13、 定义删除信息的函数void Delete(HashTable* H,int &c) 14、 定义保存信息到指定文件的函数void Save(HashTable* H) 15、 定义从指定文件中读取信息的函数void Load()16、 定义主函数int main(int argc, char* argv) system(color FO); system(CLS); int c,flag=1; HashTable *H; H=(HashTable*)malloc(LEN); for(int i=0;ielemi=NULL; H-size=HASHSIZE; H-count=0; Record aMAXSIZE; donghua(); while (1) face(); printf(请输入一个任务选项); printf(n); int num; scanf(%d,&num);getchar(); switch(num) case 1:Create(a) ;break; case 2:Append(a);break; case 3:CreateHash(H,a);break; case 4:c=0;Find(H,c);break; case 5:c=0;Delete(H,c);break; case 6:c=0;Alter(H,c);break; case 7:List(a);break; case 8:Save(H);break; case 9:Load() ; break; case 0:Quit() ; return 0; break; case 10:;break; default: printf(你输错了,请重新输入!); printf(n); system(CLS); return 0; 六、软件说明书双击程序,程序运行后,进入通信录查询系统菜单的操作界面,然后采用键盘进行操作。各功能键的选择如下:1、创建新的通讯录并写入新的信息2、添加某人的信息3、以电话号码建立散列表4、查找并显示给定电话号码的记录5、删除某人的信息6、修改某人的信息7、显示通讯录中所有记录8、保存通讯录所有记录到指定文件9、从指定文件中读取通讯录中的记录0、退出选单选择1,建立新的通讯录,通讯录创建成功,按Enter键进入添加信息界面,界面会出现根据系统提示进行相应的添写,添加成功之后,按Enter键返回主菜单。选择2,在通讯录的末尾写入新的信息,与上诉添加信息操作相同。同样按Enter键返回主菜单。选择3,会立即调用冲突处理函数以及建立散列表,界面上会显示冲突次数,哈希表容量和当前储存记录的个数,按Enter键返回主菜单。3功能键必须在4、5、6功能键之前选择,才能使4、5、6功能键派上用场。选择4,查找某人信息,写入查找的电话号码,如果通讯录中有则会出现查找成功否则出现此人不存在,查找不成功。按Enter键返回主菜单。选择5,删除某人信息,写入删除的电话号码,如果通讯录中有则会出现删除成功否则出现此人不存在,删除不成功。按Enter键返回主菜单。选择6,修改某人信息,写入修改的电话号码,通过查找函数找到要修改的信息,在对找的的信息进行修改,如果通讯录中有则会出现原信息让用户输入修改后的信息,根据系统的提示输入修改后的信息,按Enter键会出现修改成功,否则出现此人不存在,修改不成功。按Enter键返回主菜单。选择7,界面会输出全部成员的信息。按Enter键返回主菜单。选择8,利用存盘函数保存数据到指定文件,界面会出现保存成功,按Enter键返回主菜单。选择9,载入存储过的电话、姓名、地址,界面会出现指定文件所存储的所有信息。按Enter键返回主菜单。选择0,显示再见,按Enter键退出系统。七、源程序清单#include#include #include #include #include #include using namespace std; #define MAXSIZE 20 /电话薄记录数量 #define MAX_SIZE 20 /人名的最大长度#define HASHSIZE 60 /定义表长 #define SUCCESS 1#define UNSUCCESS -1#define LEN sizeof(HashTable) /为建立的对象定义长度typedef int Status; /为现有类型添加一个同义字typedef char NAMAX_SIZE; / typedef 掩饰数组类型static int m=0;typedef struct people /记录 NA name; NA tel; /关键字 NA add;Record; /查找表中记录类型typedef struct /建立哈希表 Record *elemHASHSIZE; /数据元素存储基址 int count; /当前数据元素个数 int size; /当前容量HashTable; int i; void Menu() printf( #n);printf( # ttt ttt #n);printf( # ttt 丨 1.创建 丨 # n);printf( # ttt #n);printf( # ttt 丨 2.写入 丨 #n);printf( # ttt #n);printf( # ttt 丨 3.建表 丨 #n);printf( # ttt #n);printf( # ttt 丨 4.查找 丨 #n);printf( # ttt #n);printf( # ttt 丨 5.删除 丨 #n);printf( # ttt #n);printf( # ttt 丨 6.修改 丨 #n);printf( # ttt #n);printf( # ttt 丨 7.查看 丨 #n);printf( # ttt #n);printf( # ttt 丨 8.保存 丨 #n);printf( # ttt #n);printf( # ttt 丨 9.读取 丨 #n);printf( # ttt #n);printf( # ttt 丨 0.退出 丨 #n);printf( # ttt #n);printf( #n);void benGetTime() /建立时间函数 SYSTEMTIME sys; GetLocalTime( &sys ); printf( %4d/%02d/%02d %02d:%02d:%02d.%03d n,sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds); Status NUM_BER; /记录的个数Status NUM_BER1; void Create(Record* a) /创建新的通讯录system(CLS); /调用DOS命令CLS能够清屏FILE *fp1,*fp2;if(fp1=fopen(record.txt,r)!=NULL) /打开文件 fclose(fp1); /关闭文件elsefp2=fopen(record.txt,w); /如果不存在record.txt就创建一个 fclose(fp2);printf(n); printf(#n); printf(= 创建成功 =n);printf(#n);printf(n); printf(请按ENTER进入添加通讯信息菜单n); getchar(); system(CLS); system(CLS); /调用DOS命令CLS能够清屏 printf(#n); printf(= 用户信息记录表 =n); printf(#n); printf(输入要添加的个数:n); scanf(%d,&NUM_BER); for(i=0;iNUM_BER;i+) printf(请输入第%d个记录的用户名:n,i+1); scanf(%s,ai.name); printf(请输入%d个记录的电话号码:n,i+1); scanf(%s,ai.tel); printf(请输入第%d个记录的地址:n,i+1); scanf(%s,ai.add); getchar(); printf(#n); printf(添加成功!n); benGetTime(); printf(n); printf(请按ENTER返回功能操作菜单n); printf(#n); getchar();Status eq(NA x,NA y) /关键字比较,相等返回SUCCESS;否则返回UNSUCCESS if(strcmp(x,y)=0) return SUCCESS; else return UNSUCCESS;void Append(Record* a) /键盘输入各人的信息 system(CLS); /调用DOS命令CLS能够清屏 printf(#n); printf(= 用户信息记录表 =n); printf(#n); printf(输入要添加的个数:n); scanf(%d,&NUM_BER1); int j=i; for(i;ij+NUM_BER1;i+) printf(请输入第%d个记录的用户名:n,i+1); scanf(%s,ai.name); printf(请输入%d个记录的电话号码:n,i+1); scanf(%s,ai.tel); printf(请输入第%d个记录的地址:n,i+1); scanf(%s,ai.add); getchar(); printf(#n); printf(添加成功!n); benGetTime(); printf(n); printf(请按ENTER返回功能操作菜单n); printf(#n); getchar();void List(Record* a) /显示通讯录中所有记录 Record *p; p=a;int i; system(CLS); /调用DOS命令CLS能够清屏 printf(#n); printf(= 用户信息记录表 =n); printf(#n); if(a!=NULL) printf(nn姓名t电话号tt地址n); printf(_n); for( i=0;iNUM_BER+NUM_BER1-m;i+) printf(%st%stt%sn,ai.name,ai.tel,ai.add); printf(_n); else printf(对不起!没有任何联系人记录!nn); printf(=n); benGetTime(); printf(#n); printf(请按ENTER返回功能操作菜单n); printf(#n); getchar(); int Hash(NA str) /哈希函数 system(CLS); /调用DOS命令CLS能够清屏 long n; int m; n = atoi(str); /把字符串转换成整型数. m=n%HASHSIZE; /用除留余数法构造哈希函数 return m; /并返回模值Status collision(int p,int &c) /冲突处理函数,采用二次探测再散列法解决冲突 int i,q; i=c/2+1; while(i=0) return q; else i=c/2+1; else q=(p-i*i)%HASHSIZE; c+; if(q=0) return q; else i=c/2+1; return UNSUCCESS;void CreateHash(HashTable* H,Record* a) /建表,以电话号码为关键字,建立相应的散列表 system(CLS); /调用DOS命令CLS能够清屏 int i,p=-1,c,pp; for(i=0;ielempp!=NULL) pp=collision(p,c); /若哈希地址冲突,进行冲突处理 if(ppelempp=&(ai); /求得哈希地址,将信息存入 H-count+; printf(#n); printf(= 用户信息记录表 =n); printf(#n); printf(第%d个记录冲突次数为%d。n,i+1,c); /需要显示冲突次数时输出 printf(n建表完成!n此哈希表容量为%d,当前表内存储的记录个数为%d.n,HASHSIZE,H-count); benGetTime(); printf(#n); printf(请按ENTER返回功能操作菜单n); printf(#n); getchar();void Find(HashTable* H,int &c) /在通讯录里查找电话号码关键字,若查找成功,显示信息 system(CLS); /调用DOS命令CLS能够清屏 printf(#n); printf(= 用户信息记录表 =n); printf(#n); benGetTime(); NA tele; printf(n请输入要查找记录的电话号码:n); scanf(%s,tele); int p,pp; p=Hash(tele); pp=p; while(H-elempp!=NULL)&(eq(tele,H-elempp-tel)=-1) pp=collision(p,c); if(H-elempp!=NULL&eq(tele,H-elempp-tel)=1) printf(#n); printf(= 用户信息记录表 =n); printf(#n); printf(n查找成功!n查找过程冲突次数为%d以下是您需要要查找的信息:nn,c); / printf(姓 名:%sn电话号码:%sn联系地址:%sn,H-elempp-name,H-elempp-tel,H-elempp-add); printf(nn姓名t电话号tt地址n); printf(_n); printf(%st%stt%sn,H-elempp-name,H-elempp-tel,H-elempp-add); printf(_n); else printf(n此人不存在,查找不成功!n); benGetTime(); getchar(); printf(#n); printf(请按ENTER返回功能操作菜单n); printf(#n); getchar();void Alter(HashTable* H,int &c) /在通讯录里修改某人信息 system(CLS); /调用DOS命令CLS能够清屏 printf(#n); printf(= 用户信息记录表 =n); printf(#n); benGetTime(); NA tele; printf(n请输入要修改记录的电话号码:n); scanf(%s,tele); int p,pp; p=Hash(tele); pp=p; while(H-elempp!=NULL)&(eq(tele,H-elempp-tel)=-1) pp=collision(p,c); if(H-elempp!=NULL&eq(tele,H-elempp-tel)=1) printf(#n); printf(= 用户信息记录表 =n); printf(#n); printf(n以下是您需要修改的信息:); printf(n); printf(nn姓名t电话号tt地址n); printf(_n); printf(%st%stt%sn,H-elempp-name,H-elempp-tel,H-elempp-add); printf(_n); (H-elem)pp-tel0=0; printf(请输入修改后记录的用户名:n); scanf(%s,H-elempp-name); printf(请输入修改后记录的电话号码:n); scanf(%s,H-elempp-tel); printf(请输入修改后记录的地址:n); scanf(%s,H-elempp-add); printf(修改成功!); else printf(#n); printf(= 用户信息记录表 =n); printf(#n);benGetTime(); printf(n此人不存在,修改不成功!n); getchar(); printf(#n); printf(请按ENTER返回功能操作菜单n); printf(#n); getchar();void Delete(HashTable* H,int &c) /在通讯录里查找电话号码关键字,若查找成功,显示信息然后删除 system(CLS); /调用DOS命令CLS能够清屏 printf(#n); printf(= 用户信息记录表 =n); printf(#n); benGetTime(); NA tele; printf(n请输入要删除记录的电话号码:n); m+; scanf(%s,tele); int p,pp; p=Hash(tele); pp=p; while(H-elempp!=NULL)&(eq(tele,H-elempp-tel)=-1) pp=collision(p,c); if(H-elempp!=NULL&eq(tele,H-elempp-tel)=1) printf(#n); printf(= 用户信息记录表 =n); printf(#n); printf(n以下是您需要要删除的信息:nn,c);printf(nn姓名t电话号tt地址n); printf(_n); printf(%st%stt%sn,H-elempp-name,H-elempp-tel,H-elempp-add);printf(_n);printf(n);(H-elem)pp-tel0=0;printf(删除成功!); else printf(n此人不存在,删除不成功!n); benGetTime(); getchar(); printf(#n); printf(请按ENTER返回功能操作菜单n); printf(#n); getchar();void Save(HashTable * H) /将记录保存到指定文件system(CLS); FILE* fp;if(fp=fopen(record.txt,w)!=NULL)fprintf(fp,#
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑环境 > 建筑工程


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!