C++结构体&指针 通讯录案例

我是一个c++小白,最近在b站跟着黑马程序员学习,我感觉老师讲的特别仔细,为了复习巩固,我把在学习结构体和指针的时候一个关于通讯录的案例写在这里,方便我以为的复习,也希望能和大家一起学习c++!
视频链接:https://www.bilibili.com/video/BV1et411b73Z?p=83&spm_id_from=pageDriver

#include<iostream>
#include<string>  
using namespace std;
#define max 1000
struct person  //通讯录联系人结构体
{
	string name;
	int age;
	int sex;
	string phone;
	string address;
};

struct tongxunlu  //定义一个通讯录结构体,最多可以容纳一千人
{
	struct person personarray[max];
	int size;    
};

void showMenu()  //展示通讯录的功能菜单
{
	cout << "1.添加对象" << endl;
	cout << "2.显示对象" << endl;
	cout << "3.删除对象" << endl;
	cout << "4.查找对象" << endl;
	cout << "5.修改对象" << endl;
	cout << "6.清空对象" << endl;
	cout << "0.退出系统" << endl;
}
//添加功能。在进行参数传递的时候可以使用值传递和地址传递两种方式,但是值传递只能改变形参而无法改变实参,所以这里选用地址传递
void add(struct tongxunlu * txl)
//切记结构体地址传递形式,struct可以省略
{
	//使用指针的时候用 ->获取所含数据
	//使用普通值传递的时候用 . 获取所含数据
	//添加的时候首先需要对通讯录内存进行判断,如果>=最大值则不能再进行添加
	if (txl->size==max) 
	{
		cout << "t通讯录人员已满" << endl;
		return;
	}
	else
	{
		cout << "请输入用户名:" ;
		string name;
		cin >> name;
		//将用户输入的name传递给通讯录结构体的人员name,这里定义输入的时候最后区分一下,类似a_name用于和结构体name区分
		txl->personarray[txl->size].name = name;
		cout << "请输入用户年龄:";
		int age;
		cin >> age;
		txl->personarray[txl->size].age = age;
		cout << "请输入用户性别:";
		int sex = 0;
		while (true)
		//当while为true的时候执行if里的语句
		{ 
			cin >> sex;
			if (sex == 1 || sex == 2)//1代表 男 2代表 女
			{
				txl->personarray[txl->size].sex = sex;
				break;
			}
			cout << "输入有误,请重新输入用户性别:";
		}
		cout << "请输入用电话号:";
		string phone;
		cin >> phone;
		txl->personarray[txl->size].phone = phone;
		cout << "请输入用户地址:";
		string address;	
		cin >> address;
		txl->personarray[txl->size].address = address;
		//最后添加完成之后将通讯录的内存数加1
		txl->size++;
		cout << "添加成功" << endl;
		system("pause");
		system("cls"); 
		//为了不每点一次功能键就显示一次功能菜单,所以这里系统进行清空操作,只显示showmenue的功能菜单
	}
}

void showuser(struct tongxunlu * txl)
{
//首先进行判断,如果size为0则表示通讯录为空,无内容展示
	if (txl->size==0)
	{
		cout << "当前记录为空!" << endl;
	}
	else
	{
		for (int i = 0; i < txl->size; i++)
		{
			cout << "姓名:" << txl->personarray[i].name << "\t"; //  \t表示水平跳至
			cout << "年龄:" << txl->personarray[i].age << "\t";
			cout << "性别:" << (txl->personarray[i].sex ==1 ?"男":"女")   << "\t";
		//使用三目运算,如果sex为1则显示为男,sex为2则显示为女
			cout << "电话:" << txl->personarray[i].phone << "\t";
			cout << "住址:" << txl->personarray[i].address << endl;;
		}
		cout << "当前用户的个数为:" << txl->size << endl;
	}
	system("pause");
	system("cls");
	
}
//封装一个查询人员是否存在的函数
int checkuser(struct tongxunlu * txl, string name)
{
	for (int i = 0; i < txl->size; i++)
	{
		if (txl->personarray[i].name ==name)
		{
			return i;
		//如果查询的人员存在的话就返回人员所在的记录数
		}
	}
	return -1;
	//如果查无此人就返回-1
}

