当前位置:文档之家› C++电话簿管理系统

C++电话簿管理系统

电话簿管理系统一、课程设计题目:电话簿管理系统二、目的与要求:1、目的:(1)要求学生达到熟练掌握C++语言的基本知识和技能;(2)基本掌握面向对象程序设计的基本思路和方法;(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。

2、基本要求:(1)要求利用面向对象的方法以及C++的编程思想来完成系统的设计;(2)要求在设计的过程中,建立清晰的类层次;(3)在系统中至少要定义四个类,每个类中要有各自的属性和方法;(4)在系统的设计中,至少要用到面向对象的一种机制。

3、创新要求:在基本要求达到后,可进行创新设计,如根据查找结果进行修改的功能。

4、写出设计说明书三、设计方法和基本原理:1、问题描述(功能要求):电话簿记录按姓名排序存放,显示时每屏不超过20个记录,超过时分屏显示。

增加记录修改功能,能选择修改用户的姓名、电话,在修改或删除之前需要用户进一步确认,确认无误后再进行操作。

增加录入时间的显示及存储。

增加默认的查询方式,即查询时只输入姓名的首字母,所有符合这一条件的电话资料均在屏幕上显示。

2、问题的解决方案:根据系统功能要求,可以将问题解决分为以下步骤:(1)分析系统中的各个实体之间的关系及其属性和行为;(2)根据问题描述,设计系统的类层次;(3)完成类层次中各个类的描述(包括属性和方法);(4)完成类中各个成员函数的定义;(5)完成系统的应用模块;(7)完成系统总结报告以及系统使用说明书。

1、目的:(1)要求学生达到熟练掌握C++语言的基本知识和技能;(2)基本掌握面向对象程序设计的基本思路和方法;(3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。

2、基本要求:(1)要求利用面向对象的方法以及C++的编程思想来完成系统的设计;(2)要求在设计的过程中,建立清晰的类层次;(3)在系统中至少要定义四个类,每个类中要有各自的属性和方法;(4)在系统的设计中,至少要用到面向对象的一种机制。

2.编程体会:电话簿管理程序较长,算法比较复杂,调试的过程中遇到了各种各样的问题。

各种各样的小错误寻找起来十分困难。

在今后编写程序时应当随编随找错。

不知从何开始,这个时候才知道上课老师们不厌其烦的教导是多么的宝贵,这个时候才后悔上课的时候没有认真的听讲。

可是现在一切都晚了,还好时间还算是充裕,只好拿出书本重新复习一下。

后来慢慢的接触多了,听老师讲的多了,了解多了,渐渐的产生了兴趣。

课设让我们把这一学期所学的C++知识得到了很好的应用,开拓了我们的思路,所谓温故而而知新,这次课设也让我们对以前的知识有了一个全面的回顾,加深了对已学知识的理解。

课设过程艰辛,花费时间很长,需要很强的耐力和信心。

而这也是对我们的一次考验,养成了坚持不懈和吃苦耐劳的精神。

通过这次课程设计的实训,增加了我学习软件技术的兴趣,虽然还不明确软件技术包含的具体内容,但从C++语言这门课程开始,已发现程序设计的乐趣,在学习C++语言的过程中也学到了许多计算机应用基础知识,对计算机的机体也有了一个大体的了解。

在实际操作过程中犯的一些错误还会有意外的收获,感觉实训很有意思。

在具体操作中出,在以后的上机中应更加注意,同时体会到C++语言具有的语句简洁,使用灵活,执行效率高等特点。

发现上机实训的重要作用,特别是对数组和循环有了深刻的理解。

通过实际操作,学会C++语言程序编程的基本步骤、基本方法,开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力。

深刻体会到“没有做不到的,只有想不到的”,“团结就是力量”,“实践是检验真理的标准”,“不耻下问”……的寓意。

计时在此希望以后应多进行这样的实训,加长设间,培养学生独立思考问题的能力,提高实际操作水平。

总之,C++课设让我们学到了很多,也收获了很多,这必将成为我人生中的一个深刻的回忆。

附件:#include<iostream>#include<string>#include<iomanip>#include<fstream>using namespace std; //用命名空间std中的定义int count=0;class CData{public:CData(){};virtual int Compare(CData &,int)=0;virtual void Show()=0;virtual ~CData(){};};class CNode //定义数据基类{private:CData *pData;CNode *pNext;public:CNode(){pData=0;pNext=0;}; //节点构造函数CNode(CNode &node){pData=node.pData;pNext=node.pNext;}void InputData(CData *pdata){pData=pdata;}void ShowNode(){pData->Show();}CData *GetData(){return pData;}friend class CList;}; //定义链表类为友元类class CList{CNode *pHead;CList(){pHead=0;};~CList(){DeleteList();}void AddNode(CNode *pnode);CNode *DeleteNode(CNode *);CNode *LookUp(CData &);bool LookUpF(CData &);void ShowList(); //打印整个链表void DeleteList();CNode *GetListHead(){return pHead;}CNode *GetListNextNode(CNode *pnode); };CNode *CList::GetListNextNode(CNode *pnode){CNode *p1=pnode;return p1->pNext;};void CList::AddNode(CNode *pnode) //在首部添加结点{if (pHead==0){pHead=pnode;pnode->pNext=0;return;}else{ pnode->pNext=pHead;pHead=pnode;}};CNode *CList::DeleteNode(CNode *pnode){CNode *p1,*p2;p1=pHead; //指向首结点while(p1!=pnode&&p1->pNext!=0){p2=p1;p1=p1->pNext; }if (p1==pHead){pHead=pHead->pNext;return pnode; }p2->pNext=p1->pNext;return pnode;}CNode *CList::LookUp(CData &data){CNode *p1=pHead;while(p1) //从头结点开始查找{if (p1->pData->Compare(data,1)==0)return p1; p1=p1->pNext;}return 0;}bool CList::LookUpF(CData &data){bool f1=false;CNode *p1=pHead;while(p1){ if (p1->pData->Compare(data,0)==0)f1=true;}p1=p1->pNext;}return f1;}void CList::ShowList(){CNode *p1=pHead;while(p1){p1->pData->Show();p1=p1->pNext;}}void CList::DeleteList() //删除整个链表结点{CNode *p1,*p2;p1=pHead;while(p1){delete p1->pData;p2=p1;p1=p1->pNext;delete p2;}}class CTelRecord:public CData{private :char szName[20]; //电话薄的数据:姓名和电话号码char szNumber[20];char szF;public:CTelRecord(){strcpy(szName,"\0");strcpy(szNumber,"\0");} CTelRecord(char *name,char *number){strcpy(szName,name);strcpy(szNumber,number);szF=name[0];}void SetRecord(char *name, char *number){strcpy(szName,name);strcpy(szNumber,number);szF=name[0];}int Compare(CData &,int);void Show();};int CTelRecord::Compare(CData&data,int choice) {CTelRecord &temp=(CTelRecord &)data;if(choice==1)return strcmp(szName,temp.szName);elsereturn (szF==temp.szF ? 0:1);}void CTelRecord::Show(){cout<<setw(15)<<szName<<setw(15)<<szNumber<<endl;}void AddRecord(CList &TelList)CTelRecord *pTel;char szName[20],szNumber[20];system("cls");cout<<"请输入姓名(输入0退出,并进入系统菜单)"<<endl;cin.getline(szName,20);while(strcmp(szName,"0")){cout<<"请输入电话号码: "<<endl;cin.getline(szNumber,20);pTel=new CTelRecord;pTel->SetRecord(szName,szNumber);pNode=new CNode;pNode->InputData(pTel);TelList.AddNode(pNode);count++;cout<<"请输入姓名(输入0退出,并进入系统菜单) "<<endl;cin.getline(szName,20);}cout<<endl<<endl;}void DisplayRecord(CList&TelList){system("cls");cout<<"目前共有 "<<count<<" 条记录,具体记录如下:"<<endl;cout<<setw(15)<<"【姓名】"<<setw(15)<<"【电话号码】"<<endl;TelList.ShowList();cout<<endl<<endl;system("pause");}void LookUpRecord(CList&TelList){system("cls");CNode *pLook;char szName[20];cout<<"请输入您需要查找的姓名(输入0退出,并进入系统菜单)"<<endl; cin.getline(szName,20);while (strcmp(szName,"0")){CTelRecord tele(szName,"0");pLook=TelList.LookUp(tele);if (pLook){cout<<"在电话簿中找到"<<szName<<",内容是:"<<endl;cout<<setw(15)<<"【姓名】"<<setw(15)<<"【电话号码】"<<endl;pLook->ShowNode(); }elsecout<<"在电话簿中找不到"<<szName<<","<<endl;cout<<"请输入您需要查找的姓名(输入0退出,并进入系统菜单)"<<endl; cin.getline(szName,20);}cout<<endl<<endl;}void DeleteRecord(CList&TelList) //删除链表数据{system("cls");char szName[20];cout<<"请输入您需要删除的姓名(输入0退出,并进入系统菜单)"<<endl; cin.getline(szName,20);while(strcmp(szName,"0")){CTelRecord tel(szName,"0");pLook=TelList.LookUp(tel);if (pLook){cout<<"在电话簿中找到"<<szName<<",内容是:"<<endl;pLook->ShowNode();cout<<"请确定是否删除此记录(Y/N)【确定删除请输入Y或y,取消删除请输入N或n】:"<<endl;char ok;cin>>ok;cin.ignore();if (ok=='Y'||ok=='y'){TelList.DeleteNode(pLook);cout<<szName<<"的资料删除成功!"<<endl;delete pLook;count--;}else if(ok=='N'||ok=='n')cout<<szName<<"的资料删除失败"<<endl; }elsecout<<"在电话簿中找不到"<<szName<<","<<endl;cout<<"请输入您需要删除的姓名(输入0退出,并进入系统菜单)"<<endl;cin.getline(szName,20);}cout<<endl<<endl;}void ModifyRecord(CList &TelList){system("cls");CNode *pLook;CTelRecord *pTel;char szName[20],szNumber[20];cout<<"请输入您需要修改的姓名(输入0退出,并进入系统菜单)"<<endl;cin.getline(szName,20);while(strcmp(szName,"0")){CTelRecord tel(szName,"0");pLook=TelList.LookUp(tel);if (pLook){cout<<"在电话簿中找到"<<szName<<",内容是:"<<endl;pLook->ShowNode();cout<<"-----下面开始修改-----"<<endl<<"请输入修改后的姓名: "<<endl;cin.getline(szName,20);cout<<"请输入修改后的电话号码:"<<endl;cin.getline(szNumber,20);或n】:"<<endl;char ok;cin>>ok;cin.ignore();if (ok=='Y'||ok=='y'){pTel=new CTelRecord;*pTel=tel;pTel->SetRecord(szName,szNumber);pLook->InputData(pTel);cout<<szName<<"的资料修改成功!"<<endl;} else if(ok=='N'||ok=='n')cout<<szName<<"的资料修改失败!"<<endl;}elsecout<<" 在电话簿中找不到"<<szName<<","<<endl;cout<<" 请输入您需要修改的姓名(输入0退出,并进入系统菜单)";cin.getline(szName,20); }}void StoreFile(CList&TelList) //存储链表数据{system("cls");ofstream outfile("TELEPHONE.DAT",ios::binary);if (!outfile){ cout<<" 数据库文件打开错误,没有将数据存入文件!\n";return;}CNode *pnode;CTelRecord *pTel;string strName,strNumber;pnode=TelList.GetListHead();while(pnode){pTel=(CTelRecord *)pnode->GetData();outfile.write((char *)pTel,sizeof(CTelRecord));pnode=TelList.GetListNextNode(pnode);}outfile.close();}void Operate(string &strChoice,CList&TelList) //运行{ if (strChoice=="1")AddRecord(TelList);else if (strChoice=="5")DisplayRecord(TelList);else if (strChoice=="3")LookUpRecord(TelList);else if (strChoice=="4")DeleteRecord(TelList);else if(strChoice=="2")ModifyRecord(TelList);else if (strChoice=="6")else cout<<"对不起,您的输入有误,请重新输入您的选择: "<<endl;} void LoadFile(CList &TelList){system("cls");fstream infile("TELEPHONE.DAT",ios::binary);if (!infile){ return;}CNode *pNode;CTelRecord *pTel;while (!infile.eof()){pTel=new CTelRecord;infile.read((char*)pTel,sizeof(CTelRecord));pNode=new CNode;pNode->InputData(pTel);TelList.AddNode(pNode); }TelList.DeleteNode(pNode);infile.close();}int main(){CList TelList;system("cls");LoadFile(TelList);string strChoice;do{ cout<<"-------------【欢迎进入系统菜单】------------- "<<endl; cout<<" 1.增加记录 "<<endl; cout<<" 2.修改记录 "<<endl; cout<<" 3.查询记录 "<<endl; cout<<" 4.删除记录 "<<endl; cout<<" 5.显示记录 "<<endl; cout<<" 6.退出 "<<endl; cout<<"【请输入您的选择】:"<<endl;cin>>strChoice;cin.ignore();Operate(strChoice,TelList);system("cls");}while(strChoice!="6");StoreFile(TelList);system("pause");return 0;}。

相关主题