一.需求分析说明 (1)1.通讯录总体功能要求: (1)2. 各功能模块的功能描述: (1)二.概要设计说明 (3)1.模块调用图: (3)2.各函数简要说明: (3)三.详细设计说明 (4)1.数据结构设计 (4)2.主函数模块 (5)3.密码验证模块 (5)4.输入信息模块 (6)5. 显示信息模块 (7)6.查找模块 (7)7.修改信息模块 (7)8.删除信息模块 (8)9. 信息加载 (8)10.存盘模块 (8)11. 密码修改模块 (8)四.调试分析 (9)1.问题一 (9)2.问题二 (9)3.问题三 (9)五.用户使用说明 (10)六.课程设计总结 (16)七.测试结果 (17)1.测试密码登陆 (17)2.测试输入信息 (17)3.测试显示信息 (18)4.测试查找信息 (18)5.测试修改信息 (19)6.测试删除信息 (19)7.测试加载信息 (20)8.测试存盘 (21)9.测试密码修改 (22)参考书目 (23)附录 (24)一.需求分析说明1.通讯录总体功能要求:在window7系统下用vc6.0开发工具以双向链表作数据结构,编写一个通讯录管理系统。
每条信息包含:姓名(name )街道(street)城市(city)邮编(eip)电话(tel)国家(state)。
此系统具有友好的界面和较强的容错能力。
本系统具有以下几方面的功能:(1).密码验证passWord():通过密码登陆本系统。
(2).输入信息enter():通过键盘输入所需添加信息。
(3).显示信息display( ):显示所有通讯录信息。
(4).查找search( ):以名字为关键字查找用户信息。
(5).修改modify():修改指定的信息。
(6).删除信息del ( ):用户通过输入指定名字找到相关记录然后确定是否删除。
(7).存盘save ( ):把所有用户通过键盘录入的信息或者通过文件加载的信息以文本文件存入硬盘。
(8).装入load( ) :从文本文件加载通讯录信息。
(9).密码修改modpw():由用户自己修改为指定的密码。
2. 各功能模块的功能描述:(1)主函数模块:本模块的主要功能是初始化各种数据,根据用户选择的数字调用对应的模块,实现相应的功能。
(2) 密码验证模块:本模块主要功能是接受用户键入的密码字符,读取已经存好的密码文件,解密后与之比较。
(3)输入信息模块:本模块的主要功能是通过用户再键盘上键入的相关信息存入一个结构体中,然后再把这个结构体作为一个节点加入到双向链表中。
(4)显示信息模块:本模块的主要功能是显示所有在双向链表节点的信息,打印在屏幕上。
(5)查找模块:本模块的主要功能通过用户输入的用户名然后在双向链表中遍历所有的节点看是否有对应的节点,有的话把这个节点的所有信息打印到屏幕上。
(6) 修改信息模块:本模块首先调用查询模块找到相对应的节点,然后由用户选择修改哪项信息。
(7)删除信息模块:本模块首先调用查询模块找到相对应的节点,然后由用户确定是否删除此信息。
(8) 信息加载模块:本模块的是通过吧txl.txt文件中的信息加载到内存中。
(9)存盘模块:本模块的主要功能是把当前双向链表中的所有的节点数据以一个名为txl.txt的文本文件存到与本程序同一文件夹的目录下。
(10)密码修改模块:本模块实现了接受用户新键入的密码字符,然后吧密码字符加密后存入以passWord.txt为文件名的文本文件。
二.概要设计说明1.模块调用图:2.各函数简要说明:int passWord(char *pw) //密码验证txlnode * enter(txlnode *pp,txlnode *head) //信息输入void display(txlnode *head) //显示所有数据txlnode * search2(txlnode *head) //查找通讯录信息(供修改信息和删除信息模块调用)void search(txlnode *head) //查找信息供主函数调用void modify(txlnode *head) //修改信息txlnode * del(txlnode *head) //删除信息txlnode * load(txlnode *pp,txlnode *head) //加载文件void save(txlnode *head) //保存信息int modpw(void) //修改密码三.详细设计说明1.数据结构设计数据结构的设计是具体模块设计的前提。
此处使用循环双向链表来表示通讯录结点。
所谓循环双向链表,是指在单链表的基础上增加一个指针域,使该结点数据域左边的指针指向该结点前面的结点,右边的指针指向其后的结点,最后一个结点的右边指针指向第一个结点。
typedef struct txl //建立通讯录信息结构体{char name[20];char street[32];char city[20];char eip[20];char tel[20]char state[20];}txld; typedef struct dlnode //建立双向链表结构体{txld data;struct dlnode *prior;struct dlnode *next;}txlnode;此处首先定义了结构体txld包含了通讯录的所有信息,然后以这些信息为数据域建立一个双向链表,该链表包含前去指针prior和后继指针next。
2.主函数模块首先定义头结点,为头结点分配一块内存空间,然后调用是接受用户输入的密码调用passWord函数验证密码是否正确正确的话打印出功能菜单选项,运用swith 语句,用户通过选择指定项从而进入相应的功能执行完此项功能后返回,循环显示功能菜单和接受用户的选项,从而在不退出程序的情况下重复使用本系统的各项功能。
(具体实现见附录main函数(P32))。
3.密码验证模块在主函数中通过getchar()得到用户的密码,主函数吧这个参数传递到密码验证模块passWord(),密码验证模块通过读取password.txt中的密文存入数组a[i]中数组中的每一个字符依次通过a[i]-=i%5; a[i]+=i%3; a[i]+=i%2; a[i]++;解密之后与用户输入的字符串进行比较,如果相同则密码正确否则密码错误,当错误次数超过三次后程序自动结束运行。
(具体实现见附录passWord函数(P24))。
4.输入信息模块这个模块由txlnode * enter(txlnode *pp,txlnode *head)实现,形参是两个txlnode结构体指针返回的也是一个txlnode结构体指针,其中形参txlnode *pp 对应的实参是txlnode *p,指针p是指向双向链表的最后一个节点。
形参txlnode *head对应的实参就是在主函数中建立的头结点。
输入模块通过p=(txlnode *)malloc(sizeof(txlnode)); 来申请一块结构体内存空间,再接受用户的输入信息,把相关信息存入结构体中,其中包含的内容有:名字(name),街道(street),城市(city),邮编(eip),电话(tel),国家(state)。
最后把这个结构体作为一个节点从最后插入到双向链表中。
至此链表中增加了一个节点,再询问用户是否继续输入,如继续则重复以上工作,否则返回主模块。
(具体实现见附录enter函数(P25))。
流程图:5. 显示信息模块这个模块由void display(txlnode *head)实现,它首先接受主模块传来的头结点指针,再根据头结点指针找到下一节点,找到后输出节点上的信息包括名字(name),街道(street),城市(city),邮编(eip),电话(tel),国家(state),如果找到的额几点不是头结点则继续上述步骤,否则返回主模块(具体实现见附录display函数(P25))。
6.查找模块这个模块由void search(txlnode *head)实现,这个函数首先接受实参的传来的头节点指针,然后根据指针域找到下个节点,再把节点的中的name与用户输入的字符串相比较,如果不同则继续查找下一节点,找到则输出名字(name),街道(street),城市(city),邮编(eip),电话(tel),国家(state)否则直到回到头结点后输出没有查到此记录,然后回到主函数(具体实现见附录search函数(P26))。
7.修改信息模块这个模块由void modify(txlnode *head)实现,此函数接收主函数传递来的头节点指针,用户以名字为关键字查找姓名,void modify(txlnode *head)函数调用查找函数txlnode * search2(txlnode *head),将查找到的节点指针返回,然后此模块再根据返回的节点提示修改的项目:1名字,2街道,3城市,4邮编,5电话,6国家,根据用户的选择修改相应的项目(具体实现见附录modify函数(P27))。
8.删除信息模块这个模块由txlnode * del(txlnode *pp,txlnode *head)实现,函数中的形参有一个尾指针和一个头结点指针,这个函数通过调用txlnode * search2(txlnode *head),找到相应的节点,然后把这个节点在本双向链表中删除,如果删除的是最后一个节点即尾节点则将指向新的尾节点的指针返回,否则返回原尾指针(具体实现见附录del函数(P28))。
9. 信息加载这个模块由txlnode * load(txlnode *pp,txlnode *head)实现,函数中的形参有一个尾指针和一个头结点指针,其中头结点指针指向从文件中加载第一个节点,后面的节点从文件中一次添加,信息加载完毕后返回最后一个节点的指针(具体实现见附录load函数(P29))。
10.存盘模块这个模块由void save(txlnode *head)实现,函数中中接受的形参是一个指向头结点的指针,根据头结点依次找到后面的节点,每找到一个节点就把这节点的信息写入名为txl.txt的文件中直到回到头结点(具体实现见附录save函数(P30))。
11. 密码修改模块这个模块由int modpw(void)实现,进入函数后它首先是打开passwor.txt文件,然后获得用户的设置新密码的字符串,由于读取文件到数组的时候吧换行符也读入了,所以先去掉数组中的换行符,在依次通过a[i]+=i%5; a[i]-=i%3;a[i]-=i%2;a[i]--;加密后写入到passwor.txt文件中,操作成功后返回1否则返回0(具体实现见附录modpw函数(P31))。