当前位置:文档之家› 课程设计电话簿管理系统

课程设计电话簿管理系统

一.程序功能简介一个基本的电话簿管理程序,具有插入、删除、显示、修改和查询联系人电话码的功能。

主菜单如右图所示,每个菜单项功能如下:1.增加记录菜单:请输入用户姓名,如果该用户已经存在则添加失败,否则,输入用户的电话号码,进行添加。

2.修改某条记录:请输入用户姓名,如果没有该用户显示“该用户不存在”信息,否则,输出原电话号码,然后输入新的电话号码,进行修改。

3.删除记录:输入用户姓名,进行删除(删除时要进行确认)。

4.查询:输入用户姓名,进行查找。

5.排序:根据子菜单,选择不同的排序方式。

6.显示:逐屏显示(每屏显示10条记录)。

7.全删:进行全部删除(要确认)。

二.课程设计要求请选择以下功能1- 增加记录2- 修改记录3- 删除记录4- 查找(按姓名)5- 排序6- 显示记录1.用汉化菜单实现。

2.提供按姓名查询电话号码的功能。

3.显示功能(提供逐屏显示的功能,每屏显示10条记录)。

4.删除和修改时要进行确认。

5.将电话簿记录以文件的形式存在磁盘上;每次操作时将电话簿调出,操作完毕后存盘。

三.课程设计说明1.程序采用数组数据结构实现。

2.用类来实现数据的封装。

四.参考数据结构1.“电话簿”称为用户信息表,用数组实现。

用户信息表由若干用户信息构成,每个用户信息是一个数组元素。

2.“user.txt”是一个文件,用于保存“用户信息表”中的信息。

当系统启动时,从该文件中读入信息,当退出系统时,将“用户信息表”中的信息写到该文件中。

该文件中信息存放形式如下:ZhangHong 5221369LiLi 84891112ZhaoQiang 5221498其中name(姓名)占20列phone_num(电话号码)占12列五.具体功能及实现定义Fphone类,通过其私有成员数组name[20]和phone[12]分别记录用户姓名与电话号码,定义UserDatabase类记录用户信息,通过公有成员函数实现对数据的操作。

