zoukankan      html  css  js  c++  java
  • 005 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 << "	学生姓名:" << tArry[i].sArry[j].sName
    				 << "	学生分数:" << 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
    			<< "	 性别:" << per[i].gender
    			<< "	 年龄:" << 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;
    }
    
  • 相关阅读:
    ES6变量的解构赋值、字符串的新增方法
    JavaScript的基础语法及DOM元素和事件
    ES 新特性、异步、TypeScript
    JS实现PC端URL跳转到对应移动端URL
    jquery版本过低安全漏洞问题
    重磅!华为云社区·CSDN【寻找黑马程序员】有奖征文活动奖项公布!!
    车标知识学习网页开发,与Flask通过base64展示二进制图片 #华为云·寻找黑马程序员#
    大型情感剧集Selenium:3_元素定位 #华为云·寻找黑马程序员#
    大型情感剧集Selenium:2_options设置 #华为云·寻找黑马程序员#
    【nodejs原理&源码赏析(9)】用node-ssh实现轻量级自动化部署
  • 原文地址:https://www.cnblogs.com/zcf-blog/p/13275048.html
Copyright © 2011-2022 走看看