1、问题描述
通讯录是用来记载和查询联系人通讯信息的工具。电子通讯录已成为手机、电子词典等电子设备中不可缺少的工具软件。基本功能模块
输入:记录的录入。
显示:通讯录显示。
查找:按指定方式,输入关键字,查找指定记录。
插入:实现记录的添加或在指定位置插入新纪录。
删除:提供指定记录的删除功能。
保存:将内存中正在被操作的通讯录以文件形式保存到磁盘。
读入:保存的逆操作,将存在磁盘中的通讯录文件读到内存中。
排序:按指定关键字对通讯录数据进行排序。
修改:提供修改某条记录的功能。
移动:移动记录在通讯录中的存储位置,使其被查找或被显示时的位序前移或后移。
退出:结束程序运行
#include
#include//字符串
#include//fstream用于文件使用
#include
#include//系统功能
using namespace std;
struct people //创建结构体
{
char ID[15]; //ID
char name[15]; //姓名
char unit[15]; //单位
char adds[20]; //住址
char num[15]; //电话
struct people *next; //因为要频繁插入删除,因此用链表
}People;
people *head;
people *rear;//由题目可知应该用循环链表
void Input() //输入通讯录
{
system("cls");//清屏
people *p;
p=new people;
cout<<" 请输入ID:";
cin>>p->ID;
cout<<" 请输入姓名:";
cin>>p->name;
cout<<" 请输入单位:";
cin>>p->unit;
cout<<" 请输入住址:";
cin>>p->adds;
cout<<" 请输入电话号码:";
cin>>p->num;
rear->next=p;
rear=p;
rear->next=NULL;//初始化通讯录
}
void Display() //显示通讯录
{
system("cls");//清屏
people *p;
p=head->next;//初始化指针p
cout << "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"; //格式
cout << "ID 姓名 单位 住址 电话\n";
cout << "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n";
while (p)
{
cout<ID<name<unit<adds<num<next;//指针向后移
}
}
void Search() //查找联系人
{ system("cls");
people *p;
int i=0,n;//n表示选择哪种查询,i表示查询种类的序号,i=0对i进行初始化
while(i!=1)
{
cout<<"\t\n请选择查询方式:\n";
cout<<"\t^^^^^^^^^^^^^^^^^\n";
cout<<"\t@ 1-姓名 \n";
cout<<"\t@ 2-住址 \n";
cout<<"\t@ 3-电话 \n";
cout<<"\t@ 4-返回 \n";
cout<<"\t^^^^^^^^^^^^^^^^^\n";
cout<<"请选择查找方式:";
cin>>n;
if(n!=1&&n!=2&&n!=3&&n!=4)
{
cout<<"$$输入错误,请重新选择:";
cin>>n;
}
else if(n==1)//根据姓名查找
{
char name[100];
int flag=0;//flag==0查找失败(通讯录没有这个人),flag==1查找成功
cout<<"\t请输入想查询的姓名:";
cin>>name;
p=head->next;
while(p)
{
if(strcmp(p->name,name)==0)//通讯录里面有这个名字
{
cout<<"\t此人ID:"<ID<unit<adds<num<next;
}
if(n==2)//根据住址查找
{
char adds[20];
int flag=0;
cout<<"\t请输入想查询的地址:";
cin>>adds;
p=head->next;
while(p)
{
if(strcmp(p->adds,adds)==0)
{
cout<<"\tID:"<ID<name<unit<num<next;
}
if(n==3)//根据电话号码查找
{
char num[20];
int flag=0;
cout<<"\t请输入想查询的电话:";
cin>>num;
p=head->next;
while(p)
{
if(strcmp(p->num,num)==0)
{
cout<<"\tID:"<ID<name<unit<adds<next;
}
if(n==4) {break;}
}
}
void Delete() //删除联系人
{
system("cls");//清屏
people *p;
p=new people;//初始化指针p
int i=0;
while (i!=1)
{
people *m;
m=head;//初始化指针m
cout<<"\t请输入想删除联系人的名字:";
cin>>p->name;
cout<<"\t请输入想删除联系人的电话号码:";
cin>>p->num;
while (m->next&&strcmp(m->next->name,p->name)&&strcmp(m->next->num,p->num))
m=m->next;
if (m==NULL) cout<<"\t通讯录中没有此人!\n";
else
{
people *q;
q=m->next;
m->next=q->next;
delete q;
cout<<"已经成功删除!\n";
}
cout << "1-返回主菜单 2-继续";
cin>>i;
}
}
void savefile() //保存文件
{
system("cls");//清屏
ofstream f;//输出文件流类
f.open("mypeople.txt", ios_base::out);//用文件流对象的成员函数open()打开文件,将文件流对象与某个磁盘文件联系起来;
//ios_base::out写方式打开文件
if(!f) {cerr<<"打开文件失败!"; return; }
people *p;
p=head->next;//p指向第一个人的数据
while(p)
{
f<ID<<'\t'<name<<'\t'<unit<<'\t'<adds<<'\t'<num;
if(!p->next) f<<'#';//如果没有循环。输出#
else f<next;
}
f.close();//关闭
cout << "保存成功!";
return;
}
int readfile() //读入文件
{
system("cls");//清屏
head=new people;
head->next=NULL;
rear=head;
ifstream f;//文件输入
f.open("mypeople.txt");
if(!f) {cerr<<"打开文件失败!";return 1; }//cerr和cout用法相同
char ch;
f.get(ch);//读入对象ch
f.putback(ch);
while(ch!='#')
{
people *p=new people;
f>>p->ID>>p->name>>p->unit>>p->adds>>p->num;
rear->next=p;
rear=p;
rear->next=NULL;
f.get(ch);
}//while
f.close();
return 0;
}
void sort() //排序
{
system("cls");//清屏
people *p, *q, *s;
s=new people;
int i=0,n;
while(i!=1)
{
cout<<"1--按姓名排序 2--按号码排序"<>n;
p=head->next;
if(n==1)
{
while(p)
{
q=p->next;
while(q)
{
if(strcmp(p->name, q->name)>0)
{
strcpy(s->ID,p->ID);
strcpy(s->name,p->name);
strcpy(s->unit,p->unit);
strcpy(s->adds,p->adds);
strcpy(s->num,p->num);
strcpy(p->ID,q->ID);
strcpy(p->name,q->name);
strcpy(p->unit,q->unit);
strcpy(p->adds,q->adds);
strcpy(p->num,q->num);
strcpy(q->ID,s->ID);
strcpy(q->name,s->name);
strcpy(q->unit,s->unit);
strcpy(q->adds,s->adds);
strcpy(q->num,s->num);
}
q=q->next;
}
p=p->next;
}
}
if(n == 2)
{
while(p)
{
q=p->next;
while(q)
{
if(strcmp(p->num,q->num)>0)
{
strcpy(s->ID,p->ID);
strcpy(s->name,p->name);
strcpy(s->unit,p->unit);
strcpy(s->adds,p->adds);
strcpy(s->num,p->num);
strcpy(p->ID,q->ID);
strcpy(p->name,q->name);
strcpy(p->unit,q->unit);
strcpy(p->adds,q->adds);
strcpy(p->num,q->num);
strcpy(q->ID,s->ID);
strcpy(q->name,s->name);
strcpy(q->unit,s->unit);
strcpy(q->adds,s->adds);
strcpy(q->num,s->num);
}
q=q->next;
}
p=p->next;
}
}
cout<<"1--返回主菜单 2--继续";
cin>>i;
}
}
void change() //修改联系人信息
{
system("cls");//清屏
people *p,*s,*q;
p=new people;
q=new people;
s=new people;
int i=0;
while(i!=1)
{
people *m;
m=head;
cout<<"\t请输入想修改的记录中的名字:";
cin>>p->name;
while(m->next&&strcmp(m->next->name, p->name))
{
m=m->next;
}
s=m->next;
if(s==NULL)
{
cout<<"\t通讯录中没有此人!\n";
return;
} //if
else
{
cout<<"请输入修改后此人的信息:\n";
cout<<"\t请输入ID:";
cin>>q->ID;
cout<<"\t请输入姓名:";
cin>>q->name;
cout<<"\t请输入单位:";
cin>>q->unit;
cout<<"\t请输入住址:";
cin>>q->adds;
cout<<"\t请输入电话号码:";
cin>>q->num;
m->next = s->next;
delete s;
q->next=m->next;
m->next=q;
}//else
cout<<"1--返回主菜单 2--继续";
cin>>i;
}//while
}
void Insert() //插入记录
{
system("cls");
people *p;
p=new people;
int i=0,n;
while(i!=1)
{
cout<<"1--记录添加 2--指定位置插入记录";
cin>>n;
cout<<"\t请输入ID:";
cin>>p->ID;
cout<<"\t请输入姓名:";
cin>>p->name;
cout<<"\t请输入单位:";
cin>>p->unit;
cout<<"\t请输入地址:";
cin>>p->adds;
cout<<"\t请输入电话号码:";
cin>>p->num;
if(n==1)
{
rear->next=p;
rear=p;
rear->next=NULL;
}
else
{
people *q, *m;
q=new people;
cout<<"插在哪个结点后面:";
cout<<"\t请输入ID:";
cin>>q->ID;
cout<<"\t请输入姓名:";
cin>>q->name;
cout<<"\t请输入单位:";
cin>>q->unit;
cout<<"\t请输入地址:";
cin>>q->adds;
cout<<"\t请输入电话号码:";
cin>>q->num;
m=head->next;
while(m&&strcmp(m->name,q->name)&&strcmp(m->adds,q->adds)&&strcmp(m->num,q->num))
m=m->next;
if(m->next==NULL)
cout<<"通讯录中无此人!:";
else
{
p->next=m->next;
m->next=p;
}
}
cout << "1--返回主菜单 2--继续";
cin >> i;
}
}
void move() //移动
{
system("cls");
people *p, *q, *s;
s=new people;
q=new people;
int i=0,n;
while(i!=1)
{
cout<<"1-- 前移 2--后移"<>n;
cout<<"输入需要移动结点的信息:\n";
cout<<"输入姓名:\n";
cin>>q->name;
cout<<"输入ID:";
cin>>q->ID;
cout<<"输入单位:";
cin>>q->unit;
cout<<"输入地址:";
cin>>q->adds;
cout<<"输入电话号码:";
cin>>q->num;
p=head->next;
if(n==1)
{
while(p->next)
{
if(strcmp(p->next->ID,q->ID)==0&&strcmp(p->next->name,q->name)==0&&strcmp(p->next->unit,q->unit)==0&&strcmp(p->next->adds,q->adds)==0&&strcmp(p->next->num,q->num)==0)
{
strcpy(s->ID,p->ID);
strcpy(s->name,p->name);
strcpy(s->unit,p->unit);
strcpy(s->adds, p->adds);
strcpy(s->num, p->num);
strcpy(p->ID,p->next->ID);
strcpy(p->name,p->next->name);
strcpy(p->unit,p->next->unit);
strcpy(p->adds,p->next->adds);
strcpy(p->num,p->next->num);
strcpy(p->next->ID,s->ID);
strcpy(p->next->name,s->name);
strcpy(p->next->unit,s->unit);
strcpy(p->next->adds,s->adds);
strcpy(p->next->num,s->num);
break;
}
else p=p->next;
}
}
if(n==2)
{
while(p->next)
{
if(strcmp(p->next->ID,q->ID)==0&&strcmp(p->next->name,q->name)==0&&strcmp(p->next->unit,q->unit)==0&&strcmp(p->next->adds,q->adds)==0&&strcmp(p->next->num,q->num)==0)
{
strcpy(s->ID,p->ID);
strcpy(s->name,p->name);
strcpy(s->unit,p->unit);
strcpy(s->adds, p->adds);
strcpy(s->num, p->num);
strcpy(p->ID,p->next->ID);
strcpy(p->name,p->next->name);
strcpy(p->unit,p->next->unit);
strcpy(p->adds,p->next->adds);
strcpy(p->num,p->next->num);
strcpy(p->next->ID,s->ID);
strcpy(p->next->name,s->name);
strcpy(p->next->unit,s->unit);
strcpy(p->next->adds,s->adds);
strcpy(p->next->num,s->num);
break;
}
else p=p->next;
}
}
cout<<"1--返回主菜单 2--继续";
cin>>i;
}
}
void close() //退出程序
{
system("cls");
cout << "谢谢使用,再见!\n";
exit(0);
}
int main()
{
readfile();
int i=0;
while(i!=11)
{
cout<<"\t\t 通讯录 \n"; //显示目录
cout<<"\t\t******************\n";
cout<<"\t\t1--添加记录 \n";
cout<<"\t\t2--显示记录 \n";
cout<<"\t\t3--查询记录 \n";
cout<<"\t\t4--插入记录 \n";
cout<<"\t\t5--删除记录 \n";
cout<<"\t\t6--排序记录 \n";
cout<<"\t\t7--修改记录 \n";
cout<<"\t\t8--保存记录 \n";
cout<<"\t\t9--移动记录 \n";
cout<<"\t\t0--退出程序 \n";
cout<<"\t\t******************\n";
cout<<"\t\t请您选择(0-9):";
cin>>i;
switch(i)
{
case 1:Input();break;
case 2:Display();break;
case 3:Search();break;
case 4:Insert();break;
case 5:Delete();break;
case 6:sort();break;
case 7:change();break;
case 8:savefile();break;
case 9:move();break;
case 0:close();break;
default:{cout<<"谢谢使用 再见!\n"; exit(0);}break;
}
}
return 0;
}
2018.1.17 于南通大学床上