六.源程序及注释#include<fstream.h>#include<iostream.h>#include<iomanip.h>#include<string.h>#include<stdlib.h>#define M 20#define N 12#define MAX 100class Fphone //用户信息类的定义{char name[M]; // 姓名char phone_num[N]; //电话号码public:Fphone(char *na="",char *ph=""){ strcpy(name,na);strcpy(phone_num,ph);}char*getname(); //获取姓名char*getphone_num(); //获取电话号码void setname(char*a); //设置姓名void setphone_num(char*a); //设置电话号码void disp(); //显示用户信息};char *Fphone::getname(){ return name;}char *Fphone::getphone_num(){ return (phone_num);}void Fphone::setname(char *a){ strcpy(name,a);}void Fphone::setphone_num(char*a){ strcpy(phone_num,a);}void Fphone::disp(){ cout<<"姓名:"<<name<<'\t'<<"电话号码:"<<phone_num<<endl;}class UserDatabase //用户信息表类的定义{ int nElem; //用户信息表中的元素个数,即当前记录总数int Maxu; //最多的用户Fphone *user; //指向用户信息表的指针public:UserDatabase() //构造函数,初始化用户信息表,将user.txt文件中数据读到User[]中{ nElem=0;Maxu=50;user=new Fphone[Maxu];fstream in;in.open("user.txt",ios::in|ios::nocreate); //打开文件for(int i=0;(!in.eof());i++){ in>>user[i].getname();in>>user[i].getphone_num();nElem++;}in.close();}~UserDatabase() //析构函数,将user[]写入user.txt文件中{ fstream out;Fphone *p=NULL;p=user;out.open("user.txt",ios::out,filebuf::sh_none);for(int i=0;i<nElem;i++){ out<<setw(20)<<((p+i)->getname())<<setw(15)<<((p+i)->getphone_num())<<endl;}delete []user;out.close();}void clear() //删除所有用户信息{ char ord;cout<<"确定删除吗?(选择:[y]是;[n]否)\a\a"<<endl;do{ cin>>ord;if(ord=='N'||ord=='n') return;else if(ord=='Y'||ord=='y'){ delete[Maxu]user;user=0;cout<<"删除成功啦!"<<endl;nElem=0;return;}else cout<<"请重新输入(选择:[y]是;[n]否)\a\a"<<endl;}while(ord!='n'||ord!='N'||ord!='y'||ord!='Y');}void add_record(char *na,char*ph_num) //添加用户信息,插入用户后仍按升序排列{ if (nElem==0){ nElem++;user->setname(na);user->setphone_num(ph_num);}else if(nElem<Maxu){ for(int i=nElem-1;i>=0;i--){ if(strcmp((user+i)->getname(),na)>0){ (user+i+1)->setname(((user+i)->getname()));(user+i+1)->setphone_num(((user+i)->getphone_num()));}else break;}(user+i+1)->setname(na);(user+i+1)->setphone_num(ph_num);nElem++;}else cout <<"空间不足,无法添加!"<<endl;}Fphone *getuser() //返回user指针{ return(user); }void delete_record(Fphone *p,int k) //删除用户信息{ char con;cout<<"确认删除?(Y/N)";cin>>con;if (con=='N'||con=='n') return;else if (con=='Y'||con=='y'){ for(int i=k;i<nElem;i++){ user[i]=user[i+1]; }nElem--;cout<<"已删除!"<<endl;return;}else{ cout<<"输入错误!"<<endl;system("pause");return;}}void modify_record(Fphone *p,char*ph_num)//修改用户信息{p->setphone_num(ph_num);}Fphone *query(char *na) //按姓名查找顺序查找,这里也可以用折半{ Fphone *p=user;int i=0;while(1){ if(strcmp(p->getname(),na)==0)return p;p++;if(i++==nElem)break;}return NULL;}void sorta_name() //按姓名升序排序插入排序法{ Fphone temp;int i,j;for(i=1;i<nElem;i++){ temp=user[i];for(j=i-1;j>=0&&(strcmp(temp.getname(),user[j].getname())<0);j--){ strcpy(user[j+1].getname(),user[j].getname());strcpy(user[j+1].getphone_num(),user[j].getphone_num());}strcpy(user[j+1].getname(),temp.getname());strcpy(user[j+1].getphone_num(),temp.getphone_num());}}void sorta_phonenum() //按电话号码升序排序选择排序法{ int i,j,p;Fphone temp;for(i=0;i<nElem-1;i++){ p=i;for(j=i+1;j<nElem;j++)if(strcmp(user[j].getphone_num(),user[p].getphone_num())<0) p=j;if(p!=i){ strcpy(temp.getname(),user[p].getname());strcpy(temp.getphone_num(),user[p].getphone_num());strcpy(user[p].getname(),user[i].getname());strcpy(user[p].getphone_num(),user[i].getphone_num());strcpy(user[i].getname(),temp.getname());strcpy(user[i].getphone_num(),temp.getphone_num());}}}void sort_name() //按姓名降序排序,将排成升序的对象数组逆向放置{ Fphone temp;int i,m=(nElem+1)/2;for(i=0;i<m;i++){ strcpy(temp.getname(),user[i].getname());strcpy(temp.getphone_num(),user[i].getphone_num());strcpy(user[i].getname(),user[nElem-i-1].getname());strcpy(user[i].getphone_num(),user[nElem-i-1].getphone_num());strcpy(user[nElem-i-1].getname(),temp.getname());strcpy(user[nElem-i-1].getphone_num(),temp.getphone_num());}}void sort_phonenum() //按电话号码降序排序冒泡排序法{ Fphone temp;int i,m=(nElem+1)/2;for(i=0;i<m;i++){ strcpy(temp.getname(),user[i].getname());strcpy(temp.getphone_num(),user[i].getphone_num());strcpy(user[i].getname(),user[nElem-i-1].getname());strcpy(user[i].getphone_num(),user[nElem-i-1].getphone_num());strcpy(user[nElem-i-1].getname(),temp.getname());strcpy(user[nElem-i-1].getphone_num(),temp.getphone_num());}}void disp(){ int i,n=0;cout<<setw(22)<<"姓名"<<setw(14)<<"电话号码"<<endl;for(i=0;i<nElem;i++){cout<<setw(22)<<(user+i)->getname()<<setw(14)<<(user+i)->getphone_num()<<endl;n++;if(n%10==0){ system("pause");system("cls");}}cout<<endl;}};void menu(){ cout<<" 请选择以下功能:"<<endl;cout<<" 1-增加记录"<<endl;cout<<" 2-修改记录"<<endl;cout<<" 3-删除记录"<<endl;cout<<" 4-查找(按姓名)"<<endl;cout<<" 5-排序"<<endl;cout<<" 6-显示记录"<<endl;cout<<" 7-全删"<<endl;cout<<" 0-退出"<<endl;cout<<" 输入选择:"<<endl;}void main(){ cout<<"************************************************** "<<endl;cout<<" "<<endl;cout<<" 欢迎使用电话簿管理系统"<<endl;cout<<" 祝您使用愉快"<<endl;cout<<" "<<endl;cout<<"***************************************************** "<<endl;system("pause");while(1){ UserDatabase s;system("cls");menu();int k;cin>>k;switch(k){ case 1:{ system("cls")cout<<"*****************************************"<<endl;cout<<" 增加记录"<<endl;char na[20],ph_num[12];Fphone *t=NULL;char w;do{ cout<<"请输入您要增加的用户的姓名";cin>>na;t=(s.query(na));if(t){ cout<<"用户已经存在,添加失败!!!"<<endl; }else{ cout<<"请输入用户的电话号码";cin>>ph_num;s.add_record(na,ph_num);cout<<"您添加的信息为:";cout<<"姓名:"<<na<<'\t'<<"电话号码:"<<ph_num<<endl;cout<<"成功添加"<<endl;}cout<<"是否继续?(Y or N)"<<endl;cin>>w;}while(w=='Y');break;}case 2:{ system("cls");cout<<"***************************************"<<endl;cout<<" 修改记录"<<endl;cout<<"***************************************"<<endl;char na[M],ph_num[N];Fphone *t=NULL;char w;do{ cout<<"请输入您要修改的用户的姓名";cin>>na;t=s.query(na);if(!t)cout<<"没有该用户!"<<endl;else{ cout<<"该用户原号码为:"<<t->getphone_num()<<endl;cout<<"请输入新的电话号码";cin>>ph_num;s.modify_record(t,ph_num);cout<<"成功修改"<<endl;}cout<<"是否继续?(Y or N)"<<endl;cin>>w;}while(w=='Y');break;}case 3:{ system("cls");cout<<"********************************************"<<endl;cout<<" 删除记录"<<endl;cout<<"************** ***************************"<<endl;char w;char na[M];int k;Fphone *p;do{ cout<<"请输入您要删除的用户的姓名";cin>>na;p=s.query(na);if(p==0)cout<<"没有该用户!"<<endl;else{ (*p).disp();k=p-s.getuser();s.delete_record(p,k);}cout<<"是否继续?(Y or N)"<<endl;cin>>w;}while(w=='Y');break;}case 4:{ system("cls");cout<<"*********************************"<<endl;cout<<" 查询记录"<<endl;cout<<"**********************************"<<endl;char na[M];int p=1;Fphone *t=NULL;char w;do{ cout<<"请输入您要查询的用户的姓名";cin>>na;t=s.query(na);if(t){cout<<"姓名:"<<t->getname()<<endl;cout<<"电话号码:"<<t->getphone_num()<<endl;}elsecout<<"对不起,没有此人信息!"<<endl;cout<<"是否继续?(Y or N)"<<endl;cin>>w;}while(w=='Y');break;}case 5:{ system("cls");cout<<" 请选择排序方式"<<endl;cout<<" 1.按姓名(升序) "<<endl;cout<<" 2.按电话号码(升序) "<<endl;cout<<" 3.按姓名(降序) "<<endl;cout<<" 4.按电话号码(降序) "<<endl;cout<<" 请输入你的选择:"<<endl;int k;cin>>k;switch(k){ case 1:s.sorta_name();cout<<"排序完成"<<endl;system("cls");break;case 2:s.sorta_phonenum();cout<<"排序完成"<<endl;system("cls");break;case 3:s.sort_name();cout<<"排序完成"<<endl;system("cls");break;case 4:s.sort_phonenum();cout<<"排序完成"<<endl;system("cls");break;}}case 6:{ system("cls");cout<<"*****************************************"<<endl;cout<<" 显示记录"<<endl;cout<<"*****************************************"<<endl;s.disp();system("pause");break;}case 7:{ system("cls");cout<<"您确定要删除所有记录吗?(Y or N)"<<endl;char q;cin>>q;if(q=='Y'||q=='y'){ cout<<"*********************************"<<endl;cout<<" 全部删除记录"<<endl;cout<<"*********************************"<<endl;s.clear();}else break;system("pause");break;}case 0:{ system("cls");cout<<"谢谢使用,再见!"<<endl;exit(0);}default:cout<<"不存在该选择,请重新输入要进行的操作:"<<endl;system("pause");break;}}}七.感想与心得1.电话簿管理程序较长,算法比较复杂,调试的过程中遇到了各种各样的问题。

相关主题