C++学习笔记07(结构体)

8.结构体

8.1基本概念

结构体是用户自定义的数据类型,允许用户存储不同的数据类型。

一些数据类型的集合组成的类型。

8.2结构体的定义和使用

语法: struct 结构体名{ 结构体成员列表 };(在main函数外定义嗷)

struct Student {  string name ;   int age ;  }

创建变量:(这里的struct可以省略)

(1)struct 结构体名 变量名                           

      struct Student s1;

      s1 . name="张三";

      s1 . age=22;

(2)struct 结构体名 变量名= { 成员1值,成员2值...}   

      struct Student s1  =  { " 张三 ” ,22  };

(3)定义结构体时顺便创建变量

       struct 结构体名{ 结构体成员列表 } s3;在这里创建变量

8.3结构体数组

将自定义的结构体放入数组中方便维护。

语法:struct 结构体名 数组名[ 元素个数 ] = { { } ,{ } ,....}

//创建结构体数组
	struct student stuArray[3] =
	{
	{"丞哥", 18, 85},
	{"李四", 19, 80},
	{"成歌", 22, 90}
	};
	//给结构体数组中的元素赋值
	stuArray[1].name = "蛋蛋";
	stuArray[1].age = 22;
	stuArray[1].score = 395;

	//遍历结构体数组
	for (int i = 0; i < 3; i++) 
	{
		cout << "名字是" << stuArray[i].name
			<< "   年龄是" << stuArray[i].age
			<< "   成绩是" << stuArray[i].score;
		cout << endl;
	}

8.4结构体指针

作用:通过指针访问结构体中的成员

利用操作符  ->  就可以通过结构体指针访问结构体的成员属性


	//创建结构体变量
	struct student s ={"丞哥", 18, 85};

	//通过指针指向结构体变量
	struct student*p = &s;

	//通过指针访问结构体变量中的数据
	cout<<"姓名:" << p->name << endl;
	cout << "年龄:" << p->age << endl;
	cout << "成绩:" << p->score << endl;

8.5结构体嵌套结构体

作用:结构体成员可以是另一个结构体

struct student
{
	string name;
	int age;
	int score;
};
struct teacher
{
	int id;
	string name;
	struct student stu;//这里就定义了一个学生变量
};
int main()
{
	//创建老师
	teacher t;
	t.id = 10000;
	t.name = "丞哥";
	t.stu.name = "蛋蛋";
	t.stu.score = 395;

	cout << "老师的名字是"<<t.name << endl;
	cout << "学生的名字是" << t.stu.name << endl;
	cout << "学生的成绩为" << t.stu.score << endl;

8.6结构体做函数参数

作用:将结构体作为参数向函数中传递

传递方式: 值传递  地址传递

void printStudent1(struct student s)
{
	s.age = 23;
	cout << "子函数中的   姓名:" << s.name << "   年龄" << s.age << "   成绩" << s.score << endl;
}

void printStudent2(struct student *s)
{
	s->age = 24;
	cout << "子函数2中的   姓名:" << s->name << "   年龄" << s->age << "   成绩" << s->score << endl;
}
int main()
{
	//创建一个结构体变量
	student s = { "丞哥",22,85 };
	printStudent1(s);
	printStudent2(&s);//指针后把实参的值也更改了
	cout << "main函数中的   姓名:" << s.name << "   年龄" << s.age << "   成绩" << s.score << endl;

8.7结构体中const使用场景

作用:用const来防止在函数内误操作

将函数中的形参改成指针,可以减少内存空间,而且不会复制新的副本出来。

在形参前加一个const 就不会在函数中更改实参的值了。

void printstudent (const student *s)

8.8结构体案例

struct student
{
	string name;
	int score;
};

struct teacher
{
	string name;
	struct student arr2[5];
};

void allocateSpace(struct teacher arr1[], int len)
{
	for (int i = 0; i < len; i++)
	{
		string nameSeed = "ABCDE";
		arr1[i].name = "teacher_";
		arr1[i].name += nameSeed[i];//追加字母   (?我不理解,字符还能这样加)
		for (int j = 0; j < 5; j++)//通过循环给每名老师的学生赋值
		{
			arr1[i].arr2[j].name = "student_";
			arr1[i].arr2[j].name += nameSeed[j];
			int random = rand() % 61 + 40;//0~59+40=40~100
			arr1[i].arr2[j].score = random;
		}
	}
}

void printInfo(struct teacher arr1[],int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << "老师的姓名: " << arr1[i].name << endl;
		for (int j = 0; j < 5; j++)
		{
			cout << "学生的名字: " << arr1[i].arr2[j].name 
				<< "该学生的成绩: " << arr1[i].arr2[j].score << endl;
		}
	}
}
int main()
{
	//随机数种子
	srand((unsigned int)time(NULL));
	//创建老师的数组
	struct teacher arr1[3];
	//通过函数给3名老师的信息赋值,并给老师所带学生赋值
	int len = sizeof(arr1) / sizeof(arr1[0]);

    //创建学生的数组
	struct student arr2[5];
	allocateSpace(arr1, len);
	printInfo(arr1, len);

	system("pause");
	return 0;
}

8.8.2结构体案例2

struct hero
{
	string name;
	int age;
	string sex;
};
void bubblesort(struct hero arr[], int len)
{
	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len - i - 1; j++)
		{
			//int temp = 0;
			if (arr[j].age > arr[j + 1].age)
			{
				struct hero temp = arr[j];//这里记录的是一个数组里面的全部变量,
                                            不然人和名字对不上
				temp.age = arr[j].age;
				arr[j]= arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}
void printHero(struct hero arr[], int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << "英雄的名字是: " << arr[i].name << 
			"   年龄是:" << arr[i].age << 
			"   性别是:" << arr[i].sex << endl;
	}
}
int main()
{
	struct hero arr[5]
	{
		{ "刘备",23,"男" },
		{ "关羽",22,"男" },
        { "张飞",20,"男" },
		{ "赵云",21,"男" },
	    { "貂蝉",19,"女" }
	};
	int len = sizeof(arr) / sizeof(arr[0]);
	bubblesort(arr, len);
	printHero(arr, len);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值