C++学习之结构体

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

结构体的定义和使用

语法:

struct 结构体名

{

​ 结构体成员列表;

}; // 注意最后有个分号

通过结构体创建变量的方式有三种:

  1. struct 结构体名 变量名

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

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

结构体的定义

例1:

#include <iostream>
using namespace std;

struct Student
{
	// 成员列表
	string name;
	string gender;
	int age;
	int score;
};

int main() {
	

	system("pause");
	return 0;
}

结构体的使用

定义结构体时struct关键字不能省略, 创建结构体变量的时候可以省略

结构体变量的创建三种方式:

例1:

struct 结构体名 变量名

#include <iostream>
using namespace std;

struct Student
{
	// 成员列表
	string name;
	string gender;
	int age;
	int score;
};

// 第三种方式创建结构体定义
struct Teacher
{
	// 成员列表
	string name;
	string gender;
	int age;
}s3;

int main() {
	// 第一种方式创建结构体
	struct Student s1;		// 创建结构体变量struct可以省略,等价于 Student s1
	s1.name = "张三";
	s1.gender = "男";
	s1.age = 19;
	s1.score = 99;
	cout << "姓名:" << s1.name << " 性别:" << s1.gender << " 年龄:" << s1.age << " 分数:" << s1.score << endl;

	// 第二种方式创建结构体
	struct Student s2 = { "李四", "女", 20, 100 };
	cout << "姓名:" << s2.name << " 性别:" << s2.gender << " 年龄:" << s2.age << " 分数:" << s2.score << endl;
	
	// 第三种方式创建结构体
	s3.name = "王五";
	s3.age = 21;
	s3.gender = "男";
	cout << "姓名:" << s3.name << " 性别:" << s3.gender << " 年龄:" << s3.age << endl;

	system("pause");
	return 0;
}

结构体数组

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

语法:

struct 结构体名 数据名[元素个数] = { {}, {}, {}, …}

#include <iostream>
using namespace std;

struct Student
{
	// 成员列表
	string name;
	int age;
	int score;
};

int main() {
	struct Student stuArry[3] =
	{
		{"张三", 18, 90},
		{"李四", 19, 80},
		{"王五", 20, 100}
	};
	// 修改结构体中的数组
	stuArry[2].name = "赵六";
	stuArry[2].age = 30;
	stuArry[2].score = 65;
	// 遍历结构体数组
	for (int i = 0; i < sizeof(stuArry) / sizeof(stuArry[0]); i++)
	{
		cout << "姓名:" << stuArry[i].name << " 年龄:" << stuArry[i]. age << " 分数:" << stuArry[i].score << endl;
	}


	system("pause");
	return 0;
}

结构体指针

我们可以通过指针访问结构体中的成员

语法:

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

例1:

#include <iostream>
using namespace std;

struct Student
{
	// 成员列表
	string name;
	int age;
	int score;
};

int main() {
	struct Student s1 = { "张三", 19, 100 };
	struct Student* p = &s1;				// 定义结构体类型的指针p
	cout 
		<< "姓名:" << p->name				// 用->取值
		<< " 年龄:" << p->age 
		<< " 分数:" << p->score 
		<< endl;

	system("pause");
	return 0;
}

结构体嵌套结构体

结构体重的成员可以是另一个结构体

例1:

每个老师辅导一个学生,一个老师的结构体中,记录一个学生的结构体。

#include <iostream>
using namespace std;

struct student
{
	// 成员列表
	string name;
	int age;
	int score;
};

struct teacher
{
	string name;
	int id;
	struct student stu;		// 定义嵌套的结构
};

int main() {
	struct teacher t;
	t.name = "老王";
	t.id = 10000;
	// 给嵌套的结构赋值
	t.stu.name = "小王";
	t.stu.age = 18;
	t.stu.score = 80;
	cout << " 老师姓名:" << t.name 
		 << " 老师ID:" << t.id 
		 << " 学生姓名:" << t.stu.name 
		 << " 学生年龄:" << t.stu.age
		 << " 学生分数:" << t.stu.score 
		 << endl;

	system("pause");
	return 0;
}

结构体作为函数参数

将结构体作为参数项函数中传递

传递方式有两种:

  1. 值传递
  2. 引用传递(地址传递)

例1:

#include <iostream>
using namespace std;

struct student
{
	// 成员列表
	string name;
	int age;
	int score;
};

void printStudent1(struct student s)
{
	s.age = 100;		// 值传递只能改变形参
	cout << "学生姓名: " << s.name
		 << " 学生年龄:" << s.age
		 << " 学生分数:" << s.score << endl;
}

void printStudent2(struct student * p)
{
	p->age = 200;		// 地址传递可以改变实参的值
	cout << "学生姓名: " << p->name
		 << " 学生年龄:" << p->age
		 << " 学生分数:" << p->score << endl;
}

int main() {
	struct student s1;
	s1.name = "张三";
	s1.age = 18;
	s1.score = 85;
	printStudent1(s1);			// 值传递
	cout << "实参的值:" << endl;;
	cout << "学生姓名: " << s1.name
		 << " 学生年龄:" << s1.age
		 << " 学生分数:" << s1.score << endl;
	cout << "--------------------------华丽的分割线--------------------------" << endl;
	struct student s2;
	s2.name = "张三";
	s2.age = 18;
	s2.score = 85;
	printStudent2(&s2);			// 地址传递
	cout << "实参的值:" << endl;
	cout << "学生姓名: " << s2.name
		 << " 学生年龄:" << s2.age
		 << " 学生分数:" << s2.score << endl;

	system("pause");
	return 0;
}

