C课程设计报告个人通信录管理系统.docx
《C课程设计报告个人通信录管理系统.docx》由会员分享,可在线阅读,更多相关《C课程设计报告个人通信录管理系统.docx(34页珍藏版)》请在冰豆网上搜索。
C课程设计报告个人通信录管理系统
安徽工业大学
程序实习综合实习报告
课题名称:
个人通讯录管理系统
实习成员:
姓名
学号
贡献率(%)
e-mail
组长
成员
专业班级:
指导教师:
2011年12月10日
课题名称:
个人通讯录管理系统
设计要点:
建立一通讯录,输入姓名、电话号码、住址等信息,然后对通信簿进行显示、查找、添加、修改及删除。
功能要求
(1)通讯录的每一条信息包括姓名、单位、固定电话、移动手机、分类(如同事、朋友、同学、家人等)、EMAIL、QQ等。
(2)输入功能:
可以一次完成若干条信息的输入。
(3)显示功能:
完成全部通讯录信息的显示(一屏最多显示10条,超过十条应能够自动分屏显示)
(4)查找功能:
可以按姓名等多种方式查找通讯信息
(5)增加、删除、修改功能:
完成通讯录信息的多种更新
系统整体设计:
一.主函数设计:
其功能实现从屏幕输出6个选择:
1、添加信息;2、删除信息;3、修改信息;4、查询信息;5、显示信息;6、保存;0、退出程序。
这样,便可以从中选择出一项对通讯录进行操作。
二.信息添加功能设计:
该模块通过Tianjia();函数实现,可以从键盘输入通讯录的各项信息。
三.信息查询功能设计:
该模块通过Chaxun();函数实现,从键盘输入需要查询的姓名或手机号,便可以显示出其他全部信息。
四.信息删除功能设计:
该模块通过Shanchu();函数实现,输入所需要删除人的姓名,便可以从通讯录中删除其全部信息。
五.信息修改功能:
该模块通过Xiugai();函数实现,输入所需要修改人的姓名,屏幕便显示其全部信息,根据提示,输入所需要修改的信息,便完成信息的修改。
六.信息显示功能设计:
该模块通过Xianshi();函数实现,选择信息显示菜单,便可以显示全部通讯录信息。
菜单设计:
系统流程图:
1、添加联系人函数(voidtianjia())
●定义指向结构体的指针;
●移动指针,使其指向最后一个节点,准备插入下一个联系人信息;
●依次输入编号、姓名、固定电话、移动手机、单位、QQ、email、分类;
2、删除联系人函数(voidshanchu(structperson*)
●定义指向结构体的指针;
●检验链表中是否有记录。
若无记录,则返回;
●根据者姓名查找要删除的联系人;
●输入联系人姓名,删除对应结点。
3、修改联系人函数(voidxiugai())
●定义指向结构体的指针;
●检验链表中是否有记录。
若无记录,则返回;
●根据姓名查找要修改的联系人;
●修改信息(可选择是否修改部分信息);
4、查询联系人信息函数(voidfind(structperson*))
●检验链表中是否有记录。
若无记录,则返回;
●根据编号、姓名或固定电话三种方式查找要联系人;
●调用函数在链表中查找相应结点;
●调用显示联系人函数,输出结点信息。
5、显示联系人函数(voidprint())
●定义指向结构体的指针;
●检验是否有记录。
若无记录,则返回;若有记录,移动指针,依次输出记录;
6、保存联系人信息函数(voidsave(structperson*))
●定义指向结构体的指针;
●以读写方式打开一个文本文件;
●若打开错误,则返回;若成功,则逐条输出联系人信息:
●关闭文件;
程序运行结果:
主菜单显示,选择其中一项可对通信录进行操作。
选择添加联系人,依次输入编号、姓名、固定电话、移动手机、单位、email、QQ、分类各个信息。
添加联系人结束后,输入0可返回主菜单。
返回主菜单后,选择5显示所有联系人,便可以查看到已输入的所有的联系人信息。
在主菜单选择4查询联系人,便可以通过1编号查询、2姓名查询、3固定电话查询三种方式查询所要找的联系人的信息。
查询联系人时,当输入有误时,会有提示出现,提示输入有误,请重新输入。
当查询的人的信息在通讯录中不存在时,界面上会显示通讯录中无此人。
当选择主菜单中的3修改联系人时,系统会提示首先通过姓名查找到联系人,输入姓名后,查找到联系人,并显示出来,依次可选择修改除编号以为的其他联系人的信息,选择1是,便可以修改该项信息,2否,则是不修改。
当输入不是1或2而是其他数字时,系统就会提示输入有误,请重新输入。
当在主菜单中选择2删除联系人时,系统会提示1通过姓名删除,输入1时,可通过姓名查找到联系人,便可以进行删除操作,当输入的是0时,则可以返回主菜单。
删除联系人之前,系统会提示是否确定删除联系人,选择1是或2否,当输入其他数字时,系统会提示输入有误,请重新输入。
删除成功后按任意键便可返回主菜单。
完成一切操作后,选择6保存,便可以保存所建立的通讯录。
选择0退出系统,便可以退出本系统。
总结:
在编写代码时,本程序运用的是结构体指针,建立单链表,此部分的内容较难,本程序参考书上的内容和一些资料。
通过本次课程设计,我们认识到自己还存在很多不足,还需要在编程的道路上多经历一些风雨,多编写程序,多多磨练自己。
当我们遇到问题是,需要戒骄戒躁,仔细耐心的检查错误,学会对程序进行调试。
当自己的一个人的能力有限时,应该多问问他人,并且要学会与别人合作,这样便可以为以后自己真正编写大的软件打下一个好的基础。
源代码:
main
#include
#include
#include
#include"printhead.c"
#include"formatprint.c"
#include"chaxun.c"
#include"xianshi.c"
#include"shanchu.c"
#include"tianjia.c"
#include"xiugai.c"
#include"save.c"
/************************************自定义函数说明*********************************/
voidmain();/*主函数*/
structperson*creat();/*创建链表*/
voidtianjia();/*插入一结点,输入联系人信息*/
voidformatprint();/*格式化输出*/
voidprinthead();/*输出表头*/
voidxianshi();/*输出所有单链表中的数据*/
voidxiugai();/*修改通讯记录*/
voidshanchu(structperson*);/*根据编号或者名字分别调用以下两个函数*/
voidshanchuchubyname(structperson*);/*通过姓名删除联系人*/
voidchaxun(structperson*);/*查找功能。
调用后根据查找方式编号或姓名分别调用以下两个函数*/
structperson*chaxunbynum();/*通过编号查找并输出联系人*/
structperson*chaxunbyname();/*通过名字查找并输出联系人*/
structperson*chaxunbyphone();/*通过固定电话查找并输出联系人*/
voidmenu();/*主菜单界面*/
voidbaocun(structperson*);/*数据保存。
若用户没有保存数据但对数据进行了修改,在退出系统时,会提示用户是否保存*/
voidstringinput();/*字符串输入*/
voidmenu()/*主菜单界面*/
{
printf("\3通讯录\3\n\n");
printf("\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3目录\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\n");
printf("\31添加联系人2删除联系人\3\n");
printf("\33修改联系人4查询联系人\3\n");
printf("\35显示所有联系人6保存\3\n");
printf("\30退出系统\3\n");
printf("\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\n");
}
structperson*creat()/*创建链表*/
{
structperson*head;
head=(structperson*)malloc(sizeof(structperson));
if(!
head)
{
printf("\n不能申请到内存空间,返回主菜单\n");
returnNULL;/*返回主菜单*/
}
head->next=NULL;
printf("空间创建成功,您可以使用本系统\n");
return(head);
}
voidmain(void)
{
intselect;/*选择功能变量*/
intselect_saver;/*是否保存变量*/
structperson*head;
head=creat();
system("color52");
while(head)
{
menu();
printf("\n请选择<0~6>:
");
scanf("%d",&select);
if(!
select)
{
if(saver==1)/*若对链表的数据有修改且未进行保存,则此标志为1*/
{
printf("\n是否保存文件?
(1(是)/2(否)):
");
scanf("%d",&select_saver);
while(select_saver!
=1&&select_saver!
=2)
{printf("输入错误,请重新输入!
\n");
printf("\n是否保存文件?
(1(是)/2(否)):
");
scanf("%d",&select_saver);
}
if(select_saver==1)
baocun(head);
}
break;
}
switch(select)
{
case1:
tianjia(head);break;/*添加联系人*/
case2:
shanchu(head);break;/*删除联系人*/
case3:
xiugai(head);break;/*修改联系人*/
case4:
chaxun(head);break;/*查询联系人*/
case5:
xianshi(head);break;/*显示联系人*/
case6:
baocun(head);break;/*保存联系人*/
default:
printf("\n*输入错误!
请重新输入*\n");break;
}
}
system("pause");
}
formatprint
#defineLENGTH_NUM4
#defineLENGTH_NAME10
#defineLENGTH_PHONE10
#defineLENGTH_MOBILEPHONE15
#defineLENGTH_ADDRESS10
#defineLENGTH_EMAIL20
#defineLENGTH_QQ15
#defineLENGTH_KIND10
structperson/*定义结构体类型person*/
{
charnum[LENGTH_NUM];/*联系人编号*/
charname[LENGTH_NAME];/*联系人姓名*/
charphone[LENGTH_PHONE];/*联系人固定电话号码*/
charmobilephone[LENGTH_MOBILEPHONE];/*联系人移动电话*/
charaddress[LENGTH_ADDRESS];/*联系人地址*/
charemail[LENGTH_EMAIL];/*联系人电子邮箱*/
charqq[LENGTH_QQ];/*联系人QQ*/
charkind[LENGTH_KIND];/*联系人分类*/
structperson*next;/*下一个节点*/
};
voidformatprint(structperson*node)/*格式化输出*/
{
structperson*pt=node;
printf(FORMAT,DATA);
}
printhead
#defineHEAD1"-----------------------------所有通讯记录--------------------------------------\n"
#defineHEAD2"|编号|姓名|固定电话|移动手机|单位|邮箱|QQ|分类|\n"
#defineHEAD3"|----|--------|---------|-----------|----|-----------------|-----------|-------|\n"
#defineFORMAT"|%-4s|%-8s|%-9s|%-11s|%-4s|%-17s|%-11s|%-7s\n"
#defineDATApt->num,pt->name,pt->phone,pt->mobilephone,pt->address,pt->email,pt->qq,pt->kind
#defineEND"--------------------------------------------------------------------------------\n"
voidprinthead()/*输出表头*/
{
printf(HEAD1);
printf(HEAD2);
printf(HEAD3);
}
tianjia
voidtianjia(structperson*node)
{
structperson*p,*pt=node,*ptr=node->next;
intflag=0;
charnummber[LENGTH_NUM];
xianshi(node);/*显示已有的联系人信息*/
while(pt->next!
=NULL)/*将指针移指向链表末尾,准备添加联系人*/
pt=pt->next;
while(node)/*可输入多个联系人,直至输入的编号为0时,结束添加联系人*/
{
while(node)
{
stringinput(nummber,LENGTH_NUM,"<按'0'返回主菜单>请输入编号:
");
flag=0;
if(!
strcmp(nummber,"0"))/*若输入为0,则退出添加联系人操作,返回主菜单*/
return;
ptr=node->next;
while(ptr)/*查询该编号是否已经存在,若存在则要求重新输入*/
{
if(!
strcmp(ptr->num,nummber))
{
flag=1;
break;
}
ptr=ptr->next;
}
if(flag==1)/*提示用户是否重新输入*/
printf("编号%s已经存在\n",nummber);
else
break;
}
p=(structperson*)malloc(sizeof(structperson));
if(!
p)
{
printf("\n不能申请到内存空间,返回主菜单\n");
return;
}
strcpy(p->num,nummber);
stringinput(p->name,LENGTH_NAME,"姓名:
");
stringinput(p->phone,LENGTH_PHONE,"固定电话:
");
stringinput(p->mobilephone,LENGTH_MOBILEPHONE,"移动手机:
");
stringinput(p->address,LENGTH_ADDRESS,"单位:
");
stringinput(p->email,LENGTH_EMAIL,"email:
");
stringinput(p->qq,LENGTH_QQ,"QQ:
");
stringinput(p->kind,LENGTH_KIND,"分类:
");
p->next=NULL;/*添加结束*/
pt->next=p;/*将新建的结点接入原链表尾部*/
pt=p;
saver=1;/*数据保存变量被开启,说明对数据进行了修改*/
}
}
shanchu
intsaver;/*是否需要保存的标志全局变量*/
voidshanchu(structperson*node)/*根据名字分别调用以下两个函数*/
{
intm;
voidshanchubyname(structperson*);/*函数声明*/
if(!
node->next)
{
printf("\n无通讯记录!
\n");
return;
}
printf("1:
通过姓名删除,请按1\n");
printf("<返回主菜单,请按'0'>:
");
scanf("%d",&m);/*输入1调用以下函数*/
if(m==1)
shanchubyname(node);/*通过姓名删除联系人*/
elseif(m==0)
return;
else
{printf("输入有误,返回主菜单!
");
return;}
}
voidshanchubyname(structperson*node)/*通过姓名删除联系人*/
{
structperson*p=node,*pt;
intflag;
printf("删除联系人:
\n");
p=chaxunbyname(p);
if(p)
{
printf("确定删除该联系人吗?
(1(是)/2(否))");
scanf("%d",&flag);
while(flag!
=1&&flag!
=2)
{
printf("输入错误,请重新输入!
\n");
printf("确定删除该联系人吗?
(1(是)/2(否))");
scanf("%d",&flag);
}
if(flag==1)
{
pt=node;
while(pt->next!
=p)
pt=pt->next;
pt->next=p->next;
free(p);/*释放p节省空间*/
printf("\n删除联系人成功!
\n");
saver=1;/*数据保存变量被开启,说明对数据进行了修改*/
system("pause");
}
}
}
Chaxun
voidstringinput(char*str,unsignedintlength,char*caution)/*字符串输入*/
{
charstring[255];
do
{
printf(caution);/*提示信息*/
scanf("%s",string);
if(strlen(string)>length)
printf("\n超过指定长度!
请重新输入\n");
}while(strlen(string)>length);
strcpy(str,string);
}
voidchaxun(structperson*node)/*查找功能。
调用后根据查找方式编号或姓名分别调用以下两个函数*/
{
structperson*chaxunbynum(structperson*);/*函数声名*/
structperson*chaxunbyname(structperson*);/*函数声名*/
structperson*chaxunbyphone(structperson*);/*函数声名*/
intm;
if(!
node->next)/*链表为空*/
{
printf("\n无通讯记录!
\n");
return;
}
printf("1:
通过编号查找,请按1\n");
printf("2:
通过姓名查找,请按2\n");
printf("3:
通过固定电话查找,请按3\n");
printf("<返回主菜单,请按'0'>:
");
scanf("%d",&m);/*输入1,2,3分别调用以下两个函数*/
switch(m)
{
case1:
chaxunbynum(node);break;/*通过编号查找并输出联系人*/
case2:
chaxunbyname(node);break;/*通过姓名查找并输出联系人*/
case3:
chaxunbyphone(node);break;/*通过固定电话查找并输出联系人*/
case0:
break;
default:
{
printf("输入错误,请重新输入:
\n");
chaxun(node);
}
}
}
structperson*chaxunbynum(structperson*node)/*通过编号查找并输出联系人*/
{
charnummber[LENGTH_NUM];
structperson*p=node->next;
stringinput(nummber,LENGTH_NUM,"请输入编号:
");
while(p)
{
if(strcmp(p->num,nummber)==0)/*找到nummber对应的编号*/
break;/*跳出*/
p=p->next;
}
printf(HEAD2);
printf(HEAD3);
if(p)
{
formatprint(p);
printf(END);
}
else
printf("\n通讯录中无此人!
\n");
returnp;
}
structperson*chaxunbyname(structperson*node)/*通过名字查找并输出联系人*/
{