c++学习第十一天:通讯录管理系统

记录亲人、好友信息的工具

实现以下功能:

添加联系人:向通讯录中添加新人,信息包括(姓名,性别,年龄,联系电话,家庭住址,最多可以添加1000人)

显示联系人:显示通讯录中所有联系人的信息

删除联系人:按照姓名进行删除指定联系人

查找联系人:按照姓名查看指定联系人的信息

修改联系人:按照姓名重新修改指定联系人

清空联系人:清空通讯录中所有信息

退出通讯录:退出当前使用的通讯录

1、创建项目:新建空项目(选c++,确定项目名称,存放路径),创建源文件

2、创建菜单:以函数的方式,在main函数中调用函数

void showmenu()//cout实现界面
{
	cout << "*****************************" << endl;
	cout << "******  1、添加联系人  ******" << endl;
	cout << "******  2、显示联系人  ******" << endl;
	cout << "******  3、删除联系人  ******" << endl;
	cout << "******  4、查找联系人  ******" << endl;
	cout << "******  5、修改联系人  ******" << endl;
	cout << "******  6、清空联系人  ******" << endl;
	cout << "******  0、退出系统    ******" << endl;
	cout << "*****************************" << endl;
}

3、退出功能:利用switch语句选择功能进去退出功能

但是处理选择退出功能退出程序外(退出system("pause");return 0;),其它选项执行后必须重新回到界面,这个怎么办呢?

int main()
{
	showmenu();
	int select;//给用户提供选择
	cin >> select;
	switch (select)
	{
	case 0: cout << "退出通讯管理系统";
	case 1:break;//添加联系人
	case 2:break;//显示联系人
	case 3:break;//删除联系人
	case 4:break;//查找联系人
	case 5:break;//修改联系人
	case 6:break;//清空联系人
	}
	system("pause");
	return 0;
}

利用循环呐呐!!!

do
	{
		switch (select)
		{
		case 0: cout << "退出通讯管理系统";
			break;
			system("pause");
			return 0;
		case 1:break;//添加联系人
		case 2:break;//显示联系人
		case 3:break;//删除联系人
		case 4:break;//查找联系人
		case 5:break;//修改联系人
		case 6:break;//清空联系人
		}
	} while (select > 0);

错误啦,并没有对界面循环啦。这个执行一次退出switch后,并没有重新作出选择,一直跳不出for循环,也没有办法输入select。那么一直在执行第一次输入的选项

修改

int main()
{
	while (1)
	{
		showmenu();
		int select;//给用户提供选择
		cin >> select;
		switch (select)
		{
		case 0: cout << "退出通讯管理系统";
			system("pause");
			return 0;
		case 1:break;//添加联系人
		case 2:break;//显示联系人
		case 3:break;//删除联系人
		case 4:break;//查找联系人
		case 5:break;//修改联系人
		case 6:break;//清空联系人
		}

	}
}

现在好啦,只是后面需要对每一次输出的界面做一次清空功能

3、添加功能

由于加的每一个人都有多个共同的属性,所以就想到利用结构体对人的信息进行操作

第一步:定义结构体

struct person
{
	string name;
	int sex;//提前设定好,输1选择男,输0选择女
	int age;
	long int phonenumber;
	string address;
};

没有想到通讯录结构体,光想着联系人结构体数组了,没想过将联系人结构数组作为通讯录结构体的成员

第二步:定义添加函数

怎么添加任意的人,不用添加完1000个就可以,并且还能存储用于后续显示????

那要存储,需要在main函数中创建一个通讯录,通过指针作为形参,对通讯录进行一个添加操作。那么主函数中的实参也会跟着一起改变