结构体中const的使用

用来防止修改数据产生误操作

例1:

#include <iostream>
using namespace std;

struct student
{
	// 成员列表
	string name;
	int age;
	int score;
};

void printStudent(const struct student* p) // 使用const修饰,使得无法修改
{
	// p->score = 200;				// 未使用const修饰,可以修改,使用了const 报“表达式必须是可修改的左值”错误
	cout << " 姓名:" << p->name
		 << " 年龄:" << p->age
		 << " 分数:" << p->score
		 << endl;
}

int main() {
	struct student s;
	s.name = "张三";
	s.age = 18;
	s.score = 80;
	printStudent(&s);		// 调用打印函数

	system("pause");
	return 0;
}

结构体案例

案例1

案例描述:

学校正在做毕业设计项目,每名老师带领5个学生,共有3名老师,需求如下:

  1. 设计学生和老师的结构体,其中在老师结构体中,有老师姓名和一个存放5名学生的数组作为成员
  2. 学生的成员有姓名、考试分数
  3. 创建数组存放3名老师,通过函数给每个老师及所带学生赋值,最终打印出老师数据以及老师所带学生数据

例1:

#include <iostream>
using namespace std;
#include <time.h>

// 学生的结构体
struct student
{
	// 成员列表
	string sName;
	int score;
};

// 老师的结构体
struct teacher
{
	string tName;
	struct student sArry[5];
};

// 给老师数组赋值
void allocateSpace(struct teacher tArry[], int len)
{
	string nameSeed = "12345";		// 方便给老师和学生加后缀
	for (int i = 0; i < len; i++)
	{
		tArry[i].tName = "teacher_";		// 添加老师名称
		tArry[i].tName += nameSeed[i];		// 给老师名称添加后缀

		// 给老师添加学生信息
		for (int j = 0; j < 5; j++)
		{
			tArry[i].sArry[j].sName = "student_";		// 添加学生名称
			tArry[i].sArry[j].sName += nameSeed[j];		// 给学生名称添加后缀
			int score = rand() % 61 + 40;				// 生成随机分数0-60,然后都加40,即40-100分
			tArry[i].sArry[j].score = score;
		}
	}
}

void printInfo(struct teacher tArry[], int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << "老师姓名:" << tArry[i].tName << endl;
		for (int j = 0; j < 5; j++)
		{
			cout << "\t学生姓名:" << tArry[i].sArry[j].sName
				 << "\t学生分数:" << tArry[i].sArry[j].score << endl;
		}
	}
}

int main() {
	srand((unsigned int)time(NULL));		// 需要导入time头文件 #include <time.h>

	// 创建3个老师的空数组
	struct teacher tArry[3];

	// 通过函数给3个老师的信息赋值,并给老师带的学生新赋值
	int tArryLen = sizeof(tArry) / sizeof(tArry[0]);
	allocateSpace(tArry, tArryLen);

	// 打印信息
	printInfo(tArry, tArryLen);

	system("pause");
	return 0;
}

案例2

案例描述:

设计一个人物的结构体,包括成员姓名,年龄,性别;创建结构体数组,数组中存放5个人物,通过冒泡排序的算法,将数组中的英雄按年龄进行升序排序,最终打印排序后的结果。

五名人物如下:

{"刘备", 23, "男"},
{"关羽", 22, "男"},
{"张飞", 21, "男"},
{"赵云", 20, "男"},
{"貂蝉", 16, "女"}

例2:

#include <iostream>
using namespace std;

struct person
{
	string name;
	int age;
	string gender;
};

// 冒泡排序
void bubbleSort(struct person per[], int len)
{
    // 控制比较轮次,每次找出一个最大的
	for (int i = 0; i < len - 1; i++)
	{
        // 控制比较次数,每轮
		for (int j = 0; j < len - i - 1; j++)
		{
            // 对年龄进行比较,并进行交换
			if (per[j].age > per[j + 1].age)
			{
				struct person temp = per[j];
				per[j] = per[j + 1];
				per[j + 1] = temp;
			}
		}
	}
}

// 打印结构体数组信息
void printInfo(struct person per[], int len) 
{
	for (int i = 0; i < len; i++)
	{
		cout << "姓名:" << per[i].name
			<< "\t 性别:" << per[i].gender
			<< "\t 年龄:" << per[i].age
			<< endl;
	}
}

int main() {
	// 定义一个5个人的结构体数组
	struct person per[5] =
	{
		{"刘备", 23, "男"},
		{"关羽", 26, "男"},
		{"张飞", 24, "男"},
		{"赵云", 20, "男"},
		{"貂蝉", 16, "女"}
	};
	int perLen = sizeof(per) / sizeof(per[0]);
	cout << "冒泡排序前:" << endl;
	printInfo(per, perLen);

	bubbleSort(per, perLen);		// 冒泡排序

	cout << "冒泡排序后:" << endl;
	printInfo(per, perLen);



	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/z929162742/article/details/107234140