📄 telphone.cpp
字号:
/*-------------------------------------------------------
课程设计----电话簿管理
--------------------------------------------------------*/
#include<iostream.h>
#include<string.h>
#include<stdlib.h>
#include <ctype.h>
#include <iomanip.h>
#include <fstream.h>
void DispalyMenu()//显示主菜单
{ char *menu[]={ " 1. 增加记录",
" 2. 删除记录",
" 3. 显示所有记录",
" 4. 查找显示(按姓名)",
" 5. 查找修改记录(按姓名)",
" 6. 从正文件中添加数据到库表",
" 7. 将库表中的数据写入正文文件",
" 8. 排序",
" 9. 退出",
NULL
};
cout<<"\n\n =====通讯录管理程序===== \n\n";
for(int i=0; menu[i]!=NULL; i++) cout<<menu[i]<<endl;
cout<<"\n======================================= \n";
cout<<"请选择: ";
}
class Node //通讯录记录格式类
{
char Name[10]; //姓名
int OfficePhone; //办公室电话
int HomePhone; //住宅电话
char MobilePhone[15]; //手机号码
char Email[20]; //email地址
Node *Next; //下一结点指针
public:
Node(char na[10]="mao",int op=0,int hp=0,char
mp[15]="6",char em[20]="66") //带缺省值的构造函数
{
strcpy(Name,na);
OfficePhone=op;
HomePhone=hp;
strcpy(MobilePhone,mp);
strcpy(Email,em);
}
void Show() //显示结点数据
{
cout<<setw(10)<<Name<<setw(11)<<OfficePhone<<"(O)"
<<setw(11)<<HomePhone<<"(H)"<<setw(14)<<MobilePhone
<<"(M)"<<setw(10)<<Email<<endl;
}
void SetName(char na[]) //修改姓名
{ strcpy(Name,na); }
void SetOfficePhone(int op) //修改办公室电话
{ OfficePhone=op; }
void SetHomePhone(int hp) //修改住宅电话
{ HomePhone=hp; }
void SetMobilePhone(char mp[]) //修改手机号码
{ strcpy(MobilePhone,mp); } //修改email地址
void SetEmail(char em[])
{ strcpy(Email,em); } //将AddrList类说明为友元类
friend class AddrList;
friend void addfromtxtfile(AddrList &);//将addfromtxtfile说明为友元函数
friend void writetotxtfile(AddrList &);//将writetotxtfile说明为友元函数
};
class AddrList //链表类
{
Node *HeadPtr; //链表首指针
Node *TailPtr; //链表尾指针
int Tag;
public:
AddrList() //构造函数,产生空链表,将Tag的值置为1
{
HeadPtr=NULL;
TailPtr=NULL;
Tag=1; /*排序状态标志,当Tag=1时,表示按姓名排序
当Tag=2时,表示按办公室电话排序*/
}
void AddTail(Node *p); //将p指向的结点加入到链表尾部
void AddSort(Node *p); //将p指向的结点按Tag值指定的顺序插入到链表中
Node *LookUp(char *name); //按姓名查找结点,返回结点指针
void Delete(char *name); //删除指定姓名的结点
void Sort(int tag); //按Tag指定的关键字重新排序
void ShowAll(); //显示全部结点,每十个显示一屏
void SetTag(int t) //置tag的值
{ Tag=t; }
int GetTag() //取tag的值
{ return Tag; }
Node *GetHeadPtr() //取首指针
{ return HeadPtr; }
~AddrList() //释放链表空间
{
Node *p1;
while(HeadPtr)
{
p1=HeadPtr;
HeadPtr=HeadPtr->Next;
delete p1;
}
}
void CreatList(char *filename); //从二进制文件中读入数据,构造链表
void WriteToFile(char *filename); //将链表中数据写入指定的二进制文件
};
void AddrList::AddTail(Node *p)
{ if(HeadPtr==NULL)
{HeadPtr=TailPtr=p;p->Next=NULL;}
else
{
for(Node *p1=HeadPtr;p1;p1=p1->Next)
{
TailPtr->Next=p;
TailPtr=p;
TailPtr->Next=NULL;
}
}
}
void AddrList::AddSort(Node*p) //将P指向的结点按Tag指定的顺序插入到链表中(待改正)
{
Node*p1,*p2;
if(Tag==1) //当Tag=1时,按姓名顺序插入
{
if(HeadPtr==NULL) //链表为空的时候
{p->Next=NULL;HeadPtr=TailPtr=p;}
else if(strcmp(HeadPtr->Name,p->Name)>0)//插在首部
{p->Next=HeadPtr;HeadPtr=p;}
else if(strcmp(TailPtr->Name,p->Name)<0)//插在尾部
{TailPtr->Next=p;p->Next=NULL;TailPtr=p;}
else //插在中间
{
p2=HeadPtr;
while(p2&&strcmp(p->Name,p2->Name)>0)//找到应该插入的位置
{p1=p2;p2=p2->Next;}
p->Next=p2;p1->Next=p;
}
}
else //按办公室电话插入
{
if(HeadPtr==NULL) //链表为空的时候
{p->Next=NULL;HeadPtr=TailPtr=p;}
else if(HeadPtr->OfficePhone>p->OfficePhone)//插在首部
{p->Next=HeadPtr;HeadPtr=p;}
else if(TailPtr->OfficePhone<p->OfficePhone)//插在尾部
{TailPtr->Next;p->Next=NULL;TailPtr=p;}
else //插在中间
{
p2=HeadPtr;
while(p2&&((p->OfficePhone)>(p2->OfficePhone)))//找到应该插入的位置
{p1=p2;p2=p2->Next;}
p->Next=p2;p1->Next=p; //插在链表中间
}
}
}
void AddrList::Sort (int Tag)
{
if(HeadPtr)
{
int num=0;
Node*p=HeadPtr;
while(p)
{
num++;
p=p->Next;
} //获取链长(num)
Node**po;
po=new Node*[num]; //指针数组
p=HeadPtr;
for(int i=0;i<num;i++)
{
po[i]=p;
p=p->Next;
} //给数组赋值
switch(Tag)
{
case 1:int i;char s[12];
for(i=1;i<num;i++)
{
Node*pp=po[i];
strcpy(s,po[i]->Name);
int j=i-1;
while(j>=0&&strcmp(s,po[j]->Name)<=0)
{
po[j+1]=po[j];
j--;
}
po[j+1]=pp;
}
break;
case 2:int ii,office;
for(ii=1;ii<num;ii++)
{
Node*pp=po[ii];
office=po[ii]->OfficePhone;
int j=ii-1;while(j>=0&&(office-po[j]->OfficePhone)<=0)
{
po[j+1]=po[j];j--;
}
po[j+1]=pp;
}
break;
}
for(int k=0;k<num-1;k++)
{
po[k]->Next=po[k+1];
}
po[num-1]->Next=NULL;
HeadPtr=po[0];
TailPtr=po[num-1];
delete []po;
}
}
Node* AddrList::LookUp(char *name)
{
Node*p;
p=HeadPtr;
while(p!=NULL)
{
if(strcmp(p->Name,name)==0)return p;//找到结点,返回该结点指针
p=p->Next;
}
return NULL;
}
void AddrList::Delete(char *name)
{
Node *p1,*p2;
p1=HeadPtr;
while(p1&&strcmp(p1->Name,name))
{
p2=p1;
p1=p1->Next;
}
if(strcmp(p1->Name,name)) cout<<"无此记录!"<<endl;
else
{
if(strcmp(HeadPtr->Name,name)==0)
{p1=HeadPtr;HeadPtr=HeadPtr->Next;delete p1;cout<<"已删除!\n"; }
else
{
p2->Next=p1->Next;
delete p1;
cout<<"已删除!\n";
}
}
}
void AddrList::ShowAll()
{
Node *p;
p=HeadPtr;
while(p)
{
system("cls");
for(int j=0;j<10;j++)
{
p->Show();p=p->Next;
if(p==NULL) break;
}
system("pause");
}
cout<<endl;
}
#define LEN sizeof(class Node)
void AddrList::CreatList(char *filename) //从二进制文件中读入数据,构建链表
{
int tag;int n;Node*p;
fstream infile(filename,ios::in|ios::binary);
if(!infile)
{cout<<"Can not open input file"<<filename<<endl;exit(1);}
infile.read((char*)&tag,sizeof(int)); //读入Tag值
infile.read((char*)&n,sizeof(int)); //读入记录数
Tag=tag;
for(int i=0;i<n;i++)
{
p=new Node;
infile.read((char*)p,LEN);
AddTail(p);
}
infile.close();
}
void AddrList::WriteToFile(char*filename) //将链表中数据写入指定的二进制文件中
{
fstream outfile;
outfile.open(filename,ios::out|ios::binary);
if(!outfile)
{cout<<"Can not open output file:"<<filename<<endl;exit(2);}
Node*p,*p1;
p=HeadPtr;p1=HeadPtr;
int i=0;
while(p){i++;p=p->Next;} //计算出记录数
outfile.write((char*)&Tag,sizeof(int));
outfile.write((char*)&i,sizeof(int));
for(int j=0;j<i;j++)
{outfile.write((char*)p1,LEN);p1=p1->Next;}
outfile.close();
}
void add(AddrList &addrlist)
{
char na[10],mp[15],em[20];
int op,hp;
char ch='y';
while(ch=='y')
{
Node *p,*p1;
p=new Node;
cout<<"请输入你要添加的人的姓名\n";
cin>>na;
p1=addrlist.LookUp(na);
if(p1)
{
cout<<"此人已经存在!\n";
p1->Show();
}
else
{
cout<<"此人不存在,可以添加!\n";
p->SetName(na);
cout<<"请输入你要添加的人的办公室号码:\n";
cin>>op;p->SetOfficePhone(op);
cout<<"请输入你要添加的人的住宅号码:\n";
cin>>hp;p->SetHomePhone(hp);
cout<<"请输入你要添加的人的手机号码:\n";
cin>>mp;p->SetMobilePhone(mp);
cout<<"请输入你要添加的人的email地址:\n";
cin>>em;p->SetEmail(em);
addrlist.AddSort(p);
cout<<"添加成功!\n";
p->Show();
}
cout<<"是否继续添加?是(y)否(n)";
cin>>ch;
}
system("pause");
}
void del(AddrList &addrlist)
{
char na[10],ch='y',c;
Node *p;
while(ch=='y')
{
cout<<"请输入你要删除的人的姓名:\n";
cin>>na;
p=addrlist.LookUp(na); //找到结点位置
if(!p) cout<<"没有此人记录:\n";
else
{
p->Show();
cout<<"你确认要把"<<na<<"删除吗?是(y) 否(n)\n";
cin>>c;
if(c=='y')
{
addrlist.Delete(na);
cout<<"已删除!\n";
}
}
cout<<"时否继续删除?是(y)否(n)\n";
cin>>ch;
}
system("pause");
}
void showall(AddrList &addrlist)
{
if(addrlist.GetHeadPtr()==NULL)
{
cout<<"电话簿不存在!"<<endl;
system("pause");
}
addrlist.ShowAll();
}
void query(AddrList &addrlist) //按姓名查找并显示记录
{
char na[10],ch='y';
while(ch=='y')
{
Node *p;
cout<<"请输入你要查找的人的姓名:";
cin>>na;
p=addrlist.LookUp(na); //找到结点位置
if(!p) cout<<"查无记录!"; //结点不空的时候输出数据
else p->Show();
cout<<"是否继续查找?是(y)否(n)\n";
cin>>ch;
}
system("pause");
}
void modify(AddrList &addrlist)
{
char name[10],ch='y';
while(ch=='y')
{
Node *p;
p=new Node;
char c,na[10],mp[15],em[20];
int op,hp;
cout<<"请输入您要修改的人的姓名:\n";
cin>>name;
p=addrlist.LookUp(name);
if(!p)
{
cout<<"没有此人记录!\n";
cout<<"是否继续修改?是(y)否(n)\n";
cin>>ch;
}
else
{
p->Show();
cout<<"是否继续修改?是(y)否(n)\n";
cin>>c;
if(c=='y')
{
system("cls");
cout<<"\n\n\t===========修改记录!==============\n\n";
cout<<"\t\t(1)修改姓名\n"<<"\t\t(2)修改办公室电话\n";
cout<<"\t\t(3)M修改住宅电话\n"<<"\t\t(4)修改手机\n";
cout<<"\t\t(5)修改Email\n";
cout<<"\t\t(6)退出\n";
cout<<"\n\t==================================\n";
cout<<"请选择:";
int choice,state;
cin>>choice;
state=cin.rdstate();
if(state) //处理非法输入
{
char str[80];
cin.clear();
cin.getline(str,80);
cout<<str<<"错误!请重新选择\n";
cin>>choice;
}
switch(choice)
{
case 1:{
cout<<"请输入新的姓名:";
cin>>na;
p->SetName(na); //修改姓名
if(addrlist.GetTag()==1)
{
cout<<"**"<<endl;
addrlist.Delete(na);
cout<<""<<endl;
addrlist.AddSort(p);
}
};break;
//修改后若Tag值为1,重新排序;
case 2:{
cout<<"请输入新的办公室号码:";
cin>>op;p->SetOfficePhone(op);//修改办公室电话
if(addrlist.GetTag()==2) //若Tag值为2,重新排序
{addrlist.Delete(na);addrlist.AddSort(p);}
};break;
case 3:{
cout<<"请输入新的住宅号码:";
cin>>hp;p->SetHomePhone(hp);
};break; //修改住宅电话
case 4:{
cout<<"请输入新的手机号码:";
cin>>mp;p->SetMobilePhone(mp);
};break; //修改手机号码
case 5:{
cout<<"请输入新的人的Email:";
cin>>em;p->SetEmail(em);
}break; //修改email地址
case 6:break;
default:;
}
}
cout<<"修改成功!\n";
p->Show();
cout<<"是否继续修改?是(y)否(n)\n";
cin>>ch;
}
}
system("pause");
}
void addfromtxtfile(AddrList &addrlist)
{
char filename[80];int n;
Node *p;
cout<<"输入源数据的文本文件的名称";
cin>>filename;
fstream file;
file.open(filename,ios::in|ios::nocreate);
if(!file) { cout<<"无法打开"<<filename<<endl; }
else
{ file>>n;
for(int i=0;i<n;i++) //循环地读入数据
{ p=new Node;
file>>p->Name;
file>>p->OfficePhone;
file>>p->HomePhone;
file>>p->MobilePhone;
file>>p->Email;
addrlist.AddSort(p);
}
cout<<"记录已经被读入库表中!\n";
}
file.close();
system("pause");
}
void writetotxtfile(AddrList &addrlist)
{
char filename[80];
cout<<"输入想要输出数据的文本文件名称";
cin>>filename;
fstream outfile(filename,ios::out);
if(!outfile)
{cout<<"无法打开"<<filename<<endl;}
else
{ Node *p1=addrlist.GetHeadPtr();
while(p1) //导出数据
{
outfile<<setw(10)<<p1->Name<<setw(11)<<p1->OfficePhone
<<"(O)"<<setw(11)<<p1->HomePhone<<"(H)"<<setw(14)
<<p1->MobilePhone<<"(M)"<<setw(10)<<p1->Email<<endl;
p1=p1->Next;
}
cout<<"记录已经加入到文件中!\n";
}
}
void sort(AddrList &addrlist)
{
int choice;
cout<<"1.按姓名排序\n"<<"2.按办公室电话排序\n"<<"请选择:";
cin>>choice;
if(cin.rdstate())
{
char str[80];cin.clear();cin.getline(str,80);
cout<<str<<"非法输入,请重新输入!\n";cin>>choice;
}
switch(choice)
{
case 1:{addrlist.Sort(1);cout<<"排序完成!\n";}break;
case 2:{addrlist.Sort(2);cout<<"排序完成!\n";}break;
default:;
}
}
void quit(AddrList &addrlist)
{
addrlist.WriteToFile("040510222毛明川.dat");//把数据存放到addrlist.dat文件中,退出系统
exit(9);
}
void main()
{
int choice=0, state;
AddrList addrlist;
while(choice!=9)
{
system("cls");
DispalyMenu();
cin>>choice;
state = cin.rdstate();
if(state||choice<0||choice>9) // 处理非法输入,如输入一个字符
{
cerr<<"Choose again:";
if(state)
{
char str[80]; cin.clear(); cin.getline(str,80); }
cin>>choice;
state=cin.rdstate();
}
switch(choice)
{
case 1: add(addrlist); break;
case 2: del(addrlist); break;
case 3: showall(addrlist); break;
case 4: query(addrlist); break;
case 5: modify(addrlist); break;
case 6: addfromtxtfile(addrlist); break;
case 7: writetotxtfile(addrlist); break;
case 8: sort(addrlist); break;
case 9: quit(addrlist); break;
default: ;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -