c++结构体

  1. 结构体的定义与使用

    创建学生的数据类型:学生包括(姓名,年龄,分数)
    结构体定义语法:
    struct 结构体名 { 结构体成员列表 }
    
#include <iostream>
using namespace std;
#include <string>

//1.创建学生的数据类型:学生包括(姓名,年龄,分数)
	/*结构体定义语法:
	struct 结构体名 { 结构体成员列表 };*/

struct Student
{
	//成员列表
	//姓名
	string name;
	//年龄
	int age;
	//分数
	int score;
}/*2.3 在定义结构体时顺便创建一个结构体变量*/ s3;

//2.通过学生类型创建具体的学生
//几种创建方式:
int main()
{
	//2.1 struct Student s1
	//struct关键字是可以省略的,但是定义的时候不能省略
	/* struct */ Student s1;
	
	//给s1属性赋值,通过.访问结构体变量中的属性
	s1.name = "张三";
	s1.age = 18;
	s1.score = 100;

	cout << " 姓名: " << s1.name << " 年龄: " << s1.age << " 分数: " << s1.score << endl;
	
	//2.2 struct Student s2 = {...}	
	/* struct */ Student s2 = { "李四",19,80 };
	cout << " 姓名: " << s2.name << " 年龄: " << s2.age << " 分数: " << s2.score << endl;
	
	//2.3
	s3.name = "王五";
	s3.age = 20;
	s3.score = 60;
	cout << " 姓名: " << s3.name << " 年龄: " << s3.age << " 分数: " << s3.score << endl;
	
	system("pause");
	return 0;
}
  1. 结构体数组

    结构体数组
    作用:将自定义的结构体放入到数组中方便维护
    语法:struct 结构体名 数组名{元素个数} = { {},{},...{} }
    
#include <iostream>
using namespace std;
#include <string>

/*结构体数组
  作用:将自定义的结构体放入到数组中方便维护
  语法:struct 结构体名 数组名{元素个数} = { {},{},...{} }*/

//1.定义一个结构体
struct Student
{
	string name;
	int age;
	int score;
};
int main()
{
	//2.创建一个结构体数组
	struct Student stuArray[3] =
	{
		//3.1 给结构体数组中的元素赋值
		{"张三",18,100},
	    {"李四",28,99},
	    {"王五",38,66},
	};
	//3.2 可以修改结构体数组中的元素
	stuArray[2].name = "赵六";
	stuArray[2].age = 80;
	stuArray[2].score = 60;
	
	//4.遍历结构体数组
	for (int i = 0; i < 3; i++)
	{
		cout << "姓名:" << stuArray[i].name 
			<< " 年龄:" << stuArray[i].age 
			<< " 分数:" << stuArray[i].score << endl;
	}
	system("pause");
	return 0;
}
  1. 结构体指针

    结构体指针
    作用:通过结构体访问结构体中的成员
    利用操作符 -> 可以通过结构体指针访问结构体属性
    
#include <iostream>
using namespace std;
#include <string>

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

struct Student
{
	string name;
	int age;
	int score;
};
int main()
{
	//创建学生结构体变量
	/* struct (可以省略的) */ Student s = { "张三",18,100 };

	//通过指针指向结构体变量
	//int * p = &s;这里是错误的
	Student * p = &s;
	
	//通过指针访问结构体变量中的值
	cout << " 姓名:" << p->name
		<< " 年龄:" << p->age
		<< " 分数 " << p->score << endl;
	
	system("pause");
	return 0;
}
  1. 结构体嵌套结构体

    结构体嵌套结构体
    作用:结构体中的成员可以是另一个结构体
    
#include <iostream>
using namespace std;
#include <string>

/*结构体嵌套结构体
  作用:结构体中的成员可以是另一个结构体*/

//例如:每个老师辅导一个学员,一个老师的结构体中,记录一个学生的结构体
//定义一个学生的结构体
struct student
{
	string name;
	int age;
	int score;
};
//定义一个老师的结构体
struct teacher
{
	int id;
	string name;
	int age;
	struct student stu;
};
int main()
{
	//创建老师
	teacher t;
	t.id = 10000;
	t.name = "老王";
	t.age = 50;
	t.stu.name = "小王";
	t.stu.age = 20;
	t.stu.score = 60;

	cout << "老师姓名:" << t.name
		<<" 老师编号:"<<t.id
		<< " 老师年龄:" << t.age
		<<" 老师辅导的学生姓名:"<<t.stu.name
		<<" 学生年龄:"<<t.stu.age
		<< " 学生分数:" << t.stu.score << endl;

	system("pause");
	return 0;
}
  1. 结构体做函数参数

    结构体做函数参数
    作用:将结构体作为参数向函数中传递
    传递方式有两种:
    1.值传递
    2.地址传递
    
