C++学习之结构体

之前学习时没做笔记,现在有点忘了,回顾一下。

结构体相关知识

冒泡排序

从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。
从小到大排序时
总共n个数,
第1轮比较n个数,比较n-1次
第2轮只比较n-1个数,比较n-2次

一直比较
第n-2轮比较3个数,比较2次
第n-1轮比较2个数,比较1次
所以总共比较n-1轮,第 i 轮比较 n - i 次

//冒泡排序加指针
void sort(int * p1,int len)
{
	cout << "排序前的数组为";
	for (int i = 0; i < len; i++)
	{
		cout << *(p1 + i) << "  ";
	}
	cout << endl;
	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len - i - 1;j++)
		{
			if(*(p1+j)>*(p1+1+j))
			{
				int temp = *(p1+j);
				*(p1+j) = *(p1 + j + 1);
				*(p1 + j + 1) = temp;
			}
		}
	}
	cout << "排序后的数组为";
	for(int i =0;i<len;i++)
	{
		cout <<  *(p1 + i) << "  ";
	}
	cout << endl;
}

指针常量和常量指针

常量指针 const int * p 指针指向可以改,指针指向的值不能改
指针常量 int * const p 指针指向不可以改,指针指向的值可以改
const既修饰指针又修饰常量 const int * const p ,两个都不可以改

结构体做函数参数

struct student
{
	string name;
	int age;
	int score;
};
//值传递
void print1(struct student s)
{
	s.age = 90;//值传递 改变形值的大小不会改变实参的大小
	cout << "子函数中姓名:" << s.name << "子函数中年龄:" << s.age << "分数:" << s.score
		<< endl;
}
//地址传递
void print2(struct student * s)
{
	s->age = 90;//地址传递 也会改变主函数中的数据
	cout << "子函数中姓名:" << s->name << "子函数中年龄:" << s->age << "分数:" << s->score
		<< endl;
}

const在结构体中的使用


//地址传递  用指针可以减少内存,指针占四个字节,若使用值传递进行输出,内存大大增加
//地址传递中参数改变会改变主函数中的值,因此引入const
void print2(const struct student * s)
{
	//s->age = 90;此时有修改的操作就会报错
	cout << "子函数中姓名:" << s->name << "子函数中年龄:" << s->age << "分数:" << s->score
		<< endl;
}

结构体案例

通讯录管理系统

设置通讯录容量:#define max 1000

建立一个 个人信息的结构体

struct information
{
	string name;
	int sex;//1即男性,2即女性
	int age;
	string phone;
	string address;
};

再建立一个通讯录结构体

struct MAX_1000
{
	struct information arr[max];//个人信息结构体数组
	int num;
};

功能函数

void showmeue();
void add(struct MAX_1000 * addbooks);
void print(struct MAX_1000* addbooks);
void showone(struct MAX_1000* addbooks, int i);
void delet(struct MAX_1000* addbooks);
int find(struct MAX_1000* addbooks, string name);
void findshow(struct MAX_1000* addbooks);
void change(struct MAX_1000* addbooks);
void clear(struct MAX_1000* addbooks);

int main()
{
	struct MAX_1000 addbooks;
	addbooks.num = 0;//初始人员个数为0
	int button = 0 ;
	
	while (1)
	{
		showmeue();
	cout <<endl<< "请输入操作序号:" << endl;
	cin >> button;
	switch (button)
	{
	case 1:add( &addbooks); break;
	case 2:print(&addbooks); break;
	case 3:delet(&addbooks); break;
	case 4:findshow(&addbooks); break;
	case 5:change(&addbooks); break;
	case 6:clear(&addbooks); break;
	case 7: {
		cout << "欢迎下次使用" << endl;
		system("pause");
		return 0;
	} break;
	default:
		break;
	}
	}
	return 0;
}
void showmeue()
{
	string meue[] = { "1.添加联系人" ,"2.显示所有联系人" ,
	"3.删除联系人" ,"4.查找联系人" ,"5.修改联系人信息" ,
	"6.清空联系人" ,"7.退出菜单" };
	for (int i = 0; i < 35; i++)
	{
		cout << "*";
	}
	cout << endl << "\t通讯录管理系统" << endl;
	for (int i = 0; i < 7; i++)
	{
		cout <<meue[i]<<  endl;
	}
	/*cout 
		<< "1.添加联系人" << endl
		<< "2.显示所有联系人" << endl
		<< "3.删除联系人" << endl
		<< "4.查找联系人" << endl
		<< "5.修改联系人信息" << endl
		<< "6.清空联系人" << endl
		<< "7.退出菜单" << endl;*/
	for (int i = 0; i < 35; i++)
	{
		cout << "*";
	}
}
void add(struct MAX_1000* addbooks)
{
	if(addbooks->num == max)
	{
		cout << "通讯录已满,无法添加。" << endl;
	}
	else
	{
		string name;
		int sex=0;
		int age=0;
		string phone;
		string address;
		cout << "请输入姓名:";
		cin >> name;
		addbooks->arr[addbooks->num ].name = name;
		cout << "请输入性别:(1-男  2-女):";
		cin >> sex;
		while(sex != 1 && sex != 2)
		{
			cout << "输入性别格式错误,请重新输入:";
			cin >> sex;
		}
		addbooks->arr[addbooks->num].sex = sex;
		cout << "请输入年龄:";
		cin >> age;
		addbooks->arr[addbooks->num ].age = age;
		cout << "请输入电话:";
		cin >> phone;
		addbooks->arr[addbooks->num ].phone = phone;
		cout << "请输入地址:";
		cin >> address;
		addbooks->arr[addbooks->num ].address = address;
		addbooks->num = addbooks->num + 1;
		cout << "添加成功";
		system("cls");
	}
}

