结构体
:属于用户自定义的数据类型,允许用户存储不同的数据类型。
结构体定义方式
例如创建一个学生信息结构体,代码如下:
#include<String>
//结构体定义
//创建一个学生信息结构体
struct Student {
string name;
int age;
int score;
}s3; //s3是“顺便”创建的结构体变量
通过学生类创建具体的学生,有三种方式,代码如下:
//第一个学生
struct Student s1;
s1.name = "张三"; s1.age = 18; s1.score = 100;//给s1属性赋值,通过一个点访问结构体变量中的属性
cout << "第一个学生的姓名:"<<s1.name <<" "<<"年龄:"<< s1.age <<" "<<"分数:" <<s1.score << endl;
//第二个学生
struct Student s2 = {"李四",19,100};
cout << "第一个学生的姓名:" << s2.name << " " << "年龄:" << s2.age << " " << "分数:" << s2.score << endl;
//第三个学生
s3.name = "王五"; s3.age = 20; s3.score = 100;
cout << "第一个学生的姓名:" << s3.name << " " << "年龄:" << s3.age << " " << "分数:" << s3.score << endl;
结构体数组
将自定义的结构体放入到数组中方便维护。
//结构体数组
struct Student stuArray[3] = {
{"张三",18,105},
{"李四",19,107},
{"王五",20,98}
};
//给结构体数组中的元素赋值
stuArray[2].name = "赵六";
//遍历结构体数组
for (int i = 0; i < 3;i++){
cout << " 姓名: " << stuArray[i].name
<< " 年龄: " << stuArray[i].age
<< " 分数: " << stuArray[i].score << endl;
}
结构体指针
通过指针来访问结构体中的成员。利用操作符—>可以通过结构体指针访问结构体属性。
//第一个学生
struct Student s1;
s1.name = "张三"; s1.age = 18; s1.score = 100; //给s1属性赋值,通过一个点访问结构体变量中的属性
//利用操作符->可以通过结构体指针访问结构体属性
struct Student *p5 = &s1;
cout << p5->name << endl;
结构体嵌套结构体
结构体中的成员可以是另一个结构体,用于解决实际问题。例如每个老师辅导一个学生,一个老师的结构体中,记录一个学生的结构体。
//学生结构体
struct Student {
string sname;
int score;
int age;
};
//嵌套结构体 比如一个老师对应一个学生
struct teacher {
string name;
int id;
int age;
struct Student stu; //辅导的学生
};
struct teacher t1;
t1.id = 000001;
t1.name = "BXX";
t1.age = 18;
t1.stu.sname = "帅狗";
t1.stu.age = 18;
t1.stu.score = 100;
结构体做函数参数
将结构体作为参数向函数中传递。
//打印学生函数
//值传递
void printstu1(struct Student s1){
cout << s1.name;
}
//地址传递
void printstu2(struct Student *p6){
cout << p6->name;
}
int main(){
//将结构体作为参数向函数中传递
//值传递
printstu1(s1);
//地址传递
printstu2(&s1);
}
结构体中const修饰的作用
用const来防止误操作。
//通过函数打印结构体变量信息
//值传递虽然可行,但是每次传入时会将整个结构体的信息复制获取一遍,遇到很大的数据量就会格外占用内存
//将函数中的形参改为指针,可以节省内存地址,而且不会复制一份新的副本出来
void printStudent(const student *s1) {
//s1->age = 150; //加入const之后,一旦修改就会发生报错,防止地址传递时发生误操作
cout << "年龄" << s1->age << "姓名" << s1->name << "分数" << s1->score << endl;
}
结构体练习案例1
共有三名老师,每名老师带五个学生,输出老师和所带学生的信息。
struct Student {
string sname;
int score;
};
struct Teacher {
string tname;
struct Student sArray[5];
};
//给3个老师和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];
//通过循环给老师所带学生赋值
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;
}
}
}
//打印3老师5学生的所有信息
void printAll(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].sArray[j].sname << " 考试成绩:" << tArray[i].sArray[j].score << endl;
}
}
}
int main(){
//案例一:三名老师,每名老师带五个学生,输出老师和所带学生的信息
//随机数种子
srand((unsigned int)time(NULL)); //加入头文件ctime
//创建老师数组
struct Teacher tArray[3];
int len = sizeof(tArray) / sizeof(tArray[0]);
allocateSpace(tArray,len);
printAll(tArray,len);
}
结构体练习案例2
将三国中的英雄,按照年龄从小到大排序。
//英雄结构体
struct Hero {
string name;
int age;
string sex;
};
void bubbleSort(struct Hero heroArray[],int len) {
for (int i = 0; i < len-1; i++) {
for (int j = 0; j < len - 1 - i; j++) {
if (heroArray[j].age>heroArray[j+1].age) {
struct Hero temp = heroArray[j]; //这里的临时变量temp要设为结构体格式的temp
heroArray[j] = heroArray[j + 1];
heroArray[j + 1] = temp;
}
}
}
}
void printHero(struct Hero heroArray[], int len) {
cout << "冒泡排序后,从小到大输出英雄信息:" << endl;
for (int i = 0; i < len; i++) {
cout << "姓名:" << heroArray[i].name << " 年龄:" << heroArray[i].age << " 性别:" << heroArray[i].sex << endl;
}
}
int main(){
//案例二:英雄年龄从小到大排序
//1.创建英雄结构体
//2.创建英雄数组
struct Hero heroArray[5] = {
{"刘备",23,"男"},
{"关羽",22,"男"},
{"张飞",20,"男"},
{"赵云",21,"男"},
{"貂蝉",19,"女"}
};
//3.对数组按照年龄进行排序
int len = sizeof(heroArray) / sizeof(heroArray[0]);
bubbleSort(heroArray,len);
//4.排序后结果打印输出
printHero(heroArray, len);
}