通讯录的制作
二○ 届 学院 专 业 学 号 学生姓名 指导教师
完成日期 20 年 月 日
摘 要
该系统的功能是以菜单方式工作,输入密码验证正确进入菜单选择界面,用户通过选择数字来选择:
通讯录的录入功能——输入通讯录基本信息并保存到文件中; 通讯录浏览功能——根据编号排序输出通讯录的基本信息;
通讯录查询功能——按编号查询通讯录信息,按姓名查询通讯录信息; 通讯录删除功能——按编号删除通讯录信息,按姓名删除通讯录信息; 通讯录修改功能——根据编号修改通讯录信息。
从而实现用户的想法。在各项基本功能之下我们可以看到各种小的模块来满足用户的各种需求,达到快速方便的效果。
程序在设计的过程中遇到的问题已及时更正,但由于编者的能力和水平有限,通讯录系统和文档不免出现一些不期待的错误,望文档读者谅解,并欢迎及时提醒和改正,在此表示谢意。
关键词:数据结构; 通讯录系统; 链表
目 录
摘 要 ................................................................................................................................... II 目 录 ................................................................................................................................... I 第1章 引言 ....................................................................................................................... 1 第2章
系统功能需求分析 .......................................................................................... 2
2.1 问题描述:.................................................................................................................... 2 2.2 需求分析 ..................................................................................................................... 2 第3章 概要设计 ............................................................................................................... 3 3.1 抽象数据类型(ADT) ................................................................................................ 3 3.3 系统流程图 ................................................................................................................. 4 第4章 详细设计 ............................................................................................................... 6 4.1 重要程序段1 ............................................................................................................ 6 4.2 重要程序段2 .............................................................................................................. 6 4.3 重要程序段3 .............................................................................................................. 7 4.4 重要程序段4 .............................................................................................................. 7 4.5 重要程序段5 .............................................................................................................. 8 4.6 重要程序段6 .............................................................................................................. 9 第5章 第6章
调试分析 ........................................................................................................ 10 运行结果 ........................................................................................................ 11
附录 ..................................................................................................................................... 15
第1章 引言
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率的算法。数据结构往往同高效的检索算法和索引技术有关。 (简要介绍数据结构课程)
本次课程设计,我们是利用链表来实现通讯录。
本文档从概要设计,详细设计,参考源程序代码以及显示程序运行的截屏等方面详尽的介绍了软件开发过程。
1
第2章 系统功能需求分析
2.1 问题描述:
利用链表,实现下面的功能:
1)设计一个菜单界面用来调用各个功能; 2)输入功能,并保存到文件中;
3)查询功能:a、能够根据学号精确查询学生信息 b、能够根据姓名、学号查询信息 4)根据学号排序输出; 5)根据学号能删除和修改信息
2.2 需求分析
1) 用链表实现本地通讯录管理系统的基本功能,可以实现学生联系人的建立,联系人的查看,通过姓名查找联系人,通过学号查找联系人,通过姓名删除联系人,通过学号删除联系人,保存文件。
2) 用链表实现通讯录是因为用户可以根据自己的需求来实现功能。 3) 链表使程序设计的数据存储更灵活。
4) 通过链表实现的通讯录添加联系人,删除联系人方便。
2
第3章 概要设计
3.1 抽象数据类型(ADT)
ADT LinkList
{ 数据对象:D={ai|ai∈ElemTtpe,i=1,2,…,n,n≥0}
数据关系:R={ (1)Status Appenditem(); 初始条件:链表L已存在 操作结果:添加条目 (2) Status print(); 初始条件:链表L已存在 操作结果:输出条目 (3) Status Finditem1(); 初始条件:链表L已存在 操作结果:查找条目(按姓名) (4) Status Finditem2(); 初始条件:链表L已存在 操作结果:查找条目( 按学号 ) (5) Status Removeitem1(); 初始条件:链表L已存在 操作结果:删除信息(按姓名) (6) Status Removeitem2(); 初始条件:链表L已存在 操作结果:删除信息(按学号) (7) Status Saveandfree(); 3 初始条件:链表L已存在 操作结果:保存到文件 (8) Status Open(); 操作结果:打开文件 (9) Status Showmenu(); 操作结果:出现菜单 (10) Status Modify(); 初始条件:链表L已存在 操作结果:修改信息(编号) } 3.2 存储结构 struct Information { char name[20]; char addrass[20]; char zip[20]; char telephone[20]; char number[20]; struct Information *next; }; 3.3 系统流程图 4 通讯录管理系统 密码登录界面 主菜单选择界面 5 更信模新 息 块 查 询信息 模 块 删信模除 息 块 修信模改 息 块 保存信息并 退出系统 模块 输 入 信 息 根 据 编号 查 询 信 息 根 据 姓名 查 询 信 息 根 据 编号 删 除 职 工 信 息 根 据 编号 删 除 职 工 信 息 根 据 编号 修 改 信 息 将 保存信息并退 出 界 面 显 示 第4章 详细设计 该程序设计用 password()函数登录用户界面, Showmenu()函数显示菜单, Appenditem()函数来添加条目,print()函数来输出条目, Finditem1()函数查找条目(按姓名), Finditem2()函数也是查找条目(按学号),通过Modify()函数来修改信息(按编号),Removeitem1()函数来删除信息(按姓名), Removeitem2()函数也是删除信息(按学号),Saveandfree()函数用来保存到文件存储数据,Open()用来打开文件。 4.1 重要程序段1 Status password() { int w,g=0; char str1[20]={\"123456\ char str2[20]; do { cout<<\"---------------欢迎进入通讯录管理系统----------------\"< Status showmenu() {//菜单 printf(\"\\n*****************通讯录系统*****************\\n\"); printf(\"\1.添加通讯录内容\\n\"); printf(\"\2.通讯录查看列表\\n\"); printf(\"\3.按姓名查询\\n\"); printf(\"\4.按编号查询\\n\"); 6 printf(\"\5.按姓名删除通讯录\\n\"); printf(\"\6.按编号删除通讯录\\n\"); printf(\"\7.按编号修改信息\\n\"); printf(\"\8.保存并退出!\\n\"); printf(\"*************************************************\\n\"); printf(\"\请选择:\"); return OK; } 4.3 重要程序段3 Status Modify1() {//按编号修改信息 Elemtype *p; char findnumber[20]; printf(\"请输入要修改信息的编号:\\n\"); scanf(\"%s\ for(p=head->next;p!=NULL;p=p->next) { if(strcmp(p->number,findnumber)==0) { printf(\"重新输入姓名:\\n\"); scanf(\"%s\ printf(\"重新输入性别:\\n\"); scanf(\"%s\ printf(\"重新输入年龄:\\n\"); scanf(\"%s\ printf(\"重新输入地址:\\n\"); scanf(\"%s\ printf(\"重新输入邮编:\\n\"); scanf(\"%s\ printf(\"重新输入电话:\\n\"); scanf(\"%s\ printf(\"修改信息成功!\"); } } return OK; } 4.4 重要程序段4 Status Appenditem() 7 //修改信息 {//添加条目 Elemtype *p1=NULL,*p2=NULL; p1=(Elemtype *)malloc(sizeof(Elemtype)); //申请结点 printf(\"输入姓名:\\n\"); //添加信息 scanf(\"%s\ printf(\"输入编号:\\n\"); scanf(\"%s\ printf(\"输入性别:\\n\"); scanf(\"%s\ printf(\"输入年龄:\\n\"); scanf(\"%s\ printf(\"输入地址:\\n\"); scanf(\"%s\ printf(\"输入邮编:\\n\"); scanf(\"%s\ printf(\"输入电话:\\n\"); scanf(\"%s\ p1->next=NULL; //保存到链表 if(head==NULL) { head=(Elemtype *)malloc(sizeof(Elemtype)); //申请空间 head->next=p1; } else { for(p2=head;p2->next!=NULL;p2=p2->next); //找到结点尾 p2->next=p1; } printf(\"此信息已添加!\"); return OK; } 4.5 重要程序段5 Status Finditem1() {//查找信息1.按姓名 Elemtype *p; char findname[20]; printf(\"请输入要查找的姓名:\\n\"); scanf(\"%s\ printf(\"**************通讯录系统*********************\\n\"); 8 printf(\"姓名\ 编号\ 性别\ 年龄\ 地址\ 邮编\ 电话\\n\"); for(p=head->next;p!=NULL;p=p->next) { if(strcmp(p->name,findname)==0) printf(\"%s\%s\%s\%s\%s\%s\%s\\n\,p->zip,p->telephone); } return OK; } 4.6 重要程序段6 Status Removeitem1() {//按姓名删除信息 char findname[20]; Elemtype *p=head->next, *pr=head->next; printf(\"请输入要删除的姓名:\\n\"); scanf(\"%s\ if(head->next==NULL) { printf(\"无此节点!\\n\"); return ERROR; } while((strcmp(p->name,findname)!=0)&&p->next!=NULL) //先查找 后删除 { pr=p; p=p->next; } if(strcmp(findname,p->name)==0) //输出删除信息 { printf(\"%s\%s\%s\%s\%s\%s\%s\\n\drass,p->zip,p->telephone); if(p==head->next) head->next=p->next; else pr->next=p->next; free(p); } printf(\"此信息已删除!\\n\"); return OK; } 9 第5章 调试分析 调试程序分析是课程设计必不可少的环节,调试分析可以在程序运行之后发现原来没有出现的问题,以及做进一步的更正,是程序达到预期的目的。 1、问题一:修改通讯录信息时必须要重新输入一遍信息 现象:每次都要从头到尾输入一遍信息 原因:修改信息的程序代码没有详细的分类 2、问题二:通讯录文件读取时会读入其它同文件名的文件 现象:显示错误的通讯录信息 原因:打开文件没有指定具体的文件位置 10 第6章 1、首先进入登录界面,如图1所示。 运行结果 图1 系统登录界面 2、进入通讯录系统界面,如图2所示 图3 通讯录系统界面 3、首先选择2,查看通讯录,此为一个空表,运行结果如图3所示。 11 图3 查看通讯录 4、选择1,添加一条记录,运行结果如图4所示。 图4 添加一条记录 5、再选择2,可看见加入的通讯录,如图5所示 12 图5查看记录 6、选择7修改通讯录信息,如图6所示 图6 修改信息 7、再选择2,可看见修改的通讯录,如图7所示 13 图7 显示修改后的信息 8、选择6删除信息,如图8所示。 14 附录 #include #define OVERFLOW -2 typedef int Status; typedef struct Information {//定义链表 char name[20]; char number[10]; char age[3]; char gender[5]; char addrass[20]; char zip[8]; char telephone[12]; struct Information *next; } Elemtype; Elemtype *head=NULL; Status password(); Status showmenu(); Status Appenditem(); Status print(); Status Finditem1(); Status Finditem2(); Status Removeitem1(); Status Removeitem2(); Status Saveandfree(); Status Open(); Status Modify(); int main() { password(); system(\"cls\"); Open(); while(1) //姓名 //编号 //年龄 //性别 //地址 //邮政编码 //电话号码 //显示菜单 //菜单 //添加条目 //输出条目 //超找条目(按姓名) //查找条目(按编号) //删除信息(按姓名) //删除信息(按编号) //保存到文件 //打开文件 //修改信息(编号) //密码登录 //打开文件 15 { char ch; showmenu(); //显示菜单 scanf(\" %c\ switch(ch) { case '1':Appenditem(); //添加条目 break; case '2':print(); //输出条目 break; case '3':Finditem1(); //查找条目1.按姓名 break; case '4':Finditem2(); //查找条目2.按编号 break; case '5': Removeitem1(); //删除信息(按姓名) print();break; //输出删除后的结果 case '6': Removeitem2(); //删除信息(按编号) print(); break; //输出删除后的结果 case '7':Modify(); //按编号修改信息 break; case '8':Saveandfree(); //保存并释放内存 exit(0); break; //退出 default: printf(\"选择错误!\"); break; } } return OK; } Status password() { int w,g=0; char str1[20]={\"123456\ char str2[20]; do { cout<<\"---------------欢迎进入通讯录管理系统----------------\"< }while(w==0); return OK; } Status showmenu() {//菜单 printf(\"\\n*****************通讯录系统*****************\\n\"); printf(\"\1.添加通讯录内容\\n\"); printf(\"\2.通讯录查看列表\\n\"); printf(\"\3.按姓名查询\\n\"); printf(\"\4.按编号查询\\n\"); printf(\"\5.按姓名删除通讯录\\n\"); printf(\"\6.按编号删除通讯录\\n\"); printf(\"\7.按编号修改信息\\n\"); printf(\"\8.保存并退出!\\n\"); printf(\"*************************************************\\n\"); printf(\"\请选择:\"); return OK; } Status Modify() {//按编号修改信息 Elemtype *p; char findnumber[20]; printf(\"请输入要修改信息的编号:\\n\"); scanf(\"%s\ for(p=head->next;p!=NULL;p=p->next) { if(strcmp(p->number,findnumber)==0) { printf(\"重新输入姓名:\\n\"); //修改信息 scanf(\"%s\ printf(\"重新输入性别:\\n\"); scanf(\"%s\ printf(\"重新输入年龄:\\n\"); scanf(\"%s\ printf(\"重新输入地址:\\n\"); scanf(\"%s\ printf(\"重新输入邮编:\\n\"); scanf(\"%s\ printf(\"重新输入电话:\\n\"); scanf(\"%s\ printf(\"修改信息成功!\"); } } 17 return OK; } Status Appenditem() {//添加条目 Elemtype *p1=NULL,*p2=NULL; p1=(Elemtype *)malloc(sizeof(Elemtype)); //申请结点 printf(\"输入姓名:\\n\"); //添加信息 scanf(\"%s\ printf(\"输入编号:\\n\"); scanf(\"%s\ printf(\"输入性别:\\n\"); scanf(\"%s\ printf(\"输入年龄:\\n\"); scanf(\"%s\ printf(\"输入地址:\\n\"); scanf(\"%s\ printf(\"输入邮编:\\n\"); scanf(\"%s\ printf(\"输入电话:\\n\"); scanf(\"%s\ p1->next=NULL; //保存到链表 if(head==NULL) { head=(Elemtype *)malloc(sizeof(Elemtype)); //申请空间 head->next=p1; } else { for(p2=head;p2->next!=NULL;p2=p2->next); //找到结点尾 p2->next=p1; } printf(\"此信息已添加!\"); return OK; } Status print() {//输出信息 Elemtype *p=NULL; if(head->next!=NULL) { printf(\"**************通讯录系统*********************\\n\"); //输出信息 printf(\"姓名\编号\\性别\年龄\地址\邮编\电话\\n\"); for(p=head->next;p!=NULL;p=p->next) 18 printf(\"%s\%s\%s\%s\%s\%s\%s\\n\,p->zip,p->telephone); } else { printf(\"此通讯录中无记录,请输入记录后再使用本功能!\\n\"); return ERROR; } return OK; } Status Finditem1() {//查找信息1.按姓名 Elemtype *p; char findname[20]; printf(\"请输入要查找的姓名:\\n\"); scanf(\"%s\ printf(\"**************通讯录系统*********************\\n\"); printf(\"姓名\ 编号\ 性别\ 年龄\ 地址\ 邮编\ 电话\\n\"); for(p=head->next;p!=NULL;p=p->next) { if(strcmp(p->name,findname)==0) printf(\"%s\%s\%s\%s\%s\%s\%s\\n\,p->zip,p->telephone); } return OK; } Status Finditem2() {//查找信息2.按编号 Elemtype *p; char findnumber[20]; printf(\"请输入要查找的编号:\\n\"); scanf(\"%s\ printf(\"**************通讯录系统*********************\\n\"); printf(\"姓名\学号\性别\年龄\地址\邮编\电话\\n\"); for(p=head->next;p!=NULL;p=p->next) { if(strcmp(p->number,findnumber)==0) printf(\"%s\%s\%s\%s\%s\%s\%s\\n\,p->zip,p->telephone); } 19 return OK; } Status Removeitem1() {//按姓名删除信息 char findname[20]; Elemtype *p=head->next, *pr=head->next; printf(\"请输入要删除的姓名:\\n\"); scanf(\"%s\ if(head->next==NULL) { printf(\"无此节点!\\n\"); return ERROR; } while((strcmp(p->name,findname)!=0)&&p->next!=NULL) //先查找 后删除 { pr=p; p=p->next; } if(strcmp(findname,p->name)==0) //输出删除信息 { printf(\"%s\%s\%s\%s\%s\%s\%s\\n\drass,p->zip,p->telephone); if(p==head->next) head->next=p->next; else pr->next=p->next; free(p); } printf(\"此信息已删除!\\n\"); return OK; } Status Removeitem2() {//按编号删除信息 char findnumber[20]; //先查找 后删除 Elemtype *p=head->next, *pr=head->next; printf(\"请输入要删除的编号:\\n\"); scanf(\"%s\ if(head==NULL) { printf(\"无此节点!\\n\"); return ERROR; } while((strcmp(p->number,findnumber)!=0)&&p->next!=NULL) { 20 pr=p; p=p->next; } if(strcmp(findnumber,p->number)==0) //输出删除信息 { printf(\"%s\%s\%s\%s\%s\%s\%s\\n\drass,p->zip,p->telephone); if(p==head->next) head->next=p->next; else pr->next=p->next; free(p); } printf(\"此信息已删除!\"); return OK; } Status Saveandfree() {//保存链表信息到文件并释放内存空间 Elemtype *p=NULL; FILE *fp; char *Book=\"books.txt\"; if(head==NULL) { printf(\"\\n记录为空!\\n\"); return ERROR; } else p=head->next; if((fp=fopen(Book,\"wb+\"))==NULL) { printf(\"\\n打不开文件!\\n\"); return ERROR; } while(p!=NULL) //保存信息 { fwrite(p,sizeof(Elemtype),1,fp); p=p->next; } printf(\"保存完毕!\"); fclose(fp); //释放链表空间 for(;head->next!=NULL;) { p=head->next; head->next=head->next->next; free(p); 21 } free(head); return OK; } Status Open() {//文件信息输出到链表 FILE *fp; Elemtype *p1=NULL,*p2=NULL,*temp=NULL; if((fp=fopen(\"books.txt\ { printf(\"\\n****************这是一个新的通讯录管理系统******************\\n\"); return OK; } head=(Elemtype*)malloc(sizeof(Elemtype)); head->next=NULL; temp=p2=head; while(! feof(fp)) //循环读取 { p1=(Elemtype *)malloc(sizeof(Elemtype )); temp=p2; p2->next=p1; p2=p1; fread(p1,sizeof(Elemtype ),1,fp); } temp->next=NULL; fclose(fp); //关闭文件 return OK; } 22 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务