当前位置:文档之家› 电话号码管理系统.doc

电话号码管理系统.doc

课程设计课程名称C++面向对象程序设计题目名称电话号码管理系统专业班级学生姓名学号指导教师二○一四年十二月十五日目录一、引言 (1)二、课程设计报告 (2)1、问题描述 (2)2、系统总体方案 (2)3、设计思路和主要步骤 (2)4、各功能模块和流程图 (3)(1)各功能模块 (3)(2)流程图 (3)三、系统测试 (5)四、心得体会 (8)五、参考文献 (10)附:程序设计代码 (11)一、引言随着社会的发展,科学技术的进步,以及人际关系的交往日益密切,普通的采集联系人电话等信息已经不能够满足人们的需求,特别对于机场出差的人更是难以满足。

手工记录繁琐,容易出错,不方便查找,受个人情绪的影响,同时不方便传播,越来越多的靠计算机来帮助人们记住这些事情,极其简便这就需要有一个专门管理客户信息的电话管理系统能代替人们来管理客户电话等信息,用户可以方便的通过自己电脑的电话簿管理系统,来随时查阅自己所需要的信息,而不必大费周章去翻自己的记事本。

与此同时,21世纪是科技高度发展的世纪,计算机以及信统来代替落后的手工记录等来适应新时代的发展。

电话管理信息系统,可以满足人们的需求,人们可以通过它方便的记录客户电话信息,同时能很方便的查找修改等。

二、课程设计报告1、问题描述电话号码管理软件管理联系人的电话号码,支持添加、删除、修改、查询功能。

(1)整体查询:显示所有联系人(2)个别查询,例如:输入“张”,则所有匹配的姓名中含“张”的均显示。

2、系统总体方案用Node进行结构体类型定义,包括:姓名、电话号码和联系地址3、设计思路和主要步骤根据需求分析,首先我们需要建立Person基类,由此派生出了经理类(Manager),销售经理类(SalesManager),销售员类(Sales),技术人员类(Technician),在Person类中,需要将人员编号,姓名,岗位,收入,以及next 指针等数据设置权限为protected;由于其他类需要访问基类数据及相应成员函数,所以我们必须设置为public。

在各个派生类中,因为都需要使用了CalcSalary(),OutPut()函数,为了不出现二义性的问题,我们需要在基类中将这两个函数声明为纯虚函数,通过进一步分析,由于基类中的构造函数不能被继承,而且在派生类中又需要增加自己的数据成员,所以我们必须定义派生类的构造函数来完成相应的初始化。

然后建立Company类,在public访问权限中,我们通过链表来操作人员数据,同时增加不同功能的成员函数如:void Add(); //增加人员 void Delete(); //删除人员void Modify(); //修改人员void Query(); //查询人员void Set(); //基础数据设置void Save(); //数据存盘void Load(); //数据装入———为了实现多文件的效果,我们将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)可以新建和保存联系人,还可以显示所有记录和精确查询和删除记录。

三、系统测试列出各功能具体的输入数据及对应的输出结果,说明其是否符合设计要求:为链表增加记录显示所有记录按名字查找朋友的信息帮助四、心得体会通过此次课程设计,使我们更加扎实的掌握了有关C++程序设计方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我们在这方面的知识欠缺和经验不足。

实践出真知,通过大家的亲自动手制作,使我们掌握的知识不再是纸上谈兵。

过而能改,善莫大焉。

在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。

最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。

这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后通过查阅相关书籍以及在大家的积极讨论下,终于迎刃而解。

在今后社会的发展和学习实践过程中,我们一定会不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!课程设计诚然是一门专业课,给我们很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我们莫大的空间。

同时,设计让我们感触很深。

使我们对抽象的理论有了具体的认识。

通过这次课程设计,我们基本掌握了C++课程设计的原理。

我认为,在这学期的实验中,不仅培养了团结合作、动手操作的能力,在各种其它能力上也都有了提高。

更重要的是,在实验课上,我们学会了很多学习的方法。

而这是日后最实用的,真的是受益匪浅。

要面对社会的挑战,只有不断的学习、实践,再学习、再实践。

这对于我们的将来也有很大的帮助。

以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。

就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。

回顾起此次课程设计,至今仍让我们感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高我们的实际动手能力和团结互助的能力。

在设计的过程中遇到问题,可以说是困难重重,但可喜的是最终都得到了解决。

此次设计也让我们明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。

五、参考文献1.谭浩强.《C++程序设计》.北京:清华大学出版社.20042.张基温.《C++程序设计基础》.北京:高等教育出版社,20013.郭有强等编著,《C++面向对象程序设计》,清华大学出版社,20094.郭有强等编著,《C++面向对象程序设计实验指导与课程设计》,清华大学出版社,2009附:程序设计代码#include<conio.h>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<time.h>#define Node struct nodeNode //结构体类型定义,包括:姓名、电话号码和联系地址{char szName[20];char szPhoneNum[12];char szAddress[30];Node *next;};Node *strpHead; //全局变量,链表头指针Node *strpCurrent; //用于指向当前正在操作的结点//函数原型声明void HandleChoice_f(int);void AddRecord_f();void InsertNode_f(Node * );Node *InsertPoint_f(char * );void MakeNewHead_f(Node * );void AddToEnd_f(Node * );void MoveToEnd_f();void DisplayList_f();void DeleteRecord_f();void DelHead_f();void DelEnd_f(Node * );void DelMid_f(Node * );int VerifyDel_f();void DelNode_f(Node * );void DelList_f();void SearchByName_f();void WriteFile_f();void LoadFile_f();void Help_f();//主程序int main(){int nChoice;system("color 3f");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);return 0;}void HandleChoice_f(int nChoice) /*根据用户选择nChoice调用相应的函数*/{switch(nChoice){case 1:AddRecord_f();break;case 2:DisplayList_f();break;case 3:SearchByName_f();break;case 4:DeleteRecord_f();break;case 5:Help_f();break;case 6:WriteFile_f(); /*将链表中的数据写回文件*/if(strpHead!=NULL){DelList_f();}break;default:printf("没有您要的选项!\n");break;}}void AddRecord_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");}void InsertNode_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) /*根据新增记录的姓氏,返回其将插入的正确位置*/{char szTempName[20];Node *strpTemp;int nTemp;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);}void MakeNewHead_f(Node *strpNew)/*新结点成为链表的头结点*/{Node *strpTemp;strpTemp=strpHead;strpNew->next=strpTemp;strpHead=strpNew;}void AddToEnd_f(Node *strpNew)/*新结点成为链表的尾结点*/{strpNew->next=NULL;MoveToEnd_f();strpCurrent->next=strpNew;}void MoveToEnd_f()/*当前指针移到链表尾*/{strpCurrent=strpHead;while(strpCurrent->next!=NULL){strpCurrent=strpCurrent->next;}}void DisplayList_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");}}void SearchByName_f(){char szSearch[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");}}void DeleteRecord_f(){char szSearch[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");}void Help_f(){int nChoice;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){case 1:printf("这是一个简单的电话簿,刚开始是一个空的电话本。

相关主题