设计内容
1、通讯录是一个简易的管理软件,管理所有联系人的通讯纪录(电话,e-mail)。
2、使用文件存取
1)、使用文件存储通讯录
2)、可以不保存新输入的纪录,但需要确认是否保存输入纪录
3)、如果已经有文件,只能在其后追加
3、联系人的分组管理
可以把联系人分为以下几组:亲戚,同学,朋友,工作,普通,其他等类型,存储联系人通讯纪录时需选择适当的分组。
4、通讯录的显示
1)、系统开启后默认显示所有联系人的通讯录
2)、可以按组显示该组内所有联系人的通讯纪录
3)、可以查询某人的通讯录,如无此人则提示“没有此人”
#include <iostream>
#include<stdio.h>
#include<fstream>
#include<sstream>
#include<iomanip>
using namespace std;
//#define MAX 100;
struct node {
char Name[10];
char Telephone[20];
char Email[20];
char Type[20];
};
class People {
private:
struct node info[100];
int m_number;
public:
void initial();//初始化数组
int interface();//界面
void add();//添加
void search();//查找
void sort_search();//分组查找
void dele();//删除
void change();//修改
void display();//显示输出
void save_info();//信息保存
static int count;//总人数
};
int People::count = 0;
void People::initial()
{
string line;
ifstream file;//输入流
int i = 0;
file.open("D:\\zly.txt");
if (!file)
{
cout << "文件打开失败" << endl;
}
while (getline(file, line))//按行读取数据
{
istringstream ss;//字符串流
ss.str(line);//把按行读取的数据传到字符串流中
//分隔文件中每一行的数据
ss >> info[i].Name;
ss >> info[i].Telephone;
ss >> info[i].Email;
ss >> info[i].Type;
//
i++;
}
count = i;
}
void People::save_info()
{
ofstream fs; //输出流
fs.open("D:\\zly.txt");
if (!fs)//if(!is_open())
{
cout << "文件打开失败" << endl;
system("pause");
return;
}
for (int i = 0; i<count; i++)//向文件中存入数据
{
fs << info[i].Name << setw(20)
<< info[i].Telephone << setw(20)
<< info[i].Email << setw(20)
<< info[i].Type << endl;
}
fs.close();
}
int People::interface()
{
int number = 0;;
cout << " *+=================================================+*" << endl;
cout << " *| |*" << endl;
cout << " *| 多功能电子通讯录 |*" << endl;
cout << " *| |*" << endl;
cout << " *| |*" << endl;
cout << " *| |*" << endl;
cout << " *|-------------------------------------------------|*" << endl;
cout << " *| 1.添加联系人信息 2.查询联系人信息 |*" << endl;
cout << " *|-------------------------------------------------|*" << endl;
cout << " *| 3.删除联系人信息 4.修改联系人信息 |*" << endl;
cout << " *|-------------------------------------------------|*" << endl;
cout << " *| 5.显示所有联系人信息 6.显示分组联系人信息|*" << endl;
cout << " *|-------------------------------------------------|*" << endl;
cout << " *| 7.退出 |*" << endl;
cout << " *|-------------------------------------------------|*" << endl;
cout << " *+=================================================+*" << endl;
cout << " " << endl;
cout << "请选择你要实现的功能:" << endl;
cin >> number;
if (number == 1 || number == 2 || number == 3 || number == 4 || number == 5 || number == 6 || number == 7)
{
m_number = number;
return m_number;
}
}
void People::add()
{
char ch = 0;
int flag = 0;
if (count >= 100)
{
cout << "通讯录存储已满。" << endl;
}
else
{
while (1)
{
flag = 0;
cout << "请输入联系人的信息:" << endl;
cout << "姓名:";
cin >> info[count].Name;
cout << "电话:";
cin >> info[count].Telephone;
cout << "Email:";
cin >> info[count].Email;
cout << "类型:";
cin >> info[count].Type;
count++;
cout << "添加成功。" << endl;
cout << "是否继续添加联系人? y/n:" << endl;
cin >> ch;
while (ch != 'n' && ch != 'y')
{
cout << "输入错误!请重新输入 y/n:" << endl;
cin >> ch;
}
if (ch == 'n')
{
break;
}
}
}
}
void People::search()
{
while (1)
{
char name[20];
int i = 0;
char ch = 0;
int flag = 0;
cout << "通过姓名查找:" << endl;
cin >> name;
for (i = 0; i < count; i++)
{
if (strcmp(name, info[i].Name) == 0)
{
flag = 1;
cout << "姓名:" << info[i].Name << endl;
cout << "电话:" << info[i].Telephone << endl;
cout << "Email:" << info[i].Email << endl;
cout << "类型:" << info[i].Type << endl;
cout << "***************************************" << endl;
}
}
if (flag == 0)
{
cout << "查无此人!" << endl;
}
cout << "是否继续? y/n:" << endl;
getchar();
cin >> ch;
while (ch != 'n' && ch != 'y')
{
while (getchar() != '\n');
cout << "输入错误!请重新输入 y/n:" << endl;
cin >> ch;
}
if (ch == 'n')
{
break;
}
}
}
void People::sort_search()
{
while (1)
{
char type[20];
int i = 0;
char ch = 0;
int flag = 0;
cout << "请输入需要查找联系人的类别是" << endl;
cin >> type;
for (i = 0; i < count; i++)
{
if (strcmp(type, info[i].Type) == 0)
{
flag = 1;
cout << "姓名:" << info[i].Name << endl;
cout << "电话:" << info[i].Telephone << endl;
cout << "Email:" << info[i].Email << endl;
cout << "类型:" << info[i].Type << endl;
cout << "***************************************" << endl;
}
}
if (flag == 0)
{
cout << "暂无该类型的联系人!" << endl;
}
cout << "是否继续? y/n:" << endl;
getchar();
cin >> ch;
while (ch != 'n' && ch != 'y')
{
while (getchar() != '\n');
cout << "输入错误!请重新输入 y/n:" << endl;
cin >> ch;
}
if (ch == 'n')
{
break;
}
}
}
void People::dele()
{
char name[20] = { 0 };
int i = 0;
int j = 0;
int num = 0;
char ch = 0;
int name_count[20] = { 0 };
int number = 0; //删除的联系人的编号
while (1)
{
num = 0;
cout << "请输入要删除的联系人的姓名:" << endl;
cin >> name;
for (i = 0; i < count; i++)
{
if (strcmp(name, info[i].Name) == 0)
{
name_count[num] = i;//记录每一个要删除人的编号
num++;
}
}
if (num == 0)
{
cout << "查无此人!" << endl;
}
else
{
for (i = 0; i < num; i++)
{
cout << "编号:" << i << endl;
cout << "姓名:" << info[name_count[i]].Name << endl;
cout << "电话:" << info[name_count[i]].Telephone << endl;
cout << "Email:" << info[name_count[i]].Email << endl;
cout << "类型:" << info[name_count[i]].Type << endl;
cout << "***************************************" << endl;
}
cout << "请输入你要删除联系人信息的编号" << endl;
cin >> number;
while (number < 0 || number >= num)
{
while (getchar() != '\n');
cout << "输入错误! 请重新输入!" << endl;
cin >> number;
}
while (name_count[number] < count)//把后面的联系人全部往前挪一个位置,覆盖掉被删除的人的信息
{
strcpy(info[name_count[number]].Name, info[name_count[number] + 1].Name);
strcpy(info[name_count[number]].Telephone, info[name_count[number] + 1].Telephone);
strcpy(info[name_count[number]].Email, info[name_count[number] + 1].Email);
strcpy(info[name_count[number]].Type, info[name_count[number] + 1].Type);
name_count[number]++;
}
count--;
cout << "删除成功!" << endl;
}
cout << "是否继续? y/n:" << endl;
getchar();
cin >> ch;
while (ch != 'n' && ch != 'y')
{
while (getchar() != '\n');
cout << "输入错误!请重新输入 y/n:" << endl;
cin >> ch;
}
if (ch == 'n')
{
break;
}
}
}
void People::change()
{
char name[20] = { 0 };
int i = 0;
int j = 0;
char ch = 0;
int num = 0; // 用来确定删除的人的次序
int name_count[10] = { 0 };
while (1)
{
j = 0;
cout << "请输入你要修改联系人的姓名:" << endl;
cin >> name;
for (i = 0; i < count; i++)
{
if (strcmp(info[i].Name, name) == 0) //判断同名人数
{
name_count[j] = i;
j++;
}
}
if (j == 0) //查无此人
{
cout << "查无此人!" << endl;
}
else if (j == 1) //名字唯一,直接修改
{
cout << "修改的信息:" << endl;
cout << "姓名: ";
cin >> info[name_count[j - 1]].Name;
cout << "电话 : ";
cin >> info[name_count[j - 1]].Telephone;
cout << "Email : ";
cin >> info[name_count[j - 1]].Email;
cout << "类型 : ";
cin >> info[name_count[j - 1]].Type;
cout << "修改成功!" << endl;
}
else //有同名时,显示全部同名人的信息
{
cout << "有 " << j << " 个同名" << endl;
for (i = 0; i < j; i++)
{
cout << "编号:" << i << endl;
cout << "姓名:" << info[name_count[i]].Name << endl;
cout << "电话:" << info[name_count[i]].Telephone << endl;
cout << "Email:" << info[name_count[i]].Email << endl;
cout << "类型:" << info[name_count[i]].Type << endl;
cout << "***************************************" << endl;
}
cout << "请输入你要修改联系人的编号:" << endl;
ch = getchar();
cin >> num;
while (num < 0 || num >= j)
{
while (getchar() != '\n');
cout << "输入错误! 请重新输入:" << endl;
cin >> num;
}
cout << "请输入修改后联系人的所有信息:" << endl;
cout << "姓名: ";
cin >> info[name_count[num]].Name;
cout << "电话 : ";
cin >> info[name_count[num]].Telephone;
cout << "Email : ";
cin >> info[name_count[num]].Email;
cout << "备注 : ";
cin >> info[name_count[num]].Type;
cout << "修改成功!" << endl;
}
cout << "是否继续? y/n:" << endl;
getchar();
cin >> ch;
while (ch != 'n' && ch != 'y')
{
while (getchar() != '\n');
cout << "输入错误!请重新输入 y/n:" << endl;
cin >> ch;
}
if (ch == 'n')
{
break;
}
}
}
void People::display()
{
while (1)
{
int i = 0;
char ch = 0;
for (i = 0; i < count; i++)
{
cout << "姓名:" << info[i].Name << endl;
cout << "电话:" << info[i].Telephone << endl;
cout << "Email:" << info[i].Email << endl;
cout << "备注:" << info[i].Type << endl;
cout << "***************************************" << endl;
}
while (ch != 'q')
{
cout << "请输入 'q' 退出!" << endl;
//ch = getchar();
cin >> ch;
}
break;
}
}
int main()
{
People peo;
int number = 0;
char ch = 0;
peo.initial();//初始化,读取文件中的数据到数组中
while (1)
{
system("cls");
number = peo.interface();
system("cls");//清屏
switch (number)
{
case 1: //添加
{
peo.add();
cout << "是否保存到文本文件?y/n:" << endl;
getchar();
cin >> ch;
while (ch != 'n' && ch != 'y')
{
getchar();
cout << "输入错误!请重新输入 y/n:" << endl;
cin >> ch;
}
if (ch = 'y')
{
peo.save_info();
cout << "保存成功!" << endl;
}
break;
}
case 2: //查看
{
peo.search();
break;
}
case 3: //删除
{
peo.dele();
cout << "是否保存到文本文件?y/n:" << endl;
getchar();
cin >> ch;
while (ch != 'n' && ch != 'y')
{
getchar();
cout << "输入错误!请重新输入 y/n:" << endl;
cin >> ch;
}
if (ch = 'y')
{
peo.save_info();
cout << "保存成功!" << endl;
}
break;
break;
}
case 4: //修改
{
peo.change();
cout << "是否保存到文本文件?y/n:" << endl;
getchar();
cin >> ch;
while (ch != 'n' && ch != 'y')
{
getchar();
cout << "输入错误!请重新输入 y/n:" << endl;
cin >> ch;
}
if (ch = 'y')
{
peo.save_info();
cout << "保存成功!" << endl;
}
break;
break;
}
case 5:
{
peo.display();
break;
}
case 6:
{
peo.sort_search();
break;
}
case 7: //退出
{
cout << "退出成功!\n" << endl;
exit(0);
}
default:
{
printf("Please input right number!\n");
ch = getchar();
printf("Please input any key to continue.\n");
ch = getchar();
break;
}
}
}
return 0;
}