c++通讯录实现

//通讯录       
//通讯录联系人信息通过数据文件读写,程序结束保存
// 通讯录中能够存放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;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实训项目,满足以下要求 【要求】 (1)程序的主窗口如左图所示。 程序启动时,窗口左边的“姓名”列表框中显示了本软件中已保存的所有人员姓名,从中选择一个姓名,窗口左边的“详细信息”区域显示出此人的详细通讯录内容。 (2)窗口顶部“城市”和“性别”两个列表框中列出了可供选择的城市名称和姓名。使用这两个控件,可以筛选出感兴趣的内容。例如,在“城市”中选择“南京”,在性别中选择“男”,则在“姓名”列表框中只显示出程序所保存的住在南京的男性人员。选择“城市”和“性别”中的“全部”,则列出所有人员。 (3)单击“添加”按钮 ,弹出一个对话框。通过此对话框,可以添加新的通讯录条目。在添加新条目时,所在城市应从组合框中选择,若组合框中没有想要的城市,可以直接在组合框中键入。要求键入的新城市名能自动添加到“添加”对话框中“所在城市”组合框和主窗口中“城市”组合框的下拉列表中。 (4)在主窗口中点击“删除”按钮 可以删除当前显示的条目。 (5)增加“保存”和“打开”按钮或菜单项,要求能够自动保存所做的添加和删除操作。 (6)所有的数据保存在.txt文件中,并能读出。比如.txt文件的每一行保存一条记录。如:姓名|性别|生日…………【可选用CFile/CStdioFile类】 【提示】创建通讯类,包括姓名、性别、生日、所在城市、工作单位、办公电话、住宅电话等必要信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值