//通讯录
//通讯录联系人信息通过数据文件读写,程序结束保存
// 通讯录中能够存放1000人的信息,每个人的信息包括:
//名字+年龄+性别+电话+地址。通讯录中能够增加人的
//信息;删除指定人的信息;修改指定人的信息;查找
//指定人的信息;排序通讯录信息
#include<iostream>
#include<iomanip>
#include<string>
using namespace std;
#define Inimax 50 //通讯录初始化可存储联系人数
struct personinfor
{
char name[10];
char sex[5];
int age;
char telenumber[20];
char addr[20];
};
struct contact
{
personinfor *data;//指向动态开辟空间,用以存储联系人信息
int count;//记录当前通讯录的人数
int capacity;//记录当前通讯录的最大容量
};
void menu()
{
cout << "***************************"<<endl;
cout << "******1.增加联系人信息*****"<<endl;
cout << "******2.删除联系人信息*****"<<endl;
cout << "******3.查找联系人信息*****"<<endl;
cout << "******4.修改联系人信息*****"<<endl;
cout << "******5.显示通讯录信息*****"<<endl;
cout << "**********0.退出***********"<<endl;
cout << "***************************"<<endl;
}
void Initcontact(contact&percontact)//初始化通讯录
{
percontact.data=new personinfor[Inimax];
if (percontact.data == NULL)
{
perror("出错:");
return;
}
percontact.count = 0;
percontact.capacity = Inimax;
FILE* p = fopen("contact.dat", "r");
if (p == NULL)
{
perror("出错:");
return;
}
personinfor temp = { 0 };
while (fread(&temp, sizeof(personinfor), 1, p))//加载数据文件
{
if (percontact.count == percontact.capacity)//扩容
{
personinfor* ndata = (personinfor*)realloc(percontact.data,
(percontact.capacity+1)* sizeof(percontact) * Inimax);
if (ndata != NULL)
{
percontact.data = ndata;
percontact.capacity += Inimax;
}
else
{
perror("加载文件出错:");
return;
}
}
percontact.data[percontact.count] = temp;
percontact.count++;
}
}
void Addpercontact(contact&percontact)//增加联系人信息
{
if (percontact.count == percontact.capacity)//扩容
{
personinfor* ndata = (personinfor*)realloc(percontact.data,
(percontact.capacity + 1) * sizeof(percontact) * Inimax);
if (ndata != NULL)
{
percontact.data = ndata;
percontact.capacity += Inimax;
cout << "扩容成功" << endl;
}
else
{
perror("出错:");
cout << "增加联系人失败" << endl;
return;
}
}
cout << "请输入名字:";
cin >> percontact.data[percontact.count].name;
cout << "请输入性别:";
cin >> percontact.data[percontact.count].sex;
cout << "请输入年龄:";
cin >> percontact.data[percontact.count].age;
cout << "请输入电话:";
cin >> percontact.data[percontact.count].telenumber;
cout << "请输入地址:";
cin >> percontact.data[percontact.count].addr;
percontact.count++;
cout << "联系人信息增加成功"<<endl;
}
void Delpercontact(contact& percontact)//删除联系人信息
{
if (percontact.count == 0)
{
cout << "通讯录为空1,无需删除" << endl;
return;
}
char delname[20];
cout << "请输入所要删除联系人名字:";
cin >> delname;
int i;
for (i = 0;i < percontact.count;)
{
if (strcmp(percontact.data[i].name,delname)==0)
{
cout << "目标删除的联系人存在,进行删除" << endl;
int j;
for (j = i; j < percontact.count - 1;j++)
percontact.data[j] = percontact.data[j + 1];
percontact.count--;
cout << "删除成功" << endl;
break;
}
i++;
}
if (i == percontact.count+1)
cout << "目标删除联系人未查询到,通讯录未有相关信息存储" << endl;
}
void Searchpercontact(contact& percontact)//查询联系人信息
{
char searname[20];
cout << "请输入所要查询的联系人名字:";
cin >> searname;
int i;
for (i = 0;i < percontact.count;)
{
if (strcmp(percontact.data[i].name,searname)==0)
{
cout << "目标联系人已查询到" << endl;
cout << setiosflags(ios::left) << setw(8) << "名字" <<
setw(5) << "性别" << setw(5) << "年龄" << setw(12) <<
"电话" << setw(9) << "地址" << endl;
cout << setiosflags(ios::left) << setw(8) <<
percontact.data[i].name << setw(5) << percontact.data[i].sex
<< setw(5) << percontact.data[i].age << setw(12) <<
percontact.data[i].telenumber << setw(9) << percontact.data[i].addr
<< endl;
break;
}
i++;
}
if (i == percontact.count+1)
cout << "目标联系人未查询到,通讯录未有相关信息存储" << endl;
}
void Modifpercontact(contact& percontact)//修改联系人信息
{
char modifname[20];
cout << "请输入所要修改信息的联系人姓名";
cin >> modifname;
int i = 0;
for (i = 0;i < percontact.count;i++)
{
if (strcmp(percontact.data[i].name, modifname) == 0)
{
cout << "所要修改信息的联系人存在,请输入你所要修改的信息项目:" << endl;
cout << " *****1.性别***2.年龄***3.电话***4.地址*****" << endl;
int j = 0;
cin >> j;
switch (j)
{
case 1:
cout << "性别修改项目确定,输入修改信息:" << endl;
cin>> percontact.data[i].sex;
break;
case 2:
cout << "年龄修改项目确定,输入修改信息:" << endl;
cin >> percontact.data[i].age;
break;
case 3:
cout << "电话修改项目确定,输入修改信息:" << endl;
cin >> percontact.data[i].telenumber;
break;
case 4:
cout << "地址修改项目确定,输入修改信息:" << endl;
cin >> percontact.data[i].addr;
break;
default:
cout << "无该选项,请重新选择" << endl;
break;
}
}
}
}
void Printpercontact(const contact& percontact)//显示通讯录信息
{
cout << setiosflags(ios::left) << setw(8) << "名字" <<
setw(5) << "性别" << setw(5) << "年龄" << setw(12) <<
"电话" << setw(9) << "地址" << endl;
int i = 0;
for(i=0;i<percontact.count;i++)
cout << setiosflags(ios::left) << setw(8) <<
percontact.data[i].name <<setw(5) <<percontact.data[i].sex
<< setw(5) << percontact.data[i].age << setw(12) <<
percontact.data[i].telenumber<< setw(9) <<percontact.data[i].addr
<< endl;
}
void Exitpercontact(contact& percontact)//退出保存通讯录
{
FILE* p = fopen("contact.dat", "w");
if (p == NULL)
{
perror("出错:");
return;
}
int i = 0;
for (i = 0;i < percontact.count;i++)
fwrite(percontact.data + i, sizeof(personinfor), 1, p);//保存到数据文件
fclose(p);
p = NULL;
}
int main()
{
int input = 0;
contact percontact;
Initcontact(percontact);//初始化通讯录
do
{
menu();
cout << "请选择: ";
cin >> input;
switch (input)
{
case 1://增加联系人信息
Addpercontact(percontact);
break;
case 2://删除联系人信息
Delpercontact(percontact);
break;
case 3://查找联系人信息
Searchpercontact(percontact);
break;
case 4://修改联系人信息
Modifpercontact(percontact);
break;
case 5://显示通讯录信息
Printpercontact(percontact);
break;
case 0://退出保存通讯录信息
Exitpercontact(percontact);
break;
default:
cout << "无该选项,请重新选择";
}
} while (input);
return 0;
}
|