电话号码管理系统doc.docx
- 文档编号:14961557
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:27
- 大小:196.76KB
电话号码管理系统doc.docx
《电话号码管理系统doc.docx》由会员分享,可在线阅读,更多相关《电话号码管理系统doc.docx(27页珍藏版)》请在冰点文库上搜索。
电话号码管理系统doc
课程设计
课程名称
C++面向对象程序设计
题目名称
电话号码管理系统
专业班级
学生姓名
学号
指导教师
二○一四年十二月十五日
一、引言
随着社会的发展,科学技术的进步,以及人际关系的交往日益密切,普通的采集联系人电话等信息已经不能够满足人们的需求,特别对于机场出差的人更是难以满足。
手工记录繁琐,容易出错,不方便查找,受个人情绪的影响,同时不方便传播,越来越多的靠计算机来帮助人们记住这些事情,极其简便这就需要有一个专门管理客户信息的电话管理系统能代替人们来管理客户电话等信息,用户可以方便的通过自己电脑的电话簿管理系统,来随时查阅自己所需要的信息,而不必大费周章去翻自己的记事本。
与此同时,21世纪是科技高度发展的世纪,计算机以及信统来代替落后的手工记录等来适应新时代的发展。
电话管理信息系统,可以满足人们的需求,人们可以通过它方便的记录客户电话信息,同时能很方便的查找修改等。
二、课程设计报告
1、问题描述
电话号码管理软件管理联系人的电话号码,支持添加、删除、修改、查询功能。
(1)整体查询:
显示所有联系人
(2)个别查询,例如:
输入“张”,则所有匹配的姓名中含“张”的均显示。
2、系统总体方案
用Node进行结构体类型定义,包括:
姓名、电话号码和联系地址
3、设计思路和主要步骤
根据需求分析,首先我们需要建立Person基类,由此派生出了经理类(Manager),销售经理类(SalesManager),销售员类(Sales),技术人员类(Technician),在Person类中,需要将人员编号,姓名,岗位,收入,以及next指针等数据设置权限为protected;由于其他类需要访问基类数据及相应成员函数,所以我们必须设置为public。
在各个派生类中,因为都需要使用了CalcSalary(),OutPut()函数,为了不出现二义性的问题,我们需要在基类中将这两个函数声明为纯虚函数,通过进一步分析,由于基类中的构造函数不能被继承,而且在派生类中又需要增加自己的数据成员,所以我们必须定义派生类的构造函数来完成相应的初始化。
然后建立Company类,在public访问权限中,我们通过链表来操作人员数据,同时增加不同功能的成员函数如:
voidAdd();//增加人员voidDelete();//删除人员 voidModify();//修改人员 voidQuery();//查询人员 voidSet();//基础数据设置 voidSave();//数据存盘 voidLoad();//数据装入———为了实现多文件的效果,我们将Company类定义及该类的实现分开,然后逐一对各功能函数进行代码编写。
最后,我们定义了主函数,通过公司类创建了一个对象,并通过此对象完成相应的操作。
在调试并测试代码过程中,当程序员输入相应的指令后,该系统自动调用相应的功能函数来达到需求效果,至此,一个公司人员管理系统的实现才算基本成功。
显示所有记录
按名字查
删除记录
请求帮助
退出电话簿
电话薄管理系统
增加记录
4、各功能模块和流程图
(1)各功能模块
1.Person类的No-人员编号,Name-人员姓名,Duty-人员类别,Earning-工资,next-指向下一个人员的指针;Person类的CalcSalary(),Output()定义为纯虚函数分别表示要计算人员工资和输出人员信息,由于定义纯虚函数,所以Person是抽象类,具体计算工资,输出人员信息由派生类完成。
2.各个派生的类,包含本类对象特有的数据,Sales:
:
Amount-销售员销售额,SalesManager:
:
Amount-销售经理的总销售额(系统统计各个销售员销售额得到销售经理的总销售额),Technician:
:
t-技术人员工作小时数。
其中:
Worker就是人员链表。
Clear()用于清除人员链表所有结点。
Add(),Delete(),Modify(),Query(),Set(),Save(),Load()分别表示系统各个功能模块:
增加人员,删除人员,修改人员,查询本月经营信息,基础数据设置,数据存盘,数据装入。
(2)电话号码管理系统流程图
(3)可以新建和保存联系人,还可以显示所有记录和精确查询和删除记录。
开始
打开文件是
否成功
移动指针p指向
头指针head
退出
P是否指向NULL
保存文件,
P指针后移
关闭文件
结束
三、系统测试
列出各功能具体的输入数据及对应的输出结果,说明其是否符合设计要求:
为链表增加记录
显示所有记录
按名字查找朋友的信息
帮助
四、心得体会
通过此次课程设计,使我们更加扎实的掌握了有关C++程序设计方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我们在这方面的知识欠缺和经验不足。
实践出真知,通过大家的亲自动手制作,使我们掌握的知识不再是纸上谈兵。
过而能改,善莫大焉。
在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。
最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。
这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后通过查阅相关书籍以及在大家的积极讨论下,终于迎刃而解。
在今后社会的发展和学习实践过程中,我们一定会不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!
课程设计诚然是一门专业课,给我们很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我们莫大的空间。
同时,设计让我们感触很深。
使我们对抽象的理论有了具体的认识。
通过这次课程设计,我们基本掌握了C++课程设计的原理。
我认为,在这学期的实验中,不仅培养了团结合作、动手操作的能力,在各种其它能力上也都有了提高。
更重要的是,在实验课上,我们学会了很多学习的方法。
而这是日后最实用的,真的是受益匪浅。
要面对社会的挑战,只有不断的学习、实践,再学习、再实践。
这对于我们的将来也有很大的帮助。
以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。
就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。
回顾起此次课程设计,至今仍让我们感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高我们的实际动手能力和团结互助的能力。
在设计的过程中遇到问题,可以说是困难重重,但可喜的是最终都得到了解决。
此次设计也让我们明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。
五、参考文献
1.谭浩强.《C++程序设计》.北京:
清华大学出版社.2004
2.张基温.《C++程序设计基础》.北京:
高等教育出版社,2001
3.郭有强等编著,《C++面向对象程序设计》,清华大学出版社,2009
4.郭有强等编著,《C++面向对象程序设计实验指导与课程设计》,清华大学
出版社,2009
附:
程序设计代码
#include
#include
#include
#include
#include
#defineNodestructnode
Node//结构体类型定义,包括:
姓名、电话号码和联系地址
{
charszName[20];
charszPhoneNum[12];
charszAddress[30];
Node*next;
};
Node*strpHead;//全局变量,链表头指针
Node*strpCurrent;//用于指向当前正在操作的结点
//函数原型声明
voidHandleChoice_f(int);
voidAddRecord_f();
voidInsertNode_f(Node*);
Node*InsertPoint_f(char*);
voidMakeNewHead_f(Node*);
voidAddToEnd_f(Node*);
voidMoveToEnd_f();
voidDisplayList_f();
voidDeleteRecord_f();
voidDelHead_f();
voidDelEnd_f(Node*);
voidDelMid_f(Node*);
intVerifyDel_f();
voidDelNode_f(Node*);
voidDelList_f();
voidSearchByName_f();
voidWriteFile_f();
voidLoadFile_f();
voidHelp_f();
//主程序
intmain()
{
intnChoice;
system("color3f");
LoadFile_f();
do
{printf("菜单\n");
printf("┌─────────────────────┐\n");
printf("│1.增加记录│\n");
printf("│2.显示所有记录│ \n");
printf("│3.按名字查找朋友的信息│ \n");
printf("4.删除记录 \n");
printf("│5.请求帮助│\n");
printf("│6.退出程序│\n");
printf("└─────────────────────┘\n");
printf("请选择代码(1,2,3,4,5,6):
");
scanf("%d",&nChoice);
HandleChoice_f(nChoice);/*接受用户的选择*/
}while(nChoice!
=6);
return0;
}
voidHandleChoice_f(intnChoice)/*根据用户选择nChoice调用相应的函数*/
{
switch(nChoice)
{
case1:
AddRecord_f();
break;
case2:
DisplayList_f();
break;
case3:
SearchByName_f();
break;
case4:
DeleteRecord_f();
break;
case5:
Help_f();
break;
case6:
WriteFile_f();/*将链表中的数据写回文件*/
if(strpHead!
=NULL)
{
DelList_f();
}
break;
default:
printf("没有您要的选项!
\n");
break;
}
}
voidAddRecord_f()
{
Node*strpNew;/*为新记录定义临时指针变量*/
strpNew=(Node*)malloc(sizeof(Node));/*开辟空间存放新记录数据*/
getchar();
printf("姓名:
");
gets(strpNew->szName);
printf("电话号码:
");
gets(strpNew->szPhoneNum);
printf("联系地址:
");
gets(strpNew->szAddress);
InsertNode_f(strpNew);
system("cls");
}
voidInsertNode_f(Node*strpNew)
{
Node*strpFront;
Node*strpBack;
system("cls");
if(strpHead==NULL)
{
strpNew->next=NULL;
strpHead=strpNew;
}
else
{
if(strcmp(strpNew->szName,strpHead->szName)>0)
{
MakeNewHead_f(strpNew);
}
else//查找新结点的位置
{
strpCurrent=InsertPoint_f(strpNew->szName);
strpFront=strpCurrent;
strpBack=strpCurrent->next;
if(strpBack==NULL)
{
AddToEnd_f(strpNew);
}
else
{
strpFront->next=strpNew;
strpNew->next=strpBack;
}
}
}
}
Node*InsertPoint_f(char*szName)/*根据新增记录的姓氏,返回其将插入的正确位置*/
{
charszTempName[20];
Node*strpTemp;
intnTemp;
if(strpHead->next!
=NULL)
{
strpCurrent=strpHead;
strpTemp=strpCurrent->next;
strcpy(szTempName,strpTemp->szName);
nTemp=strcmp(szName,szTempName);
while((nTemp>0)&&(strpCurrent->next!
=NULL))
{
strpCurrent=strpTemp;
if(strpCurrent->next!
=NULL)
{
strpTemp=strpCurrent->next;
strcpy(szTempName,strpTemp->szName);
nTemp=strcmp(szName,szTempName);
}
}
}
else
{
strpCurrent=strpHead;
}
return(strpCurrent);
}
voidMakeNewHead_f(Node*strpNew)/*新结点成为链表的头结点*/
{
Node*strpTemp;
strpTemp=strpHead;
strpNew->next=strpTemp;
strpHead=strpNew;
}
voidAddToEnd_f(Node*strpNew)/*新结点成为链表的尾结点*/
{
strpNew->next=NULL;
MoveToEnd_f();
strpCurrent->next=strpNew;
}
voidMoveToEnd_f()/*当前指针移到链表尾*/
{
strpCurrent=strpHead;
while(strpCurrent->next!
=NULL)
{
strpCurrent=strpCurrent->next;
}
}
voidDisplayList_f()
{
strpCurrent=strpHead;
if(strpCurrent!
=NULL)
{
printf("\n");
printf("姓名电话号码联系地址\n");
printf("------------------------------------------------------------\n");
do
{
printf("%10s",strpCurrent->szName);
printf("%20s",strpCurrent->szPhoneNum);
printf("%20s\n",strpCurrent->szAddress);
strpCurrent=strpCurrent->next;
printf("\n");
}while(strpCurrent!
=NULL);
system("pause");
system("cls");
}
else
{
printf("没有记录可以显示!
\n");
}
}
voidSearchByName_f()
{
charszSearch[20];
strpCurrent=strpHead;
system("cls");
getchar();
printf("\n输入您要查找的姓名:
");
gets(szSearch);
while((strpCurrent!
=NULL)&&(strcmp(strpCurrent->szName,szSearch)!
=0))
{
strpCurrent=strpCurrent->next;
}
if(strpCurrent!
=NULL)
{
printf("\n记录找到了!
\n");
printf("%s\n",strpCurrent->szName);
printf("%s\n",strpCurrent->szPhoneNum);
printf("%s\n",strpCurrent->szAddress);
}
else
{
printf("没有相应的记录!
\n");
printf("按ENTER键继续\n");
system("pause");
system("cls");
}
}
voidDeleteRecord_f()
{
charszSearch[20];
Node*strpFront;
system("cls");
strpFront=NULL;
strpCurrent=strpHead;
getchar();
printf("\n输入朋友的姓名以删除该记录:
");
gets(szSearch);
while((strpCurrent!
=NULL)&&(strcmp(strpCurrent->szName,szSearch)!
=0))
{
strpFront=strpCurrent;
strpCurrent=strpCurrent->next;
}
if(strpCurrent!
=NULL)
{
printf("\n记录找到了\n");
printf("%s\n",strpCurrent->szName);
printf("%s\n",strpCurrent->szPhoneNum);
printf("%s\n",strpCurrent->szAddress);
if(VerifyDel_f())
{
DelNode_f(strpFront);
printf("\n该记录已经删除!
\n");
}
else
{
printf("\n该记录没有删除!
\n");
}
}
else
{
printf("\n没有匹配的记录被删除!
\n");
}
system("cls");
}
voidHelp_f()
{
intnChoice;
do
{
system("cls");
printf("欢迎来到帮助栏,请选择代号\n");
printf("1:
电话簿的功能\n");
printf("2:
怎么清除所有记录\n");
printf("3:
在加入新的信息时,原来的信息还在吗\n");
printf("4:
你操作时需要注意的事项!
\n");
printf("5:
退出\n");
scanf("%d",&nChoice);
switch(nChoice)
{
case1:
printf("这是一个简单的电话簿,刚开始是一个空的电话本。
你可以根据提示加入或删除纪录,还可以根据需要显示和查询电话号码\n");
printf("按ENTER键继续\n");
getch();
system("cls");
break;
case2:
printf("你只要删除文件Friend.dat或者退出程序释放存储空间,就可以删除所有纪录了\n");
printf("按ENTER键继续\n");
getch();
system("cls");
break;
case3:
printf("当然拉,加入信息不会改变原来的信息\n");
printf("按ENTER键继续\n");
getch();
system("cls");
break;
case4:
printf("在查找和删除纪录时,应该把要找的朋友的全名写好,否则将无法显示和操作\n");
printf("按ENTER键继续\n");
getch();
system("cls");
break;
default:
case5:
printf("按ENTER键继续\n");
break;
}
}while(nChoice!
=5);
}
intVerifyDel_f()/*删除信息时要求予以确认*/
{
charchYesNo;
printf("你确定要删除吗?
(Y/N)");
scanf("%c",&chYesNo);
if((chYesNo=='Y')||(chYesNo=='y'))
{
return
(1);
}
else
{
return(0);
}
}
voidDelNode_f(Node*strpFront)/*删除结点*/
{
if(strpCurrent==strpHead)
DelHead_f();
else
{
if(strpCurrent->next==NULL)
DelEnd_f(strpFront);
else
DelMid_f(strpFront);
}
}
voidDelHead_f()/*删除头结点*/
{
strpCurrent=strpHead;
if(strpHead->next!
=NULL)
strpHead=strpCurrent->next;
else
strpHead=NULL;
free(strpCurrent);
}
voidDelEnd_f(Node*strpFront)/*删除尾结点*/
{
free(strpCurrent);
strpFront->next=NULL;
strpCurrent=strpHead;
}
voidD
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电话号码 管理 系统 doc