1、数据结构课程设计 通讯录管理系统 数据结构C+课程设计题目: 通讯录管理系统 学生姓名: 学 号: 院系: 计算机与信息工程学院 专业年级: 信息安全2010级 2012年6月28日一、设计题目通讯录管理系统实现一个通讯录管理系统。通讯录内容包括姓名及电话、QQ、E_mail四项内容。系统功能包括实现按姓名升序存放通讯录内容,查询某人信息,并在插入或修改一项新的信息后依然保持有序。最后将通讯录信息保存到数据文件中。二、需求分析1)运行环境(软、硬件环境)使用语言:C+软件环境:运行软件Microsoft Visual C+ 6.0 SP6 系统软件 Windows 7 旗舰版2)输入的形式和输
2、入值的范围输入姓名和邮箱为字符型,范围为-128+127输入电话号码和QQ号为整型,范围为-2147483648+21474836473)输出的形式描述程序运行后经过屏幕输出4)功能描述 通讯录内容包括每个人的姓名及电话、QQ、E_mail四项内容;通讯录中的内容按姓名顺序(升序)存放;插入一项新的信息或修改一项信息后通讯录任然有序;查询某人的信息时,如果找到了,则显示该人的信息,如果未找到,则提示通讯录中没有此人的信息;修改某人的信息,如果未找到要修改的人,则提示通讯录中没有此人的信息;删除某人的信息,如果未找到要删除的人,则提示通讯录中没有此人的信息;能显示通讯录中的所有记录;采用菜单操作
3、。通讯录的内容保存到数据文件中。5)测试数据姓名1:smj 电话1:123 QQ:123 邮箱:123姓名2:yyf 电话2:456 QQ:456 邮箱:456姓名3:vigoss 电话3:789 QQ:789 邮箱:789修改用:姓名:cold 电话:1 QQ:1 邮箱:1三、概要设计1)抽象数据类型定义描述(对各类的成员及成员函数进行抽象描述,参见书或ppt及实验)1、student类:成员类型有姓名,电话号码,QQ号及邮箱地址。2、input函数:输入:无前置条件:无功能:添加联系人信息输出:无3.output函数:输入:无前置条件:表存在功能:用来排序并输出所有联系人的信息输出:依次输
4、出联系人信息后置条件:表不变4、友元类AddressBook类:定义头指针,存放数据key5、input函数:输入:无前置条件:无功能:录入函数 输出:无后置条件:若添加成功,表中增加一个新元素,并且写入文件6、find函数:输入:无前置条件:found函数中有功能:子查找函数 输出:当调用删除、修改操作时,如果找到了,则进入find函数找出该联系人的信息;如果未找到,则提示通讯录中没有此人的信息7、found函数:输入:无前置条件:表存在功能:查找函数 输出:当调用查找操作时,如果找到了,则进入find函数找出该联系人的信息;如果未找到,则提示通讯录中没有此人的信息8、del函数:输入:无前
5、置条件:表存在功能:删除函数 输出:如果找到了,则删除该联系人信息,如果未找到,则提示通讯录中没有此人的信息9、show函数:输入:无前置条件:表存在功能:显示函数 输出:依次输出联系人信息10、mend函数:输入:无前置条件:表存在功能:修改函数 输出:如果找到了则显示该联系人信息并修改,如果未找到,则提示通讯录中没有此人的信息11、save函数输入:无前置条件:表存在功能:保存函数 输出:将数据保存到数据文件中12、begin函数:输入:无前置条件:表存在功能:初始化函数 输出:无13、clear函数:输入:无前置条件:表存在功能:清空函数 输出:无14、mainmenu函数:输入:无前置
6、条件:表存在功能:主选菜单函数 输出:无15、main函数:输入:无前置条件:表存在功能:主函数 输出:无2)功能模块设计(如主程序模块设计)1.添加联系人信息模块:void AddressBook:input()2.排序并显示所有联系人信息模块:void AddressBook:show()3.查询联系人信息模块:void AddressBook:find()void AddressBook:found()4.查找并修改联系人信息模块:void book:mend()5.查找并删除联系人信息模块:void book:del()6.联系人信息写入文件模块:void book:save()7.主
7、程序模块:void main()3)模块层次调用关系图四、详细设计实现概要设计中定义的所有的类的定义及类中成员函数,并对主要的模块写出伪码算法。类的定义及类中的成员函数:class student protected: char name20; int tel; int QQ; char E_mail20;public: student *next; student() student() char* getname() return name; void input() coutttt按提示输入:endl; coutname; couttel; coutQQ; coutE_mail; voi
8、d input(ifstream & is) isnametelQQE_mail; is.get(); void output() cout学生基本信息如下:endl; cout 姓名:name 电话:tel QQ:QQ e_mail:E_mailendl; void output(ofstream & os) ossetw(15)name setw(15)tel setw(20)QQ setw(20)E_mail next=NULL; key=0; AddressBook() delete head; void input(); void mend(); void del(); int fi
9、nd(student *p,char *pn=); void found(); void show(); void count(); void save(); void begin(); void clear(); char mainmenu(); int getkey() return key; void setkey(int k) key=k; private: student *head; int key;主要模块的伪码算法:1.添加联系人信息模块:void AddressBook:input() student *p,*p2=NULL; p=head; int n; while(p-n
10、ext) p=p-next; while(n) p2=new student; p2-input(); p-next=p2; p2-next=NULL; p=p-next; AddressBook:setkey(1); coutn; 2.排序并显示所有联系人信息模块:void AddressBook:show() student *p,*q; p=head-next; char temp20; while(p) q=p-next; while(q) if(strcmp(p-name,q-name)=1) strcpy(temp,q-name); strcpy(q-name,p-name); s
11、trcpy(p-name,temp); int temp1; temp1=q-tel; q-tel=p-tel; p-tel=temp1; int temp2; temp2=q-QQ; q-QQ=p-QQ; p-QQ=temp2; char temp320; strcpy(temp3,q-E_mail); strcpy(q-E_mail,p-E_mail); strcpy(p-E_mail,temp3); q=q-next; else q=q-next; p=p-next; student *p1; p1=head-next; while(p1) p1-output(); p1=p1-next
12、; 3.查询联系人信息模块:int AddressBook:find(student *p1,char *pn) student *p; p=head; while(p-next) (*p1)=p; if(!strcmp(p-next)-getname(),pn) ) return 1; p=p-next; return 0;void AddressBook:found() student *p; char name20=; coutname; if(!find(&p,name) ) couttt找不到你要查找的内容!next)-output();4.查找并修改联系人信息模块:void Add
13、ressBook:mend() student *p; char name20=; coutname; if( !find(&p,name) ) couttt找不到你要修改的内容!next)-output(); (p-next)-input(); AddressBook:setkey(1);5.查找并删除联系人信息模块:void AddressBook:del() student *p,*p2; char name; coutname; if( !find(&p,&name) couttt找不到你要删除的内容!next)-output(); p2=p-next; p-next=p2-next;
14、 delete p2; AddressBook:setkey(1);6.联系人信息写入文件模块:void AddressBook:save() student *p; p=head; ofstream os(student.txt,ios:out); if (AddressBook:getkey()=1) while(p-next) (p-next)-output(os); p=p-next; coutttt文件已保存! endl; AddressBook:setkey(0);7.主程序模块:void main() AddressBook pp; int k=1; char n; pp.beg
15、in(); while(k=1) n=pp.mainmenu(); switch(n) case 1:pp.input(); break; case 2:pp.show(); break; case 3:pp.found(); break; case 4:pp.del(); break; case 5:pp.mend(); break; case 6:pp.save(); break; case 0: if(pp.getkey()=1) coutk; if(k=1) pp.save(); pp.clear(); k=0; break; 五、调试分析包括调试过程中遇到的问题及解决的方法、算法的时
16、间空间复杂性分析、经验体会。在调试过程中发现了很多问题,其中包括在实现升序输出的时候,我想运用冒泡排序的方法。起初直接将两个类进行交换,但始终实现不了。经过反复的调试之后,我尝试将类中的“name”、“tel”、“QQ”、“E_mail”分别一次交换,最终实现了升序输出。我的程序中的输入联系人信息函数时间复杂度为O(1),平均空间复杂度为0(n/2),输出联系人信息函数时间复杂度由于有冒泡排序法所以为O(n2),平均空间复杂度为O(n),查询联系人信息函数平均时间复杂度为O(n),查询并修改联系人信息函数平均时间复杂度为O(1),查询并删除联系人信息函数平均时间复杂度为O(1)。调试过程中会有
17、很多的问题,以前遇到问题时我总是显得很茫然不知所措,经过此次课程设计后,我通过逐条错误分析、修改语句,再反复调试,最终达到没有错误顺利运行,从而使我科服了以前的困难,编程和改错能力都有了质的提高。六 用户使用说明详细列出每一步的操作说明。1.添加联系人信息:第一步:打开程序,进入主界面选择菜单。第二步:键盘输入1进入添加联系人程序,按照提示依次输入联系人的姓名、电话、QQ号还有邮箱地址,然后按回车回到主界面选择菜单。2.查询联系人信息(表中有联系人信息为前提,下同):第一步:进入主界面选择菜单。第二步:键盘输入3进入查询联系人信息程序,按照提示输入要查询的联系人姓名,按回车,如果找到了则显示该
18、联系人的信息,如果没有找到则显示“查无此人”,然后按回车回到主界面选择菜单。3.查询并修改联系人信息:第一步:进入主界面选择菜单。第二步:键盘输入5进入查询并修改联系人信息程序,按照提示输入要查询并修改的联系人姓名,按回车,如果找到了则提示输入修改后的信息,然后按照提示依次输入修改后的姓名、电话、QQ号还有邮箱地址,然后按回车回到主界面选择菜单,如果没找到则提示“找不到你要查找的内容”,然后按回车回到主界面选择菜单。4.查询并删除联系人信息:第一步:进入主界面选择菜单。第二步:键盘输入4进入查询并删除联系人信息程序,按照提示输入要查询并修改的联系人姓名,按回车,如果找到了则删除该联系人信息,然
19、后按回车回到主界面选择菜单,如果没找到则提示“找不到你要查找的内容”,然后按回车回到主界面选择菜单。5.排序并显示所有联系人信息:第一步:进入主界面选择菜单。第二步:键盘输入2进入排序并显示所有联系人信息程序,然后便会得到按照姓名升序排列以后所有联系人的信息,然后按回车回到主界面选择菜单。6.保存联系人信息第一步:进入主界面选择菜单。第二步:键盘输入6进入查询联系人信息程序,按照提示将数据存入“student.txt”文件,输入的内容已保存在此文件内。7.关闭通讯录:第一步:进入主界面选择菜单。第二步:键盘输入0则关闭通讯录,再按一下任意一个键则退出程序窗口。七、 测试结果1.主界面选择菜单:
20、2.添加新联系人:3.查询联系人信息:如果表中有联系人信息:如果表中有联系人信息但没有匹配的姓名:4.查询并修改联系人信息:如果表中有联系人信息且有相匹配的姓名:如果表中没有联系人信息:5.查询并删除联系人信息:如果表中有联系人信息且有相匹配的姓名:如果表中没有联系人信息:6.排序并显示所有联系人信息:7.联系人信息写入文件:八、附录:程序设计源代码#include#include#include#include#include#include using namespace std;class student protected: char name20; int tel; int QQ;
21、char E_mail20;public: student *next; student() student() char* getname() return name; void input() coutttt按提示输入:endl; coutname; couttel; coutQQ; coutE_mail; void input(ifstream & is) isnametelQQE_mail; is.get(); void output() cout学生基本信息如下:endl; cout 姓名:name 电话:tel QQ:QQ e_mail:E_mailendl; void outpu
22、t(ofstream & os) ossetw(15)name setw(15)tel setw(20)QQ setw(20)E_mail next=NULL; key=0; AddressBook() delete head; void input(); void mend(); void del(); int find(student *p,char *pn=); void found(); void show(); void count(); void save(); void begin(); void clear(); char mainmenu(); int getkey() re
23、turn key; void setkey(int k) key=k; private: student *head; int key;/录入函数void AddressBook:input() student *p,*p2=NULL; p=head; int n; while(p-next) p=p-next; while(n) p2=new student; p2-input(); p-next=p2; p2-next=NULL; p=p-next; AddressBook:setkey(1); coutn; /子查找函数int AddressBook:find(student *p1,c
24、har *pn) student *p; p=head; while(p-next) (*p1)=p; if(!strcmp(p-next-getname(),pn) return 1; p=p-next; return 0;/查找函数void AddressBook:found() student *p; char name20=; coutname; if(!find(&p,name) ) couttt找不到你要查找的内容!next)-output();/删除函数void AddressBook:del() student *p,*p2; char name20; coutname;/ coutstrlen(name); if( !find(&p,name) couttt找不到你要删除的内容!next)-output(); p2=p-next; p-next=p2-next; delete p2; AddressBook:setkey(1);/显示函数void AddressBook:show() student *p,*q; p=
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1