int main()
{
	adlist list;

准备工作做好了,那么再函数中的思路:

(1)调用添加函数,首先想是否能添加不,不能就提示,能就写添加的代码(if语句)

(2)在添加时难点:加到第几个,要手动固定吗,要添加完吗

void add(adlist* p)
{
	//判断通讯录是否已经满,再决定加不加
	if (p->size == max)
	{
		cout << "通讯录已满,无法添加!" << endl;
	}
	else
	{
	   cout << "姓名:";
	   cin>> p->personarray[p->size].name;
	}
}

personarray[p->size]很好解决了要手动输入添加第几个联系人的问题,之前也考虑过用for循环,但是这就要求我每次要加完,所以行不通。上述代码就添加好啦第一个联系人的姓名,后续的添加方式类似

cout << "请选择性别:" << "1--男" << " " << "0--女"<<endl;
	//但是得考虑到输入错误得情况怎么办,比如输入3,应该让重输。所以这里还是要有一个判断
	while (1)
	{
		int m_sex;
		cin >> m_sex;
		if (m_sex == 0 || m_sex == 1)
		{
			p->personarray[p->size].sex = m_sex;
			break;
		}
		else
		{
			cout << "输入错误,请重输入";//那重输是不是得进入循环,那这个循环就应该输对了退出,输错了循环,所以得借助break
		}
	}

要考虑到输错的情况,注意这里break的使用。对于添加函数完整版如下;但是只要退出程序再进来就要重新添加,怎么能退出了还依旧有之前保存的呢

void add(adlist* p)
{
	//判断通讯录是否已经满,再决定加不加
	if (p->size == max)
	{
		cout << "通讯录已满,无法添加!" << endl;
	}
	else
	{
	   cout << "请输入姓名:";
	   cin>> p->personarray[p->size].name;
	}
	cout << "请选择性别:" << "1--男" << " " << "0--女"<<endl;
	//但是得考虑到输入错误得情况怎么办,比如输入3,应该让重输。所以这里还是要有一个判断
	while (1)
	{
		int m_sex;
		cin >> m_sex;
		if (m_sex == 0 || m_sex == 1)
		{
			p->personarray[p->size].sex = m_sex;
			break;
		}
		else
		{
			cout << "输入错误,请重输入";//那重输是不是得进入循环,那这个循环就应该输对了退出,输错了循环,所以得借助break
		}
	}
	cout << "请输入年龄:";
	cin >> p->personarray[p->size].age;
	cout << "请输入电话号码:";
	cin >> p->personarray[p->size].phonenumber;
	cout << "请输入家庭地址:";
	cin >> p->personarray[p->size].address;
    cout<<"添加成功";
	(p->size)++;
}

做清屏的操作,使界面更美观system("cls");

cout << "添加成功";
	//但是添加成功后希望做一个清除刚刚的添加信息返回菜单界面重新再操作,这样会使整个界面更清晰
	system("pause");
	system("cls");//清屏操作

3、显示函数功能

void display(adlist list)
{
	cout << "已经添加" << list.size  << "个联系人:"<<endl;
	for (int i = 0; i < list.size; i++)
	{
		cout << "姓名:"<<list.personarray[i].name << "\t";
		if (list.personarray[i].sex == 1)
		{
			cout <<"性别:" << "男" << "\t";
		}
		else if(list.personarray[i].sex == 0)
		{
			cout << "性别:"<<"女" << "\t";
		}
		cout<<"年龄:"<< list.personarray[i].age << "\t" <<"电话号码:" <<list.personarray[i].phonenumber << "\t" <<"家庭地址:" << list.personarray[i].address << endl;
	}
}

4、删除联系人功能

根据姓名,删除联系人所有信息。如果姓名相同则根据手机号删除

void m_delete(adlist * p)//由于要修饰实参的值,所以要用指针当形参
{
	cout << "输入删除联系人的姓名:" << endl;
	string de_name;
	cin >> de_name;
	int num=0;
	for (int i = 0; i < p->size; i++)
	{
		if (p->personarray[i].name == de_name)
		{
			num++;
		}
	}
	if (num > 1)
	{
		cout << "存在" << num << "个相同名字的联系人,请根据手机号码删除!";
		cout << "删除的手机号码是:";
		int de_phone;
		cin >> de_phone;
		for (int i = 0; i < p->size; i++)
		{
			if (p->personarray[i].phonenumber == de_phone)
			{
				person temp = p->personarray[i];
				for (int j = i; j < p->size - i - 1; j++)
				{
					p->personarray[j] = p->personarray[j + 1];
				}
				p->size--;
			}
		}   
	}
	else
	{
		for (int i = 0; i < p->size; i++)
		{
			if (p->personarray[i].name == de_name)
			{
				person temp = p->personarray[i];
				for (int j = i; j < p->size - i - 1; j++)
				{
					p->personarray[j] = p->personarray[j + 1];
				}
				p->size--;
			}
		}
	}
	cout << "删除成功";
	system("cls");
	
}

遇到的问题:person temp = p->personarray[i];最开始给temp定义的是通讯录类型,其实要删除的通讯录中的联系人是联系人类型,左右两边类型的一致。

不足:应该是信息并没有从内存中删除,只是换了存储空间而已。

难点:删除数组中的某一个元素。

5、查找联系人:根据姓名查找

void check(adlist list)
{
	cout << "要查找联系人的姓名:";
	string ch_name;
	cin >> ch_name;
	for (int i = 0; i < list.size; i++)
	{
		if (list.personarray[i].name == ch_name)
		{
			cout << "姓名:" << list.personarray[i].name << "\t";
			if (list.personarray[i].sex == 1)
			{
				cout << "性别:" << "男" << "\t";
			}
			else if (list.personarray[i].sex == 0)
			{
				cout << "性别:" << "女" << "\t";
			}
			cout << "年龄:" << list.personarray[i].age << "\t" << "电话号码:" << list.personarray[i].phonenumber << "\t" << "家庭地址:" << list.personarray[i].address << endl;
		}
	}
	system("pause");
	system("cls");
}

6、修改联系人:根据姓名修改

void rectify(adlist * p)
{
	cout << "要修改联系人姓名:";
	string re_name;
	cin >> re_name;
	for (int i = 0; i < p->size; i++)
	{
		if (p->personarray[i].name == re_name)
		{ 
			cout << "姓名:" << p->personarray[i].name << "\t";
			if (p->personarray[i].sex == 1)
			{
				cout << "性别:" << "男" << "\t";
			}
			else if (p->personarray[i].sex == 0)
			{
				cout << "性别:" << "女" << "\t";
			}
			cout << "年龄:" << p->personarray[i].age << "\t" << "电话号码:" << p->personarray[i].phonenumber << "\t" << "家庭地址:" << p->personarray[i].address << endl;
			cout << "选择修改的信息:";
			cout << " 0、姓名  1、性别  2、年龄  3、电话号码  4、家庭地址" << endl;
			int re_imformation;
			cin >> re_imformation;
			switch (re_imformation)
			{
			case 0:
				cout << "修改姓名:"; cin >> re_name; p->personarray[i].name = re_name; break;//修改姓名
			case 1:
				cout << "修改性别:"; int re_sex; cin >> re_sex; p->personarray[i].sex = re_sex; break;//修改性别
			case 2:
				cout << "修改年龄:"; int re_age;  cin >> re_age; p->personarray[i].age = re_age; break;//修改年龄
			case 3:
				cout << "修改电话号码:"; int re_pho; cin >> re_pho; p->personarray[i].phonenumber = re_pho; break;//修改电话号码
			case 4:
				cout << "修改家庭地址:"; string re_addr;  cin >> re_addr; p->personarray[i].address = re_addr; break;//修改家庭地址
			}
		}
	}
	system("pause");
	system("cls");
}

问题:每次只能修改一次信息,如果要想修改几个就修改几个就好了。还有就是无法修改姓名。我再增加一种修改姓名情况,定义输入信息是字符串时,就说跳过实例,但是如果不定义直接用函数开头定义的re_name就可以避免这种错误。而且再增加情况,定义输入的信息是整型也不会报那样的错误。无解无语,之后再改吧。

7、清空联系人

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值