实验课程名称 通讯录管理系统 专 业 班 级 10级计科1班 学 生 姓 名
学 号 指 导 教 师
2012至2013学年第 一 学期第 1 至 18 周
1
目 录
第1章 概述 ........................................... 3 1.1现状分析 ................................................................................... 3 1.2实现意义 ................................................................................... 3 第2章 系统分析 ................................................................................ 4 2.1用户需求分析 ........................................................................... 4 2.2管理者需求分析 ....................................................................... 4 第3章 概要设计 ...................................... 5 3.1 主控菜单设计 ........................................................................ 5 3.2 总结构设计流程图 ................................................................. 6 第4章 详细设计 .............................................................................. 6 4.1通讯录建立模块设计 ............................................................... 6 4.2通讯录查询模块设计 ............................................................... 7 4.3通讯录删除模块设计 ............................................................... 7 4.4通讯录链表的输出模块设计 .................................................. 8 第5章 运行与测试 ............................................................................ 9 第6章总结和心得 .............................................................................. 9 参考文献 ............................................................................................ 10 附件(源代码) ................................................................................ 10
2
第1章 概述
1.1现状分析
日益繁多的人际交往使得我们很难记住与每个人之间的联系方式,通讯录能够便捷的给我们带来所需要的相关信息。为了实现通讯录管理的几种操作功能,首先设计一个含有多少个菜单项的主控菜单程序,然后再为这些菜单配上相应的功能。
1.2实现意义
随着计算机的普及,人们的生活摆脱了传统式的记事本、电话簿,越来越多的靠计算机或者手机中的电话簿程序来帮助人们记住这些事情,极其简便。这就需要有一个使用的通讯录管理系统,用户可以方便的通过自己电脑的通讯录管理系统,来随时查阅 自己所需要的信息,而不必再大费周折去翻开那繁琐的记事本。通讯录管理系统是一个专门针对储存用户联系方式以及一些简单个人信息的实用管理系 统,它方便了用户对众多客户、朋友、同事等个人信息的储存和快速查阅的功能,大大减少了 查找过程的时间。然而要靠计算机来记住这些信息,首先就得要求用单链表做数据结构,设计一个实现通讯者信息的输入、查询、删除、输出、等功能的通讯录管理系统。每条通讯者信息包含:编号、姓名、性别、电话号码、地址等信息。
3
第2章 系统分析
2.1用户需求分析
为实现系统功能,本程序主要分为五个模块。它们分别为:输入一个信息、删除一个信息、 查询一个信息、插入一个信息、输出所有的信息、退出该程序。这五个函数再通过主函数调用 分别得以实现。主函数,首先提供了程序运行时的友好界面,列出了清单,提供用户做出选择,以便决定 使用通讯录的哪种功能。然后,通过执行多分支选择语句—switch语句,分别实现其它各个函数的调用功能。界面必须美观简洁能够使人一目了然操作方便。
2.2管理者需求分析
题目要求编写程序实现通讯者通讯录的管理每个同学的通讯录基本信息包括编号、姓名、性别、电话和住址。要求给用户提供功能界面根据用户的选择实现添加、查找、删除、输出某个记录的功能用文件实现基本信息的存储。按照题目要求同学通讯录系统需要实现的功能有添加信息、查找信息、显示信息以及删除信息。并且在通讯录的个人信息中必须包含有编号、姓名、性别、电话号码以及家庭住址。据此要求可以得知本程序必须满足以下要求:
一、首先要有一个基本信息类类中包含有编号、姓名、性别、
4
电话号码以及家庭住址的内容。
二、必须有一个便于操作的菜单实现添加信息、查找信息、显示信息以及删除信息的功能。
三、必须能够实现文件的存取以及修改功能以便于真正的达到同学录记录数据的目的。
第3章 概要设计
根据要求通讯录需要提供文件的输入、输出等操作;还需要保存记录以进行删除、查找等操作,另外还需提供键盘式选择菜单实现选择功能。 3.1 主控菜单设计 系统功能模块图如下:
通讯录管理系统 建立通讯 添加记录 查询记录 删除记录 退出系统
图3.1通讯录管理系统总体结构图
5
3.2 总结构设计流程图
第4章 详细设计
4.1通讯录建立模块设计
linklist createlist(void) {
linklist head=(listnode *)malloc(sizeof(listnode)); listnode *p,*rear; int flag=0; rear=head; while(flag==0)
{p=(listnode *)malloc(sizeof(listnode));
printf(\"编号(4) 姓名(8) 性别(11) 电话(11) 地址(13)\\n\"); printf(\"**********\\n\");
scanf(\"%s%s%s%s%s\r);
rear->next=p; rear=p;
printf(\"结束建表吗?(1/0):\"); scanf(\"%d\
6
}
rear->next=NULL; return head; }
4.2通讯录查询模块设计
listnode *listfind(linklist head) {
listnode *p; char num[5]; char name[9]; int xz;
printf(\"=============\\n\"); printf(\"1 按编号查询\\n\"); printf(\"2按姓名查询\\n\"); printf(\"==========\\n\"); printf(\"请选择\\n\"); p=head->next; scanf(\"%d\ if(xz==1){
printf(\"请输入查找者的编号 \"); scanf(\"%s\
while(p&&strcmp(p->data.num,num)<0) p=p->next;
if(p==NULL||strcmp(p->data.num,num)>0) return p=NULL; else return p;} else
if(xz==2){
printf(\"请输入查找者的姓名 \"); scanf(\"%s\
while(p&&strcmp(p->data.name,name)!=0) p=p->next; return p;} }
4.3通讯录删除模块设计
void delnode(linklist head) {
int j=0;
listnode *p,*q;
7
p=listfind(head);
if(p==NULL) printf(\"没有查到要删除的通讯者\\n\"); printf(\"真的要删除该结点吗?(0/1)\"); scanf(\"%d\ if(j==0){ q=head;
while(q!=NULL&&q->next!=p) q=q->next; q->next=p->next; free(p);
printf(\"通讯者已被删除\\n\"); } }
4.4通讯录链表的输出模块设计
void printlist(linklist head) {
listnode *p; p=head->next;
printf(\"编号 姓名 性别 联系电话 地址\\n\"); printf(\"--------------\\n\"); while(p!=NULL) {
printf(\"%s,%s,%s,%s,%s\\n\addr);
printf(\"--------------\\n\"); p=p->next; } }
8
第5章 运行与测试
第6章 总结和心得
在编代码时,因为不细心的少符号或输入有误而导致花了大量时间去调试,终于调
试对了又发现链接不起,拿到同学电脑上去调试,发现是安装的软件有问题。 在运行监测中第一项:通讯录链表的建立,就出现了有问题,原本要求输入五个参数就能完成起通讯录链表的建立,但是出现要输入六个参数才能完成建立。回去看源代码才发现在输出项中多输了一个%s。接着调试,在通讯者结点的删除中出现了无法删除,经过修改源代码调试后又出现能删除了但是又不能继续往下做了,又进行修改和调试找不出问题所在,没办法找同学帮我看了一下,才发现在通讯者结点的删除代码中没有printf(“通讯者已被删除!\\n)
经过无数次的调试修改终于完成了,感到欣慰,也感到失落,原来不懂的太多太多。
9
参考文献
[1] 数据结构:严蔚敏,吴伟民编著.—北京:清华大学出版社,2007 [2] 数据结构课程设计:苏仕华编著.—北京:清华大学出版社,2002 [3] 数据结构自学辅导:苏仕华编著.—北京:机械工业出版社,2005
附件(源代码)
#include typedef struct node{ datatype data; struct node *next; }listnode; typedef listnode *linklist; linklist head; listnode *p; int menu_select(); linklist createlist(void); void insertnode(linklist head,listnode *p); listnode *listfind(linklist head); void delnode(linklist head); void printlist(linklist head); void main() { for( ; ;){ switch (menu_select()) { case 1: printf(\"**********\\n\"); 10 printf(\"通讯录链表的建立\"); printf(\"**********\\n\"); head=createlist(); break; case 2: printf(\"**********\\n\"); printf(\"通讯者信息的添加\"); printf(\"**********\"); printf(\"编号(4) 姓名(8) 性别(11) 电话(11) 地址(13)\"); printf(\"**********\\n\"); p=(listnode *)malloc(sizeof(listnode)); scanf(\"%s%s%s%s%s\r); insertnode(head,p); break; case 3: printf(\"**********\\n\"); printf(\"通讯者信息的查询\"); printf(\"**********\\n\"); p=listfind(head); if(p!=NULL){ printf(\"编号 姓名 性别 电话 地址\\n \"); printf(\"%s,%s,%s,%s,%s\\n\ata.addr); printf(\"**********\\n\"); } else printf(\"没有查到通讯者!\\n\"); break; case 4: printf(\"**********\\n\"); printf(\"通讯录信息删除\"); printf(\"**********\\n\"); delnode(head); case 5: printf(\"**********\\n\"); printf(\"通讯录信息输出\"); printf(\"**********\\n\"); printlist(head); break; case 0: 11 printf(\"\再见!\\n\"); return; } } } /**********/ int menu_select() { int sn; printf(\"通讯录管理席系统\\n\"); printf(\"===========\\n\"); printf(\"1 通讯录链表的建立\\n\"); printf(\"2 通讯者结点的插入\\n\"); printf(\"3 通讯者结点的查询\\n\"); printf(\"4 通讯者结点的删除\\n\"); printf(\"5 通讯链表的输出\\n\"); printf(\"0 退出管理系统\\n\"); printf(\"===========\\n\"); printf(\" 请选择 0-5\"); for( ; ;) { scanf(\"%d\ if(sn<0||sn>5) printf(\"\\n\输入错误,重选0-5\"); else break; } return sn; } linklist createlist(void) { linklist head=(listnode *)malloc(sizeof(listnode)); listnode *p,*rear; int flag=0; rear=head; while(flag==0) {p=(listnode *)malloc(sizeof(listnode)); printf(\"编号(4) 姓名(8) 性别(11) 电话(11) 地址(13)\\n\"); printf(\"**********\\n\"); scanf(\"%s%s%s%s%s\r); rear->next=p; rear=p; 12 printf(\"结束建表吗?(1/0):\"); scanf(\"%d\ } rear->next=NULL; return head; } void insertnode(linklist head,listnode *p) { listnode *p1,*p2; p1=head; p2=p1->next; while(p2!=NULL&&strcmp(p2->data.num,p->data.num)<0) { p1=p2; p2=p2->next; } p1->next=p; p->next=p2; } listnode *listfind(linklist head) { listnode *p; char num[5]; char name[9]; int xz; printf(\"=============\\n\"); printf(\"1 按编号查询\\n\"); printf(\"2按姓名查询\\n\"); printf(\"==========\\n\"); printf(\"请选择\\n\"); p=head->next; scanf(\"%d\ if(xz==1){ printf(\"请输入查找者的编号 \"); scanf(\"%s\ while(p&&strcmp(p->data.num,num)<0) p=p->next; if(p==NULL||strcmp(p->data.num,num)>0) return p=NULL; else return p;} else if(xz==2){ printf(\"请输入查找者的姓名 \"); scanf(\"%s\ 13 while(p&&strcmp(p->data.name,name)!=0) p=p->next; return p;} } void delnode(linklist head) { int j=0; listnode *p,*q; p=listfind(head); if(p==NULL) printf(\"没有查到要删除的通讯者\\n\"); printf(\"真的要删除该结点吗?(0/1)\"); scanf(\"%d\ if(j==0){ q=head; while(q!=NULL&&q->next!=p) q=q->next; q->next=p->next; free(p); printf(\"通讯者已被删除\\n\"); } } void printlist(linklist head) { listnode *p; p=head->next; printf(\"编号 姓名 性别 联系电话 地址\\n\"); printf(\"--------------\\n\"); while(p!=NULL) { printf(\"%s,%s,%s,%s,%s\\n\addr); printf(\"--------------\\n\"); p=p->next; } } 14 因篇幅问题不能全部显示,请点此查看更多更全内容