① 结构体与函数 ② 结构体在const中的使用 ③ 结构体案例 老师三人各管理五名学生 + 五位英雄冒泡排序

结构体+函数

1、值传递

【改变分数】【无效】

2、地址传递

【改变年龄】【有效】

#include <iostream>
#include <string>
using namespace std;

//学生结构体
struct student
{
	int age;//年龄
	string name;//名字
	int score;//分数
};

//值传递的函数【改变分数】【无效】
void printstudent1(struct student s)
{
	cout << "值传递:" << endl;
	cout << "年龄:" << s.age << "名字:" << s.name << "分数:" << s.score << endl;
	s.score = 100;//改变分数(无效)
}

//地址传递的函数【改变年龄】【有效】
void printstudent2(struct student* p)
{
	cout << "地址传递:" << endl;
	cout << "年龄:" << p->age << "名字:" << p->name << "分数:" << p->score << endl;
	p->age = 20;//改变年龄(有效)
}
int main()
{
	//定义学生数据
	struct student s;
	s.age = 18;
	s.name = "Amy";
	s.score = 99;

	cout <<"在没有调用函数之前的年龄:" 
         << s.age << endl;
	cout << "在没有调用函数之前的分数:"
		<<s.score  << endl;

    //值传递打印学生数据
	printstudent1(s);

	//地址传递打印学生数据
	printstudent2(&s);

	cout << "在调用函数之后的年龄:"
	     << s.age << endl;
	cout << "在调用函数之后的分数:"
		<< s.score  << endl;

	return 0;
}

结构体中const的使用

【使用 student * s,而不是student s 的理由】

如果是值传递:

会把结构体所有的数据类型的内存全部副本一遍

但是如果是地址传递:

所有的数据类型都是指针,都只有四个字节

所以:

地址传递会减少内存空间,并且不会复制副本

【在地址传递的时候】

如果改变了形参,会影响实参的数据

为了 不随意的改变 实参 的数据

则使用const student * s
#include <iostream>
#include <string>
using namespace std;

struct student
{
	int age;//年龄
	string name;//姓名
	int score;//分数
};
/*使用 student *s,而不是student s 的理由:

如果是值传递:
    会把结构体所有的数据类型的内存全部副本一遍
但是如果是地址传递:
    所有的数据类型都是指针,都只有四个字节
所以:
    地址传递会减少内存空间,并且不会复制副本
 */

/*在地址传递的时候
    如果改变了形参,会影响实参的数据
为了不随意的改变实参的数据
    则使用const student * s
*/
void printstudent(const student * s)
{
	cout << "年龄:" << s->age<< "    "
		<< "姓名:" << s->name<< "    "
		<< "分数:" << s->score << endl;
}
int main()
{
	student s;
	s.age = 19;
	s.name = "李华";
	s.score = 93;
	printstudent(&s);

	return 0;
}

结构体案例

1、老师三人各管理五名学生

【新接触的赋值模式】
数组与数组累加

string nameseed = "ABCDE";
for (int i = 0; i < len; i++)
{
	//老师赋值:
	tArray[i].tname  = "teacher_";
	tArray[i].tname += nameseed[i];//在teacher_后面加上对应的ABCDE

	//学生赋值:
	for (int j = 0; j < 5; j++)
	{
		tArray[i].sAarry[j].sname = "student_";
		tArray[i].sAarry[j].sname += nameseed[j];//同老师的赋值方法一样

【随机数vs随机数种子】

随机数

int random = rand() % 61 + 40;//40 - 100(随机数分配)

rand() % 60 代表 0 - 59 (60-1)
若后面再加数字就代表在起始的位置加数字

随机数种子

srand((unsigned int)time(NULL));
加一个头文件< ctime >

#include <iostream>
#include <string>
#include <ctime>
using namespace std;

//学生结构体
struct student 
{
	string sname;//名字
	int score;//分数
};
//老师结构体
struct teacher
{
	string tname;//名字
	struct student sAarry[5];
};
//给老师与学生赋值
void allocateSpace(struct teacher tArray[], int len)
{
	string nameseed = "ABCDE";
	for (int i = 0; i < len; i++)
	{
		//老师赋值:
		tArray[i].tname  = "teacher_";
		tArray[i].tname += nameseed[i];//在teacher_后面加上对应的ABCDE

		//学生赋值:
		for (int j = 0; j < 5; j++)
		{
			tArray[i].sAarry[j].sname = "student_";
			tArray[i].sAarry[j].sname += nameseed[j];//同老师的赋值方法一样

			int random = rand() % 61 + 40;//40 - 100(随机数分配)
			//rand() % 60 代表 0 - 59 (60-1) 若后面再加数字就代表在起始的位置加数字
			tArray[i].sAarry[j].score = random;

		}
		
	}
}
//输出所有内容的函数
void printInfo(struct teacher tArray[], int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << "老师的姓名:" << tArray[i].tname << endl;
		for (int j = 0; j < 5; j++)
		{
			cout << "\t老师所带学生姓名:" << tArray[i].sAarry[j].sname << "\t"
				<< "学生的成绩:" << tArray[i].sAarry[j].score << endl;

		}
	}
}
int main()
{
	//随机数种子
	srand((unsigned int)time(NULL));
	//第一步:创建老师的数组
	struct teacher tArray[3];
	int len = sizeof(tArray) / sizeof(tArray[0]);
	//第二步:给老师的信息赋值,并且老师所带学生赋值
	allocateSpace(tArray, len);
	//第三步:打印所有的信息
	printInfo(tArray, len);
	return 0;
}

2、五位英雄冒泡排序

void bubbleSort(struct hero Array[], int len)
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - i - 1; j++)
{
if(Array[j].age > Array[j + 1].age)
{
struct hero temp = Array[j];//创建与Array相同的数据结构
Array[j] = Array[j + 1];
Array[j + 1] = temp; }
}
}

}

#include <iostream>
#include <string>
using namespace std;

//创建英雄结构体
struct hero
{
	int age;//年龄
	string name;//姓名
};

//冒泡法
void bubbleSort(struct hero Array[], int len)
{
	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len - i - 1; j++)
		{
			if (Array[j].age > Array[j + 1].age)
			{
				struct hero temp = Array[j];//创建与Array相同的数据结构
				Array[j] = Array[j + 1];
				Array[j + 1] = temp;
			}
		}
	}
}
//打印英雄的所有信息
void printHero(struct hero Array[], int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << "英雄的姓名:" << Array[i].name << "\t英雄的年龄:" << Array[i].age << endl;
	}
}
int main()
{
	//1、创建英雄结构体数组	//2、赋值
	struct hero Array[5] =
	{
		{18, "张三"},
		{20, "李四"},
		{17, "王五"},
		{23, "赵六"},
		{21, "周二"}
	};
	int len = sizeof(Array) / sizeof(Array[0]);
	//3、冒泡排序法
	bubbleSort(Array, len);
	//4、输出
	printHero(Array, len);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bessie_Lee_gogogo

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值