void print(struct MAX_1000* addbooks)
{
	string sex;
	for (int i = 0; i < (addbooks->num); i++)
	{
		if (addbooks->arr[i].sex == 1) { sex = "男"; }
		else if (addbooks->arr[i].sex == 2) { sex = "女";}
		cout << "姓名:" << addbooks->arr[i].name<<"\t"
			<< "性别:" << sex << "\t"
			<< "年龄:" << addbooks->arr[i].age << "\t"
			<< "电话:" << addbooks->arr[i].phone << "\t"
			<< "地址:" << addbooks->arr[i].address << "\t"
			<< endl;
	}
	system("pause");
	system("cls");
}

int find(struct MAX_1000* addbooks, string name)
{
	for (int i = 0; i < addbooks->num; i++)
	{
		if (name == addbooks->arr[i].name)
		{
			return  i;
		}
	}
	return -1;
}
void showone(struct MAX_1000* addbooks,int i)
{
	string sex;
	if((i<0) || (i>=addbooks->num))
	{
		cout << "错误   num = "<<i<<endl;
	}
	else
	{
		if (addbooks->arr[i].sex == 1) { sex = "男"; }
		else if (addbooks->arr[i].sex == 2) { sex = "女"; }
		cout << "姓名:" << addbooks->arr[i].name << "\t"
			<< "性别:" << sex << "\t"
			<< "年龄:" << addbooks->arr[i].age << "\t"
			<< "电话:" << addbooks->arr[i].phone << "\t"
			<< "地址:" << addbooks->arr[i].address << "\t"
			<< endl;
	}
}

void delet(struct MAX_1000* addbooks)
{
	string delet_name;
	cout << "请输您要删除的联系人姓名:";
	cin >> delet_name;
	if(find(addbooks, delet_name)==-1)
	{
		cout << "查无此人。" << endl;
	}
	else
	{
		cout << "找到了。原信息为:"<<endl;
		showone(addbooks, find(addbooks, delet_name));
		for (int i = find(addbooks, delet_name); i < addbooks->num-1; i++)
		{
			addbooks->arr[i] = addbooks->arr[i + 1];
		}
		cout << "删除成功。" << endl;
		addbooks->num = addbooks->num - 1;
	}
	system("pause");
	system("cls");
}

void findshow(struct MAX_1000* addbooks)
{
	string sex;
	string find_name;
	cout << "请输入您要查找的联系人姓名:";
	cin >> find_name;
	if (find(addbooks, find_name) == -1)
	{
		cout << "查无此人。" << endl;
	}
	else
	{
		showone(addbooks, find(addbooks, find_name));
	}
	system("pause");
	system("cls");
}

void change(struct MAX_1000* addbooks)
{
	string new_name;
	int new_sex=0;//1即男性,2即女性
	int new_age;
	string new_phone;
	string new_address;
	string change_name;
	cout << "请输入您要修改的联系人姓名:";
	cin >> change_name;
	int ret = find(addbooks, change_name);
	if(ret==-1)
	{
		cout << "查无此人。"<<endl;
	}
	else
	{
		cout << "原信息为:" << endl;
		showone(addbooks, ret);

		cout << "修改联系人姓名为:";
		cin >> new_name;
		addbooks->arr[ret].name = new_name;
//		cout << "修改成功,新信息为:num=" << find(addbooks, change_name) << endl;

		cout << "修改联系人性别为:(1-男  2-女):";
		cin >> new_sex;
		while (new_sex != 1 && new_sex != 2)
		{
			cout << "输入性别格式错误,请重新输入:";
			cin >> new_sex;
		}
		addbooks->arr[ret].sex = new_sex;
		
		cout << "修改联系人年龄为:";
		cin >> new_age;
		addbooks->arr[ret].age = new_age; 

		cout << "修改联系人联系电话为:";
		cin >> new_phone;
		addbooks->arr[ret].phone = new_phone;

		cout << "修改联系人地址为:";
		cin >> new_address;
		addbooks->arr[ret].address = new_address;

	//	addbooks->arr[find(addbooks, change_name)].address = new_address;   
		//错误示范,经过修改后find(addbooks, change_name)已经无法找到修改前的姓名change_name,因此会返回-1,而数组没有第-1项,
		// 因此发生错误退出
		cout << "修改成功,新信息为:" <<endl;
		showone(addbooks, ret);
	}
	system("pause");
	system("cls");
}

void clear(struct MAX_1000* addbooks)
{
	addbooks->num = 0;
	cout << "通讯录已清空。" << endl;
	system("pause");
	system("cls");
}

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值