#include <iostream>
using namespace std;
#include <string>

/*结构体做函数参数
  作用:将结构体作为参数向函数中传递
  传递方式有两种:
  1.值传递
  2.地址传递 */

//将学生传入到一个参数中,打印学生身上的信息
//定义一个学生的结构体
struct student
{
	string name;
	int age;
	int score;
};
//打印学生信息的函数

//1.值传递
void printStudent1(struct student s)
{
	s.age = 100;
	cout << "子函数中打印结果:" << "姓名:" << s.name <<
		" 年龄:" << s.age << " 成绩:" << s.score << endl;
}

//2.地址传递
void printStudent2(struct student * p)
{
	p->age = 200;
	cout << "子函数2中打印结果:" << "姓名:" << p->name <<
		" 年龄:" << p->age << " 成绩:" << p->score << endl;
}

int main()
{
	//创建结构体变量
	student s = { "张三",20,85 };
	
	//值传递
	//printStudent1(s);	
	
	//地址传递
	printStudent2(&s);
	
	cout << "在main函数中打印结果:" <<
		"姓名:" << s.name << " 年龄:" << s.age << " 成绩:" << s.score
		<< endl;
	
	system("pause");
	return 0;
}
  1. 结构体中const的使用情况

    结构体中const的使用场景
    作用:用const来防止误操作
    
#include <iostream>
using namespace std;
#include <string>

/*结构体中const的使用场景
  作用:用const来防止误操作*/

//定义一个学生的结构体
struct student
{
	string name;
	int age;
	int score;
};

/*
void printStudent(student s)
{
	s.age = 15;//这里假如不小心修改了
	cout << "姓名:" << s.name <<
		" 年龄:" << s.age << " 成绩:" << s.score << endl;
}*/

//将函数中形参改为指针,可以减少内存,而不会复制出新的副本来
void printStudent(const student *s)
{
	// s->age = 150;  加入const之后,一旦有修改就会报错
	cout << "姓名:" << s->name <<
		" 年龄:" << s->age << " 成绩:" << s->score << endl;
}
int main()
{
	//创建结构体变量
	student s = { "张三",15,70 };

	//printStudent(s);	
	printStudent(&s);
		
	system("pause");
	return 0;
}
  1. 结构体案例1

    案例:学习正在做毕设项目,每名老师带领5个学生,总共有3名老师,需求如下
    设计学生和老师的结构体,其中在老师的结构体中,有老师姓名和一个存放5名学生的数组作为成员
    学生的成员有姓名,分数,创建数组存放3名老师,通过函数给每个老师所带的学生赋值
    最终打印出老师数据以及老师所带的学生数据
    
#include <iostream>
using namespace std;
#include <string>
#include <Ctime>

/*案例:学习正在做毕设项目,每名老师带领5个学生,总共有3名老师,需求如下
        设计学生和老师的结构体,其中在老师的结构体中,有老师姓名和一个存放5名学生的数组作为成员
		学生的成员有姓名,分数,创建数组存放3名老师,通过函数给每个老师所带的学生赋值
		最终打印出老师数据以及老师所带的学生数据*/

//定义学生的结构体
struct student
{
	string sname;
	int score;
};
//定义老师的结构体
struct teacher
{
	string tname;
	struct student sArray[5];
};

//给老师和学生赋值的函数
void allocateSpace(teacher tArray[],int len )
{
	string nameSeed = "ABCDE";
	//给老师开始赋值
	for (int i = 0; i < len; i++)
	{
		tArray[i].tname = "teacher_";
		tArray[i].tname += nameSeed[i];

		//通过循环给每名学生赋值
		for (int j = 0; j < 5; j++)
		{
			tArray[i].sArray[j].sname = "Student_";
			tArray[i].sArray[j].sname += nameSeed[j];

			int random = rand() % 61 + 40;//随机出来是40 ~ 100
			tArray[i].sArray[j].score = random;
		}
		
	}
}

//打印所有信息的函数
void printInfo(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].sArray[j].sname 
			 << " 分数:" << tArray[i].sArray[j].score << endl;
		}
	}
}

int main()
{
	//4.随机数种子
	srand((unsigned int)time(NULL));
	
	//1.创建3名老师的数组
	teacher tArray[3];
	
	//2.通过函数给3名老师的信息赋值,并给老师带的学生信息赋值
	int len = sizeof(tArray) / sizeof(tArray[0]);
	allocateSpace(tArray,len);

	//3.打印所有老师及所带的学生信息
	printInfo(tArray,len);
	
	system("pause");
	return 0;
}
方法二:
#include <iostream>
using namespace std;
#include <string>
//#include <Ctime>

//定义学生的结构体
struct student
{
	string sname;
	int score;
};
//定义老师的结构体
struct teacher
{
	string tname;
	struct student sArray[5];
};

//给老师和学生赋值的函数
void allocateSpace(teacher tArray[], int len)
{
	//给老师开始赋值
	for (int i = 0; i < len; i++)
	{
		cout << "请输入第" << i + 1 << "名老师姓名:" << endl;
		cin >> tArray[i].tname;

		//通过循环给每名学生赋值
		for (int j = 0; j < 5; j++)
		{
			cout << "请输入第" << j + 1 << "名学生姓名:" << endl;
			cin >> tArray[i].sArray[j].sname;
			cout << "请输入第" << j + 1 << "名学生成绩:" << endl;
			cin >> tArray[i].sArray[j].score;
		}

	}
}

//打印所有信息的函数
void printInfo(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].sArray[j].sname
				<< " 分数:" << tArray[i].sArray[j].score << endl;
		}
	}
}

int main()
{
	//1.创建3名老师的数组
	teacher tArray[3];

	//2.通过函数给3名老师的信息赋值,并给老师带的学生信息赋值
	int len = sizeof(tArray) / sizeof(tArray[0]);
	allocateSpace(tArray, len);

	//3.打印所有老师及所带的学生信息
	printInfo(tArray, len);

	system("pause");
	return 0;
}
  1. 结构体案例2

    案例:设计一个英雄的结构体,包括成员姓名,年龄,性别;
    创建结构体数组,数组中存放5名英雄
    通过冒泡排序的算法,将数组中的英雄按照年龄进行升序排序,最终打印排序后的结果
    
    5名英雄信息如下:
    {"刘备",23,"男"},
    {"关羽",22,"男"},
    {"张飞",20,"男"},
    {"赵云",21,"男"},
    {"貂蝉",19,"女"},
    
#include <iostream>
using namespace std;
#include <string>

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

/*5名英雄信息如下:
        {"刘备",23,"男"},
		{"关羽",22,"男"},
		{"张飞",20,"男"},
		{"赵云",21,"男"},
		{"貂蝉",19,"女"},*/

//1.创建英雄结构体
struct Hero
{
	string name;
	int age;
	string sex;
};

//冒泡排序,年龄升序排列
void bubbleSort(struct Hero heroArray[], int len)
{
	for (int i = 1; i <= len - 1; i++)
	{
		for (int j = 0; j < len - i; j++)
		{
			if (heroArray[j].age > heroArray[j + 1].age);
			{
				struct Hero temp = heroArray[j];
				heroArray[j] = heroArray[j + 1];
				heroArray[j + 1] = temp;
			}
		}
	}
}

//4.创建输出函数
void printHero(struct Hero heroArray[], int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << "姓名:" << heroArray[i].name
			<< " 年龄:" << heroArray[i].age
			<< " 性别:" << heroArray[i].sex << endl;
	}
}
int main()
{
	//2.创建数组存放5名英雄
	struct Hero heroArray[5] =
	{
		{"刘备",23,"男"},
		{"关羽",22,"男"},
		{"张飞",20,"男"},
		{"赵云",21,"男"},
		{"貂蝉",19,"女"},
	};

	int len = sizeof(heroArray) / sizeof(heroArray[0]);
	
	//3.对数组进行冒泡排序,按照年龄进行升序排序
	bubbleSort(heroArray, len);

	//4.将排序后结果输出
	printHero(heroArray, len);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值