void deleteuser(struct tongxunlu*txl)
{
	cout << "请输出您要进行查询的人员姓名: ";
	string name;
	cin >> name;
	int ret = checkuser(txl, name);//将查询结果返回到ret
	if (ret==-1)
	{
		cout << "查无此人!";
	}
	else
	{
		for (int i = ret; i < txl->size; i++)
		{
		//进行删除操作的时候,就是从所要删除人员的位置往后的人员信息都往前移一位,注意循环是从所要删除的对象所在位置开始的
			txl->personarray[i] = txl->personarray[i + 1];
		}
		txl->size--;
		//删除之后注意要把内存-1
		cout << "删除成功!";
	}
	system("pause");
	system("cls");
}

void finduser(struct tongxunlu*txl)
{
	cout << "请输出您要进行查询的人员姓名: ";
	string name;
	cin >> name;
	int ret = checkuser(txl, name);
	if (ret == -1)
	{
		cout << "查无此人!";
	}
	else
	{
		cout << "姓名:" << txl->personarray[ret].name << "\t";
		cout << "年龄:" << txl->personarray[ret].age << "\t";
		cout << "性别:" << (txl->personarray[ret].sex == 1 ? "男" : "女") << "\t";
		cout << "电话:" << txl->personarray[ret].phone << "\t";
		cout << "住址:" << txl->personarray[ret].address << endl;;
	}
	system("pause");
	system("cls");
}

void updateuser(struct tongxunlu*txl)
{
	cout << "请输出您要进行修改的人员姓名: ";
	string name;
	cin >> name;
	int ret = checkuser(txl, name);
	if (ret == -1)
	{
		cout << "查无此人!";
	}
	else
	{
		
		cout << "修改后的姓名:";
		string x_name;
		cin >> x_name;
		txl->personarray[ret].name = x_name;
		cout << "修改后的年龄:";
		int x_age;
		cin >> x_age;
		txl->personarray[ret].age = x_age;
		cout << "修改后的性别:";
		int x_sex = 0;
		while (true)
		{
			cin >> x_sex;
			if (x_sex==1||x_sex==2)
			{
				txl->personarray[ret].sex = x_sex;
				break;
				//记得输入正确执行结束后要退出循环
			}
			cout << "输入有误,请重新输入";
		}
	
		cout << "修改后的电话号:";
		string x_phone;
		cin >> x_phone;
		txl->personarray[ret].phone = x_phone;
		cout << "修改后的地址:";
		string x_address;
		cin >> x_address;
		txl->personarray[ret].address = x_address;
	}
	cout << "修改成功!";
	system("pause");
	system("cls");
}

void emptyuser(struct tongxunlu*txl)
//清空操作其实就把通讯录的内存置为0这样通讯录就为空了
{
	if (txl->size==0)
	{
		cout << "当前通讯录为空!";
	}
	else
	{
		txl->size = 0;
	}
	cout << "清空成功!";
	system("pause");
	system("cls");
}

int main()
{
    //初始化通讯录结构体
	struct tongxunlu txl; 
	txl.size = 0;
	int select = 0;
	while (true) //创建一个假的死循环,将一直可以展示功能菜单
	{
		showMenu(); //显示通讯录功能菜单
		//通过用户选择的按钮指令响应对应的功能
		cout << "您的选择为:";
		cin >> select;
		switch (select)
		{
		case 1: //当选择为1的时候执行添加功能
			add(&txl);
			break;
		case 2: //当选择为2的时候执行显示功能
			showuser(&txl);
			break;
		case 3: //当选择为3的时候执行删除功能,其中功能3456都是基于选择的用户姓名进行操作的,所以我们在这之前进行了一个查询人员姓名的函数封装,如果这个人存在,再进行相应的操作
			deleteuser(&txl);
			break;
		case 4:		//当选择为4的时候,根据查询的人员姓名将其所有信息都展示出来
			finduser(&txl);
			break;
		case 5:	 //当选择为5的时候,将输入用户的所有信息进行更改
			updateuser(&txl);
			break;
		case 6:  //当选为为6的时候,将通讯录清空
			emptyuser(&txl);
			break;
		case 0: //当选择0的时候推出系统,return 0跳出死循环
			cout << "欢迎下次使用" << endl;
			system("pause");
			return 0;
			break;
		default:
			break;
		}
	}

	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值