通讯录管理系统.docx
《通讯录管理系统.docx》由会员分享,可在线阅读,更多相关《通讯录管理系统.docx(23页珍藏版)》请在冰豆网上搜索。
通讯录管理系统
通讯录管理系统
测试与光电工程学院
课程设计任务书
测控技术与仪器系******班学号*********姓名邓志扬
课题名称:
通讯录管理系统的设计
课题要求:
使用C语言设计一个班级通讯录,通迅录数据信息构成内容可自行设计(如:
姓名、邮政编码、电话号码等等),通信录数据类型定义为结构体类型或用数组实现。
要求实现存取、显示、删除记录、查询记录等功能。
(1)查看功能,选择此功能是列出下列三类选择
A、办公类B、个人类C、商务类当选中某类时,显示出此类中所有数据中的姓名和电话号码
(2)增加功能能录入新数据(一个节点包括姓名,电话号码,分类(可选项有:
A、办公类,B、个人类,C、商务类)、电子邮件)
例如:
杨春187****0276商务类****************
当录入了重复的姓名和电话号码时,则提示数据录入重复并取消录入,当通讯录中超过15条信息时,存储空间已满,不能自录入新数据了。
(3)拨号功能能显示出通讯录中所有人的姓名,当选中某个人的姓名时,屏幕中模拟打字机的效果依次显示出此人的电话号码中的各个数字,并伴随相应的拨号声音
(4)修改功能选中某个人的姓名时,可对此人的数据进行相应修改
(5)删除功能选中某个人的姓名时可对此人的相应数据进行删除并自动调整后续条目的编号
课题进程:
1)回顾C语言设计及数据结构设计的相关知识。
2周
2)设计基本架构。
4周
3)调试、完善、撰写报告。
3周
主要参考资料:
[1]谭浩强主编.C语言程序设计(第二版).清华大学出版社,2005.
[2]谭浩强.C程序设计题解与上机指导(第三版)[M]北京:
清华大学出版社,2005年7月
指导教师:
付跃文
摘要:
日益繁多的人际交往使得我们很难搞清楚与每个人之间的联系方式,特别是对于做经常出差的人来说更是难,所以通讯录能够便捷的给我们带来所需要的相关信息。
而随着计算机的普及,人们的生活摆脱了传统式的记事本、电话簿,越来越多的靠计算机来帮助人们记住这些事情,极其简便。
这就需要有一个使用的通讯录管理系统,用户可以方便的通过自己电脑的通讯录管理系统,来随时查阅自己所需要的信息,而不必再大费周折去翻开那繁琐的记事本。
通讯录管理系统是一个专门针对储存用户联系方式以及一些简单个人信息的实用管理系统,它方便了用户对众多客户、朋友、同事等个人信息的储存和快速查阅的功能,大大减少了查找过程的时间。
关键字:
C语言通讯录函数
指导老师签名:
一、设计目的
1、进一步巩固已学的《C程序设计》的理论知识,补充一些未学习的或者自己比较薄弱的知识;
2、加强学生将理论知识与实际操作相结合的能力;
3、进一步提高学生课程设计的能力、分析问题和解决问题的能力;
4、加强学生的独立思考的能力,开发学生的自主创新;
通过这个课程设计,使学生的各个方面得到全面的提升
二、设计要求与功能描述
1.设计要求
(1)查看功能,选择此功能是列出下列三类选择
A、办公类B、个人类C、商务类当选中某类时,显示出此类中所有数据中的姓名和电话号码
(2)增加功能能录入新数据(一个节点包括姓名,电话号码,分类(可选项有:
A、办公类,B、个人类,C、商务类)、电子邮件)
例如:
杨春187****0276商务类*************
当录入了重复的姓名和电话号码时,则提示数据录入重复并取消录入,当通讯录中超过15条信息时,存储空间已满,不能自录入新数据了。
(3)拨号功能能显示出通讯录中所有人的姓名,当选中某个人的姓名时,屏幕中模拟打字机的效果依次显示出此人的电话号码中的各个数字,并伴随相应的拨号声音
(4)修改功能选中某个人的姓名时,可对此人的数据进行相应修改
(5)删除功能选中某个人的姓名时可对此人的相应数据进行删除并自动调整后续条目
2.功能描述
(1)、新增信息
在提示界面选择“新增联系人”;新建通讯录,判断是否已满15个联系人。
判断是否输入相同信息,若输入相同信息,则系统停止,提示输入重复,返回主菜单进行其他选择操作。
(2)、查看功能
在提示中界面选择“查看联系人”;输入需要查看的类别;从第一个节点开始,判断链表中的节点是否属于选择的类别;如果节点属于所选类别,则显示该节点中所有信息;如果不属于所选类别,则将所指节点下移,直至将链表中所有属于该类别的信息全部输出为止;若找不到联系人,则提示无联系人;回到提示界面。
(3)、删除信息
在提示界面中选择“删除联系人”;输入要删除的姓名;如果通讯录文件空,则输出你选的用户不存在;如果通讯录文件不为空,则从第一个节点开始比较,若有某一节点中的姓名与输入姓名相同时,就调用free()函数释放该节点;若节点中所有姓名都与输入姓名不相同,则输出姓名为**的联系人不存在;保存刚才的操作,并回到提示界面。
(4)、修改信息
在提示界面中选择“修改联系人”;输入所要修改信息中的姓名,再依次输入信息,姓名、电话号码、类别、电子邮箱;保存刚才的操作,并回到提示界面。
(5)、拨号功能
在提示界面中选择“拨号联系人”,进入拨号功能区;调用输出函数显示所有联系人信息;输入姓名,则输出与姓名相对应的电话号码,同时每输出一个号码就有相应声音,输出后提示拨号成功,并回到提示界面;此函数中有一个音乐函数的调用,此函数的作用是是号码逐个显示(在输出号码后输出一个音频)
通讯录管理系统功能模块图
每一个功能都编写一个函数,多个功能函数都要用到的子模块单独编写函数,供各个实现功能的函数调用。
在主函数中设置欢迎界面和菜单处理函数,通过菜单处理函数调用各子函数处理模块,从而实现整个通讯录管理系统的功能。
因为各个函数之间是并列关系,所以可以通过switch函数实现各个功能函数的调用。
三、系统分析与设计
1、功能模块的设计分析
(1)主函数main()执行流程
如图3-1所示main()函数流程图,先以可读写的方式打开文本类型的数据文件,若该文件不存在,则新建此数据文件。
当打开文件操作成功后,从文件中一次读出一条记录,添加到新建的数组中,然后执行显示主菜单和进入主循环操作,进行按键判断。
在判断键值时,有效输入为0——6之间的任意数值,其他输入都被视为错误按键。
若输入为0,系统会自动进行存盘。
下图为main()函数流程图
若选择1,则调用input()函数,执行增加记录操作;若选择2,则调用search()函数,执行将记录以表格形式打印输出至屏幕的操作;若选择3,则调用modi()函数,执行修改操作;若选择4,则调用dele()函数,执行删除记录操作;若选择5,则调用:
bohao()()函数,执行拨号操作;若输入为0——5之外的值,不执行操作。
(2).添加功能流程图(3).删除功能流程图
(4).查询功能流程图(5).修改功能流程图
2、数据结构设计分析
程序定义了结构体ren,用于存放联系人的基本信息。
typedefstruct//定义一个结构
{
charname[10];
charhaoma[15];
charleibie[10];
chardizhi[20];
}ren;
Name[10];保存联系人姓名
charhaoma[15];保存联系人电话号码
charleibie[10];保存联系人所属类别
dizhi[20];保存联系人地址
3、函数功能描述
(1)menu()
函数原型:
voidmenu()
menu()函数用于显示主菜单,提供选择项,从此处进入各子功能。
(2)input()
函数原型:
voidinput()
input()函数用于在ry[]数组中增加电话簿记录,并返回数组中的当前记录。
(3)bohao()
函数原型:
voidbohao()
bohao()函数用于删除ry[]数组中的某项记录,并返回到数组中的当前记录。
(4)search()
函数原型:
voidsearch()
search()函数用于在数组ry[]中按姓名或电话号码查找满足条件的记录,并显示出来。
5)Del()
函数原型:
voiddele()
Del()函数用于先在数组ry[]中找到满足条件的就,然后删除该记录。
6)Modi()
函数原型:
voidmodi()
Modi()函数用于在数组ry[]中修改记录。
7)主函数main()
Main()时整个电话簿管理系统的控制部分。
主要实现对整个程序的运行控制,以及相关功能模块的调用。
四、系统调试与运行
1、主界面上显示通讯录管理系统的功能,共六项,编号0-5,在界面上显示相应的功能序号即可进入所需要的功能。
2、号码添加功能
选择1,可进入添加号码界面,依次输入姓名、电话、类别、邮箱地址等
3、若输入的号码在通讯录中已存在,则提示“号码已存在,不能记录”。
4、若输入通讯录中的联系人个数已经超过15条,则提示“内存已满,不能记录,青训则其他功能”。
5、若输入的联系人姓名在通讯录中已存在,则提示“姓名已存在,不能记录”。
6、查询界面:
输入要查人员的类别,即显示所有此类中的联系人以便查找。
7、若输入的类别通讯录中没有,则显示“查找失败”。
8、修改功能界面:
输入要修改的姓名,依次修改该联系人的各项信息
9、若输入的姓名在通讯录中不存在,则显示“此人不存在,修改失败!
!
”。
10、删除功能界面:
输入要删除的联系人姓名,若不存在,则提示“删除失败!
!
”。
11、若联系人存在则提示:
“修改成功!
!
”
12、拨号功能界面:
输入要拨打的联系人姓名,当选中某个人的姓名时,屏幕中模拟打字机的效果依次显示出此人的电话号码中的各个数字,并伴随相应的拨号声音
13、若不存在,则提示:
“此人不存在,拨号失败”
14、选择0号功能键退出系统“pressanykeytocontinue”。
五、总结
1、对自己完成程序进行自我评价:
我的程序较好的完成了任务中规定的设计内容,完全遵循了任务要求,熟练的插入并运用所学函数解决了数据编程问题,并尽可能使步骤简单化,更加易懂。
但在编程中也偶尔出现了几处错误,存在粗心之处以及不懂之处,但及时改正使程序运行非常流畅。
2、对课题提出更完善的方案:
在手机通信录管理系统程序中,插入引进联系人电子信箱,qq,以及地址等功能,方便使用人了解联系人的信息。
3、通过这次课程设计,使我对C语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,我也发现我的好多不足之处,首先是自己在指法上还不行,经常按错字母,通过学习也有所改进;再有对C语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对C语言中经常出现的错误也不了解,通过实践的学习,我认识到学好计算机要重视实践操作,不仅仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。
4、课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。
因此作为二十一世纪的大学来说掌握程序开发技术是十分重要的,而C语言又是最常见,功能最强大的一种高级语言,因此做好C语言课程设计是十分必要的。
六、附录:
程序源代码:
#include
#include
#include
#include
#defineN15//最大容量为15
typedefstruct//定义一个结构
{
charname[10];
charhaoma[15];
charleibie[10];
chardizhi[20];
}ren;
//菜单
voidmenu()//目录
{
system("cls");//清屏
printf("#########欢迎使用手机通讯录#########\n");
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("\n");
printf("个人通讯录\n");
printf("\n");
printf("~~请选择相应的功能~~:
");
}
//号码添加
voidinput()
{
intn;
FILE*fp;//定义文件指针
renry,s;//定义两个ren结构体的量
if((fp=fopen("ren.dat","ab+"))==NULL)
{printf("can'topenfile!
\n");exit(0);}
printf("\n录入格式姓名号码类别邮箱。
当输入姓名为#结束录入\n");
while
(1)
{printf("请输入姓名:
");
scanf("%s",ry.name);
if(strcmp(ry.name,"#")==0)break;//如果输入#则退出添加
printf("请输入电话号码:
");
scanf("%s",ry.haoma);
printf("请输入类别(A办公类B个人类C商务类):
");
scanf("%s",ry.leibie);
printf("请输入邮箱地址:
");
scanf("%s",ry.dizhi);
fseek(fp,0,0);//指针定位到文件开始位置
fread(&s,sizeof(ren),1,fp);
n=0;
while(!
feof(fp))
{
n++;
if(strcmp(s.haoma,ry.haoma)==0)
{printf("号码已经存在,不能记录.\n");break;}//遇到有相同的号码
if(strcmp(s.name,ry.name)==0)
{printf("姓名已经存在,不能记录.\n");break;}//遇到有相同的姓名
fread(&s,sizeof(ren),1,fp);
}
//printf("%d",n);
if(n>N){
break;//内存已满,不能记录.
}
if(feof(fp))//读到自后也没有相同的号码
fwrite(&ry,sizeof(ren),1,fp);//将信息写入文件
}
fclose(fp);//关闭文件
getchar();//接受一个输入
}
voidsearch()//查询
{
inthelp=0;//帮助指令,如果查找所找的类别中没有数据,显示
renry;
FILE*fp;
charleibie[10];
system("cls");
printf("\n输入要查人员的类别:
");scanf("%s",leibie);//要查询的类别查找失败
if((fp=fopen("ren.dat","rb"))==NULL){printf("can'topenfile!
\n");exit(0);}
fread(&ry,sizeof(ren),1,fp);
if(!
feof(fp))
{printf("人员的信息如下:
\n");
printf("说明:
(A办公类B个人类C商务类)");
printf("\n%10s%15s%10s%20s\n","姓名","号码","类别","邮箱");
while(!
feof(fp))
{
if(strcmp(ry.leibie,leibie)==0)//若为该类别则输出
{help++;
printf("%10s%15s%10s%20s\n",ry.name,ry.haoma,ry.leibie,ry.dizhi);
}
fread(&ry,sizeof(ren),1,fp);
}
if(help==0){
printf("查找失败");
}
}
//elseprintf("查找失败");
fclose(fp);
getch();
}
//修改:
输入人员的姓名,查找该人员,若找到则修改该人员的信息,并显示修改前后的结果;
voidmodi()
{renry;
FILE*fp;
charname[10];
system("cls");
if((fp=fopen("ren.dat","rb+"))==NULL){printf("can'topenfile!
\n");exit(0);}
if(!
feof(fp))
{printf("修改前全部人员的信息如下:
\n");
printf("\n%10s%15s%10s%20s\n","姓名","号码","类别","邮箱");
fread(&ry,sizeof(ren),1,fp);
while(!
feof(fp))
{
printf("%10s%15s%10s%20s\n",ry.name,ry.haoma,ry.leibie,ry.dizhi);
fread(&ry,sizeof(ren),1,fp);
}
}
printf("\n输入要修改人员的姓名:
");scanf("%s",name);
if((fp=fopen("ren.dat","rb+"))==NULL){printf("can'topenfile!
\n");exit(0);}
while(!
feof(fp))
{fread(&ry,sizeof(ren),1,fp);
if(strcmp(ry.name,name)==0)
{printf("修改前人员的信息如下:
\n");
printf("\n%10s%15s%10s%20s\n","姓名","号码","类别","邮箱");
printf("%10s%15s%10s%20s\n",ry.name,ry.haoma,ry.leibie,ry.dizhi);
printf("\n请输入该人的号码:
");scanf("%s",ry.haoma);
printf("\n类别:
");scanf("%s",ry.leibie);//新信息输入
printf("\n邮箱:
");scanf("%s",ry.dizhi);
break;//修改完毕退出
}
}
if(!
feof(fp))
{
printf("\n修改后的人的信息如下:
\n");
printf("\n%10s%15s%10s%20s\n","姓名","号码","类别","邮箱");
printf("%10s%15s%10s%20s\n",ry.name,ry.haoma,ry.leibie,ry.dizhi);
fseek(fp,sizeof(ren),1);//指针向前一位定位
fwrite(&ry,sizeof(ren),1,fp);
}
else
printf("\n\n此人不存在,修改失败!
!
");
fclose(fp);
getch();
}
//删除:
输入人员姓名,若该人员存在,则删除,并显示删除后余下的人员的信息
voiddele()
{renry[N];
FILE*fp;
charname[10];
inti,len,k=-1;
system("cls");
printf("\n输入要删除的人员姓名:
");scanf("%s",name);
i=0;
if((fp=fopen("ren.dat","rb+"))==NULL){printf("can'topenfile!
\n");exit(0);}
while(!
feof(fp))
{fread(&ry[i],sizeof(ren),1,fp);
if(feof(fp))break;
if(strcmp(ry[i].name,name)==0)k=i;
i++;
}
fclose(fp);
//以下是删除后重新写文件
len=i;
if(k>=0)
{if((fp=fopen("ren.dat","wb+"))==NULL){printf("can'topenfile!
\n");exit(0);}
for(i=0;i{if(i==k)continue;
fwrite(&ry[i],sizeof(ren),1,fp);
}
fclose(fp);printf("\n\n删除成功\n");
}
elseprintf("\n\n删除失败\n");
getch();
}
voidbohao()//拨号
{renry;
FILE*fp;
charname[10];
system("cls");
printf("\n输入要拨人员的姓名:
");scanf("%s",name);
if((fp=fopen("ren.dat","rb"))==NULL){printf("can'topenfile!
\n");exit(0);}
while(!
feof(fp))
{fread(&ry,sizeof(ren),1,fp);
if(strcmp(ry.name,name)==0)
{printf("\n\a\a\a\a\a\a%15s\a\a\a\a\a\n",ry.haoma);//输出号码和声音
break;
}
}
if(feof(fp))printf("\n\n拨号失败");
fclose(fp);
getch();
}
//菜单选择
voidchoice()
{
charch;
while
(1)
{
menu();//显示菜单
ch=getch();//选择菜单
if(ch=='0')break;
switch(ch)//判断功能项
{
case'1':
input();break;
case'2':
se