通讯录系统课程设计.docx
- 文档编号:7359964
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:63
- 大小:626.21KB
通讯录系统课程设计.docx
《通讯录系统课程设计.docx》由会员分享,可在线阅读,更多相关《通讯录系统课程设计.docx(63页珍藏版)》请在冰豆网上搜索。
通讯录系统课程设计
1、问题描述
本次课程设计本组选择了生活中最常用的通讯录系统,随着科学时代的发展本组们的手机或者说智能手机更是进入家家户户成为本组们不可取代的一部分。
如下图,本组的手机的界面:
根据看到手机这个界面,本组就想如果可以自己编写一个通讯录系统也是很好的。
于是本组便选择了这个题目,其他的组员也同意了本组想法。
本个系统的问题是要求设计一款通讯录,要求可以实现插入、删除、修改、查询等功能。
但是由于受到了手机分组的提,本组便多加入一个分组存储的功能。
这样更加具体更加方便管理查找联系人。
2、程序分析和设计(流程图、功能设计、界面设计等)
首先,想要设计一款通讯录,本组们要确定他所富含的所有功能,再者是它的操作界面。
当然,流程图也是逻辑思路不能缺少的一部分,这样才能使本组们有更加系统的逻辑思维。
方便本组们编写各个部分的程序。
第一部分是介绍本组们界面设计,这一部分不止才用了一个界面,本组才用了一级界面,二级界面、三级界面。
这一点上,本组主要是参考了很多软件都有界面变化。
但是由于这一块本组也不是很熟悉,所以本组有参考一些相关书籍比如《数据结构(c语言版)》。
借助于现有书籍的程序代码,本组设计了界面。
/*--------一级主菜单-----------*/
voidmenu()
{
inti;
intnum1;//定义num1
printf("\t…………………………#《通讯录》#…………………………\n");//界面
printf("\n");
printf("\n");
printf("\t***亲人:
添加
(1)\t删除
(2)\t排序(3)\t修改(4)\t显示(5)\t查询(6)\t\n****朋友:
添加(7)\t删除(8)\t排序(9)\t修改(10)\t显示(11)\t查询(12)\t\n*****同学添加(13)\t删除(14)\t排序(15)\t修改(16)\t显示(17)\t查询(18)\t\n*****同事:
添加(19)\t删除(20)\t排序(21)\t修改(22)\t显示(23)\t查询(24)\t*****\n");//菜单
printf("\n");
printf("很高兴能为你服务,请输入你的选择(1_24):
");
scanf("%d",&num1);//输入数字
for(i=1;i<24;i++)//for函数重复输入信息
{
if(num1<1||num1>24)
{
printf("老大,拜托!
你输错啦!
");
scanf("%d",&num1);
}
}
switch(num1)//开关函数。
根据输入数字打开相应的函数
{
case1:
Input();//如何解决间断的输入问题
break;
case2:
Delete();//打开删除函数
break;
case3:
Sort();//打开排序函数
break;
case4:
Correct();//修改函数
break;
case5:
Output();//输出已有的联系人情况
break;
case6:
Thirdmenu();//打开第三界面
break;
case7:
Input();//如何解决间断的输入问题
SecondMenu();
break;
case8:
Delete();SecondMenu();//删除函数以及二级菜单
break;
case9:
Sort();SecondMenu();//排序函数以及二级菜单
break;
case10:
Correct();SecondMenu();//修改函数以及二级菜单
break;
case11:
Output();SecondMenu();//输出函数以及二级菜单
break;
case12:
Thirdmenu();//三级菜单
break;
case13:
Input();//如何解决间断的输入问题
SecondMenu();//二级菜单
break;
case14:
Delete();SecondMenu();//删除函数和二级菜单
break;
case15:
Sort();SecondMenu();//排序函数和二级菜单
break;
case16:
Correct();SecondMenu();//修改函数和二级菜单
break;
case17:
Output();SecondMenu();//输出函数和二级菜单
break;
case18:
Thirdmenu();SecondMenu();//三级菜单二级菜单
break;
case19:
Input();//如何解决间断的输入问题
SecondMenu();
break;
case20:
Delete();//删除函数
SecondMenu();//二级界面
break;
case21:
Sort();SecondMenu();//排序函数二级菜单
break;
case22:
Correct();SecondMenu();//修改函数二级菜单
break;
case23:
Output();SecondMenu();//输入函数二级菜单
break;
case24:
Thirdmenu();//三级菜单
break;
}
}
voidSecondMenu()//二级菜单
{
intnum2;
printf("\t-------------------------------------------------------------\n");
printf("\t主菜单(0)*添加
(1)*删除
(2)*排序(3)*修改(4)*显示(5)*查询(6)\n");
printf("\t-------------------------------------------------------------\n");
printf("很高兴再次为你服务,请输入你的选择(1、2、3、4、5、6):
");
scanf("%d",&num2);
if(num2<0||num2>6)
{
printf("老大,拜托!
你输错啦!
");
scanf("%d",&num2);
}
switch(num2)
{
case0:
menu();
break;
case1:
Input();//如何解决间断的输入问题
break;
case2:
Delete();
break;
case3:
Sort();
break;
case4:
Correct();
break;
case5:
Output();
break;
case6:
Thirdmenu();
break;
}
SecondMenu();
}
voidThirdmenu()//三级菜单
{
intnum3;
printf("_______________________________________________________________________________\n");
printf("(0)返回主菜单、
(1)返回上级菜单、
(2)手机号查询、(3)姓名查询、(4)电话号码查询\n");
printf("_______________________________________________________________________________\n");
printf("主人,你想选择怎样的查询方式(0、1、2、3、4):
");
scanf("%d",&num3);
if(num3<0||num3>4)
{
printf("老大,拜托!
你输错啦!
");
scanf("%d",&num3);
}
switch(num3)
{
case0:
menu();
break;
case1:
SecondMenu();
break;
case2:
CellFound();
break;
case3:
NameFound();
break;
case4:
TeleFound();
break;
}
}
——》主界面流程图
——》一级界面
——》显示部分——》添加、删除、修改部分
——》查询部分
流程图部分如上,根据上述流程图的描述,本组们可以基本了解本程序的原理。
但是如要更加详细的了解本程序的各个功能请往下继续浏览。
首先介绍分组功能,之前的问题描述中便提到了这个分组问题,之所以把通讯录首界面设置成“亲人、朋友、同学、同事、其他”的形式。
他的优点是方面储存联系人,而且这样更加便利于查询。
其实,在现实手机的联系人方面,这部分应该是最后加入的,但是由于知识能力有限就把这部分放在了最前面,简单了程序。
再者,是添加、删除、修改联系人功能。
这个功能是最基本的功能,只有成功添加了联系人才能实现以后的功能。
这部分并没有新颖的地方,只是延续了上学期的方法,利用scanf函数输入相关内容。
接下来,本组认为是本程序的一个新颖点——查询联系人。
通常的查询联系人是按首字母。
但是根据手机功能的启发,本组利用了三种方式进行查询——姓名查询、手机号码查询、电话号码查询。
这就有利于一些不能完全记起联系人的信息的人进行查询联系人的详细信息。
总之,想方设法让你找到你想要的信息。
接下来,就是本程序最最关键的部分——算法的实现,先让我们一同回顾一下编写的算法代码:
/*********************************算法实现区域***************************************/
/*******************************************************
初始化单链表:
创建头结点,申请存放数据域和指针域的内存空间
指针域赋为空。
*********************************************************/
voidInitList(Address*&L)
{
L=(Address*)malloc(sizeof(Address));/*创建头结点*/
L->next=NULL;
}
/*********************************************************
销毁线性表
*********************************************************/
voidDestroyList(Address*&L)
{
Address*p=L,*q=p->next;
while(q!
=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
/****************************************************
向单链表中插入信息可以模拟成向通信录中添加联系人
及其详细信息的功能。
*****************************************************/
intListInsert(Address*&L,inti,AddressListe)
{
intj=0;
Address*p=L,*s;
while(j =NULL) { j++; p=p->next; } if(p==NULL)/*未找到第i-1个结点*/ return0; else/*找到第i-1个结点*p*/ { s=(Address*)malloc(sizeof(Address));/*创建新结点*s*/ //s->data=e; strcpy(s->data.name,e.name); strcpy(s->data.sex,e.sex); strcpy(s->data.birthday,e.birthday); strcpy(s->data.cellphone,e.cellphone); strcpy(s->data.telephone,e.telephone); strcpy(s->data.homeaddress,e.homeaddress); strcpy(s->data.QQ,e.QQ); strcpy(s->data.email,e.email); strcpy(s->data.workcity,e.workcity); strcpy(s->data.workspace,e.workspace); s->next=p->next;/*将*s插入到*p之后*/ p->next=s; s->next=NULL;//特别加的 //printf("添加完成! \n"); return1; } } /************************************************************** 输出单链表中的信息,即是显示通信录中的好友信息 ***************************************************************/ voidDispList(Address*L)//显示出现了问题 { Address*p=L->next; while(p! =NULL) { //printf("%c",p->data); printf("\n*************************************\n"); printf("*姓名*: %s\n",p->data.name); printf("*性别*: %s\n",p->data.sex); printf("*生日日期*: %s\n",p->data.birthday); printf("*手机号码*: %s\n",p->data.cellphone); printf("*电话号码*: %s\n",p->data.telephone); printf("*家庭住址*: %s\n",p->data.homeaddress); printf("*QQ号码*: %s\n",p->data.QQ); printf("*电子邮件*: %s\n",p->data.email); printf("*工作单位*: %s\n",p->data.workspace); printf("*工作地址*: %s\n",p->data.workcity); printf("\n*************************************\n"); p=p->next; } printf("\n"); } /**************************************************************** 尾插法建表 *****************************************************************/ voidCreateListR(Address*&L,AddressLista[],intn) { Address*s,*r; inti; L=(Address*)malloc(sizeof(Address)); r=L; for(i=0;i { s=(Address*)malloc(sizeof(Address)); strcpy(s->data.name,a[i].name); strcpy(s->data.sex,a[i].sex); strcpy(s->data.birthday,a[i].birthday); strcpy(s->data.cellphone,a[i].cellphone); strcpy(s->data.telephone,a[i].telephone); strcpy(s->data.homeaddress,a[i].homeaddress); strcpy(s->data.QQ,a[i].QQ); strcpy(s->data.email,a[i].email); strcpy(s->data.workcity,a[i].workcity); strcpy(s->data.workspace,a[i].workspace); r->next=s; r=s; } r->next=NULL; } /*************************************************** 判断线性表是否为空,即是判断通信录中是否有联系人 ****************************************************/ intListEmpty(Address*L) { return(L->next==NULL); } /************************************************** 显示通信录中所有联系人的姓名 ***************************************************/ voidDispName(Address*L) { inti=1; Address*p=L->next; while(p! =NULL) { printf("<%d>.%s\n",i,p->data.name); p=p->next; i=i+1; } printf("\n"); } /*************************************************** 求线性表长度即是求通讯录中联系人个数 ****************************************************/ intListLength(Address*L) { Address*p=L;inti=0; while(p->next! =NULL) { i++; p=p->next; } return(i); } /*********************************************************** 删除单链表中的数据元素可以模拟成删除通信录中 联系人及其所有的详细信息。 **************************************************************/ intListDelete(Address*&L,inti,AddressList&e) { intj=0; Address*p=L,*q; while(j =NULL) { j++; p=p->next; } if(p==NULL)/*未找到第i-1个结点*/ return0; else/*找到第i-1个结点*p*/ { q=p->next;/*q指向要删除的结点*/ if(q==NULL) return0; strcpy(e.name,q->data.name); strcpy(e.sex,q->data.sex); strcpy(e.birthday,q->data.birthday); strcpy(e.cellphone,q->data.birthday); strcpy(e.telephone,q->data.telephone); strcpy(e.homeaddress,q->data.homeaddress); strcpy(e.QQ,q->data.QQ); strcpy(e.email,q->data.email); strcpy(e.workspace,q->data.workspace); strcpy(e.workcity,q->data.workcity); p->next=q->next;/*从单链表中删除*q结点*/ free(q);/*释放*q结点*/ n1=n1-1; return1; } } /************************************************ 知道数据元素在单链表中的位置,相当于知道 通信录中联系人所处的位置。 *************************************************/ intLocateElem1(Address*L,AddressListe) { Address*p=L->next; intn=1; while(p! =NULL&&strcmp(p->data.name,e.name)! =0) { p=p->next; n++; } if(p==NULL) return(0); else return(n); } /************************************************ 知道数据元素在单链表中的位置,相当于知道 通信录中联系人所处的位置。 *************************************************/ intLocateElem2(Address*L,AddressListe) { Address*p=L->next; intn=1; while(p! =NULL&&strcmp(p->data.cellphone,e.cellphone)! =0) { p=p->next; n++; } if(p==NULL) return(0); else return(n); } /************************************************ 知道数据元素在单链表中的位置,相当于知
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通讯录 系统 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)