⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 communications.txt

📁 这是我编的一个通讯录的小程序
💻 TXT
字号:
/*☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
C++课程设计--通讯录管理程序
作者:韩道儒
学号:020510610
完成时间:2006.6.18
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆*/
#include
#include
#include
#include
#include
#include
void DisplayMenu()//主菜单
{
char *menu[]={"\t\t\t1.增加记录",
"\t\t\t2.删除记录",
"\t\t\t3.显示所有记录",
"\t\t\t4.按姓名查找并显示一个记录",
"\t\t\t5.按姓名查找并修改一个记录",
"\t\t\t6.从正文文件中添加数据到库表中",
"\t\t\t7.将库表中的数据写入正文文件",
"\t\t\t8.排序库表\n\n",
"\t\t\t9.退出系统",
NULL};
cout<<"\n\n\t\t★★★★★欢迎使用通讯录管理系统!★★★★★ \n\n";
for(int i=0; menu[i]; i++) cout< cout<<"\n\t\t★★★★★★★★★★★★★★★★★★★★★★\n";
cout<<"请输入相应功能的序号:";
}
//功能5有子菜单:
void ShowModiMenu()
{ char *submenu[]={"(1) 修改姓名",
"(2) 修改办公室电话",
"(3) 修改住宅电话",
"(4) 修改手机号码",
"(5) 修改email地址\n",
"(0) 不修改,返回主菜单",
NULL};
cout< for(int i=0; submenu[i]; i++) cout< cout<<"请输入选择:";
}
//结点类
class Node
{
char Name[10];//姓名
char OfficePhone[15];//办公室电话
char HomePhone[15];//住宅电话
char MobilePhone[15];//手机号码
char EMail[20];//email地址
Node *Next;//下一结点指针
public:
Node(char *pname=NULL, char *ophone=NULL, char *hphone=NULL,
char *pmphone=NULL, char *pemail=NULL)
//构造函数,各参数均有缺省值
{
if(pname) strcpy(Name, pname);
else strcpy(Name, " ");
if(ophone) strcpy(OfficePhone, ophone);
else strcpy(OfficePhone, " ");
if(hphone) strcpy(HomePhone, hphone);
else strcpy(HomePhone, " ");
if(pmphone) strcpy(MobilePhone, pmphone);
else strcpy(MobilePhone, " ");
if(pemail) strcpy(EMail, pemail);
else strcpy(EMail, " ");
}
void Show()//显示结点数据
{
cout< <<"(O)"< < }
void SetName(char *s)//修改姓名
{strcpy(Name, s);}
void SetOfficePhone(char *op)//修改办公室电话
{strcpy(OfficePhone, op);}
void SetHomePhone(char *hp)//修改住宅电话
{strcpy(HomePhone, hp);}
void SetMobilePhone(char *s)//修改手机号码
{strcpy(MobilePhone, s);}
void SetEMail(char *s)//修改email地址
{strcpy(EMail, s);}
friend class AddrList;//将AddrList类说明为友元类
friend void addfromtxtfile(AddrList &);//将addfromtxtfile说明为友元函数
friend void writetotxtfile(AddrList &);//将writetotxtfile说明为友元函数
};
//链表类
class AddrList
{
Node *HeadPtr;//链表首指针
Node *TailPtr;//链表尾指针
int Tag;//排序状态标志,当Tag=1时,按姓名排序
//当Tag=2时,按办公室电话排序
public:
//成员函数
AddrList(Node *head=NULL, Node *tail=NULL, int tag=1)
//构造函数,产生空链表,将tag的值置为1
{
HeadPtr=head;
TailPtr=tail;
Tag=tag;
}
void AddTail(Node *p)//将p指向的结点加入到链表尾部
{
if(HeadPtr==NULL)
{
HeadPtr=p;
TailPtr=p;
p->Next=NULL;
}
else
{
TailPtr->Next=p;
p->Next=NULL;
TailPtr=p;
}
}
void AddSort(Node *p)//将p指向的结点按Tag指定的顺序插入到链表中
{
Node *p1, *p2;
if(Tag==1)//按姓名排序
{
if(HeadPtr==NULL)//如果插入前原始链表为空链表
{
HeadPtr=p;
TailPtr=p;
p->Next=NULL;
}
else
{
if(strcmp(p->Name, HeadPtr->Name)<=0)//插在链表首部
{
p->Next=HeadPtr;
HeadPtr=p;
}
else//插在链表中间或尾部
{ 
p1=HeadPtr;
p2=HeadPtr;
while(p2->Next&&(strcmp(p2->Name, p->Name)<0))
//查找待插入位置
{p1=p2; p2=p2->Next;}
if(strcmp(p2->Name, p->Name)<0)//插在链表尾部
{p2->Next=p; p->Next=NULL; TailPtr=p;}
else//插在链表中间,p2之前
{p->Next=p2; p1->Next=p;}
}
}
}
else//按办公室电话排序
{
if(HeadPtr==NULL)//如果插入前原始链表为空链表
{
HeadPtr=p;
TailPtr=p;
p->Next=NULL;
}
else
{
if(strcmp(p->OfficePhone, HeadPtr->OfficePhone)<=0)//插在链表首部
{
p->Next=HeadPtr;
HeadPtr=p;
}
else//插在链表中间或尾部
{
p1=HeadPtr;
p2=HeadPtr;
while(p2->Next&&(strcmp(p2->OfficePhone, p->OfficePhone)<0))
//查找待插入位置
{p1=p2; p2=p2->Next;}
if(strcmp(p2->OfficePhone, p->OfficePhone)<0)//插在链表尾部
{p2->Next=p; p->Next=NULL; TailPtr=p;}
else//插在链表中间,p2之前
{p->Next=p2; p1->Next=p;}
}
}
}
}
Node *LookUp(char *name)//按姓名查找结点,返回该结点指针
{
Node *p;
p=HeadPtr;
while(p!=NULL)
{
if(strcmp(p->Name, name)==0) return p;
p=p->Next;
}
return NULL;
}
void 删除(char *name)//删除指定姓名的结点
{
Node *p1, *p2;
if(strcmp(HeadPtr->Name, name)==0)//若待删除的结点为首结点
{
p1=HeadPtr;
HeadPtr=HeadPtr->Next;
删除 p1;
cout<<"删除了联系人"< system("pause");
}
else//删除其他结点
{
p1=HeadPtr;
p2=HeadPtr;
while(strcmp(p2->Name, name)!=0&&p2->Next!=NULL)
{
p1=p2;
p2=p2->Next;
}
if(strcmp(p2->Name, name)==0)
{
p1->Next=p2->Next;
删除 p2;
cout<<"删除了一个联系人的信息!"< system("pause");
}
}
}
void Sort(int tag)//按tag指定的关键字重新排序
{
Node *p1, *p2;
Tag=tag;
p2=HeadPtr;
HeadPtr=NULL;
TailPtr=NULL;
while(p2)
{
p1=p2->Next;
AddSort(p2);
p2=p1;
}
TailPtr->Next=NULL;
}
void ShowAll()//显示全部结点,每10个显示一屏
{
int n=0;
Node *p;
if(HeadPtr==NULL)
{
cout<<"链表为空,没有记录可显示!"< }
else for(p=HeadPtr; p!=NULL; p=p->Next)
{
p->Show();
n++;
if(n%10==0) {cout<<"按任意键显示下一屏:"< }
}
void SetTag(int t)//置Tag值
{Tag=t;}
int GetTag()//取tag值
{return Tag;}
Node *GetHeadPtr()//取首指针
{return HeadPtr;}
~AddrList()//释放链表空间
{
Node *p;
if(HeadPtr==NULL) ;
else
{
while(HeadPtr)
{
p=HeadPtr;
HeadPtr=HeadPtr->Next;
删除 p;
}
}

}
void CreateList(char *filename)//从二进制文件中读入数据,
//构造链表
{
ifstream infile(filename, ios::in|ios::binary|ios::nocreate);
if(!infile) {cout<<"文件"< //如果文件不存在,直接返回,空表
else
{
infile.read((char *)&Tag, 4);//读出二进制文件的第1个数据Tag
int n;
infile.read((char *)&n, 4);//读出记录数
cout<<"正在从数据中加载"< Node *p;
for(int i=0; i {
p=new Node;
infile.read((char *)p, sizeof(Node));
AddTail(p);
}
}
infile.close();
cout<<"数据从二进制文件加载成功!"< }
void WriteToFile(char *filename)//将链表中数据
//写入指定的二进制文件
{
ofstream outfile;
outfile.open(filename, ios::out|ios::binary);
outfile.write((char *)&Tag, 4);
Node *p, *p1;
int n=0;
for(p1=HeadPtr; p1!=NULL; p1=p1->Next) n++;
outfile.write((char *)&n, 4);
p=HeadPtr;
while(p)
{
outfile.write((char *)p, sizeof(Node));
p=p->Next;
}
cout<<"成功导出二进制文件!共有"< outfile.close();
}
};
//以下为处理函数
void add(AddrList &addrlist)//增加记录,按照当前排序标志Tag
//插入结点,插入结点后,链表仍然
//保持有序
{
cout<<"请输入姓名、办公室电话、住宅电话、手机号码、email地址(以空格、Tab或回车分隔):"
< char n[10], op[15], hp[15], mp[15], em[20];
cin>>n>>op>>hp>>mp>>em;
Node *p;
p=new Node(n, op, hp, mp, em);
p->Show();
addrlist.AddSort(p);
cout<<"添加成功!是否继续添加?[y/n]";
char t;
cin>>t;
if(t=='y') add(addrlist);
}
void del(AddrList &addrlist)//删除记录
{
if(addrlist.GetHeadPtr()==NULL)
{cout<<"链表为空,没有记录可删!"< cout<<"请输入要删除的联系人的姓名:";
char n[10]; cin>>n;
Node *p;
p=addrlist.LookUp(n);
if(p==NULL) {cout<<"链表上没有联系人"< p->Show();
cout<<"确认删除?[y/n]";
char t;
cin>>t;
if(t=='y') addrlist.删除(n);
}
void showall(AddrList &addrlist)//显示所有记录
{
addrlist.ShowAll();
system("pause");
}
void query(AddrList &addrlist)//按姓名查找并显示一条记录
{
if(addrlist.GetHeadPtr()==NULL)
{cout<<"链表为空,没有联系人可查找!"< cout<<"请输入要查找的联系人的姓名:";
char n[10]; cin>>n;
Node *p;
p=addrlist.LookUp(n);
if(p==NULL)
{cout<<"没有"< cout<<"该联系人的记录为:"< p->Show();
system("pause");
}
void modify(AddrList &addrlist)//按姓名修改一条记录
//当修改姓名后,如果当前排序关键字
//为姓名,需重新排序。当修改办公室
//电话后,如果当前排序关键字为办公室
//电话,需重新排序。
{
if(addrlist.GetHeadPtr()==NULL)
{cout<<"链表为空,没有记录可修改!"< cout<<"请输入要修改的联系人的姓名:";
char n[10]; cin>>n;
Node *p;
p=addrlist.LookUp(n);
if(p==NULL)
{cout<<"没有"< cout<<"该联系人的记录为:"< p->Show();
ShowModiMenu();
int m, state;
cin>>m;
state=cin.rdstate();
while(state||((m<1||m>5)&&m!=0))
{
cout<<"请重新输入选择:"< if(state) {char str[80]; cin.clear(); cin.getline(str, 80);}
cin>>m;
state=cin.rdstate();
}
if(m==1)//修改姓名
{
cout<<"请输入修改后的姓名:"; char n[10];
cin>>n; p->SetName(n); cout<<"修改成功!新的记录为:"< p->Show();
if(addrlist.GetTag()==1) addrlist.Sort(1);//判断是否需要重新排序
system("pause");
}
else if(m==2)//修改办公室电话
{
cout<<"请输入修改后的办公室电话:"; char op[15];
cin>>op; p->SetOfficePhone(op); cout<<"修改成功!新的记录为:"< p->Show();
if(addrlist.GetTag()==2) addrlist.Sort(2);//判断是否需要重新排序
system("pause");
}
else if(m==3)//修改住宅电话
{
cout<<"请输入修改后的住宅电话:"; char hp[15];
cin>>hp; p->SetHomePhone(hp); cout<<"修改成功!新的记录为:"< p->Show();
system("pause");
}
else if(m==4)//修改手机号码
{
cout<<"请输入修改后的手机号码:"; char mp[15];
cin>>mp; p->SetMobilePhone(mp); cout<<"修改成功!新的记录为:"< p->Show();
system("pause");
}
else if(m==5)//修改email地址
{
cout<<"请输入修改后的email地址:"; char em[20];
cin>>em; p->SetEMail(em); cout<<"修改成功!新的记录为:"< p->Show();
system("pause");
}
else if(m==0)//不修改,返回主菜单
{return;}
}
void addfromtxtfile(AddrList &addrlist)//从正文文件中添加数据到库表中
{
cout<<"请输入源文件的文件名(扩展名为txt):";
char filename[80];
cin.get();
cin.getline(filename, 80);
ifstream in;
in.open(filename, ios::in|ios::nocreate);
if(!in)
{
cout<<"无法打开源文件"< system("pause"); return;
}
int n;
in>>n; cout<<"正在添加"< char name[10], op[15], hp[15], mp[15], em[20];
Node *p; 
while(in>>name>>op>>hp>>mp>>em)
{
p=new Node(name, op, hp, mp, em);
addrlist.AddSort(p);
}
in.close();
cout<<"记录从正文文件添加成功!"< system("pause");
}
void writetotxtfile(AddrList &addrlist)//将库表中的数据导出到正文文件
{
cout<<"请输入目标文件的文件名(扩展名为txt):";
char filename[80];
cin.get();
cin.getline(filename, 80);
ofstream out;
out.open(filename, ios::out|ios::noreplace);
if(!out) {cout<<"创建文件失败!"< else
{
Node *p;
p=addrlist.GetHeadPtr();
while(p)
{
out<Name<<' '<OfficePhone<<"(O) "< <HomePhone<<"(H) "<MobilePhone<<"(M) "<EMail< p=p->Next;
}
out.close();
cout<<"成功导出正文文件!"< }
}
void sort(AddrList &addrlist)//排序库表
{
if(addrlist.GetHeadPtr()==NULL)
{cout<<"链表中没有记录可排序!"< if(addrlist.GetTag()==1)
{
cout<<"当前排序关键字为姓名,是否将其改为办公室电话?[y/n]";
char t; cin>>t;
if(t=='y') {addrlist.SetTag(2); addrlist.Sort(2);}
else return;
}
else
{
cout<<"当前排序关键字为办公室电话,是否将其改为姓名?[y/n]";
char t; cin>>t;
if(t=='y') {addrlist.SetTag(1); addrlist.Sort(1);}
else return;
}
cout<<"排序完成!"<}
void quit(AddrList &addrlist)//退出系统,内部做结尾工作
{addrlist.WriteToFile("addrlist.dat"); system("pause"); exit(0);}

void main()//主函数
{
int choice=0, state;
AddrList addrlist;
addrlist.CreateList("addrlist.dat");//从二进制文件中读入数据,
//构建链表
while(choice!=9)//循环菜单处理
{
system("cls");
DisplayMenu();//显示主菜单
cin>>choice;
state=cin.rdstate();
while(state||choice<=0||choice>9)// 处理非法输入,如输入一个字符
{ 
cout<<"请重新输入选择:";
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 + -