一、结构体基本概念
结构体属于用户自定义的数据类型允许用户存储不同的数据类型。
二、结构体定义和使用
#include <iostream> #include <string> using namespace std; //1、创建学生数据类型(姓名、年龄、分数) //自定义数据类型,一些类型集合组成的类型 语法 struct 类型名称{成员列表} struct Student { // 成员列表 //姓名 string name; //年龄 int age; //成绩 int score; } s3; int main() { //2、通过学生类型创建具体学生 //2.1 struct Student s1赋值 struct Student s1; s1.name = "zhangsan"; s1.age = 18; s1.score = 100; cout << "姓名:" << s1.name << "年龄:" << s1.age << "分数:" << s1.score << endl; // 2.2 struct Student s2 = {"lisi", 28, 80}; struct Student s2 = {"lisi", 28, 80}; cout << "姓名:" << s2.name << "年龄:" << s2.age << "分数:" << s2.score << endl; //2.3 定义的时候创建 不推荐 s3.name = "wangwu"; s3.age = 18; s3.score = 100; cout << "姓名:" << s3.name << "年龄:" << s3.age << "分数:" << s3.score << endl; return 0; }
姓名:zhangsan年龄:18分数:100 姓名:lisi年龄:28分数:80 姓名:wangwu年龄:18分数:100
三、结构体数组
#include <iostream> #include <string> using namespace std; //1、创建学生数据类型(姓名、年龄、分数) //自定义数据类型,一些类型集合组成的类型 语法 struct 类型名称{成员列表} struct Student { // 成员列表 //姓名 string name; //年龄 int age; //成绩 int score; }; int main() { struct Student arr[3] = {{"zhansan", 18, 100}, {"lisi", 19, 90}, {"wangwu", 20, 80}}; int length = sizeof(arr) / sizeof(arr[0]); for (int i = 0; i < length; ++i) { cout << "姓名:" << arr[i].name << "年龄:" << arr[i].age << "分数:" << arr[i].score << endl; } return 0; }
姓名:zhansan年龄:18分数:100 姓名:lisi年龄:19分数:90 姓名:wangwu年龄:20分数:80
四、结构体指针
#include <iostream> #include <string> using namespace std; //1、创建学生数据类型(姓名、年龄、分数) //自定义数据类型,一些类型集合组成的类型 语法 struct 类型名称{成员列表} struct Student { // 成员列表 //姓名 string name; //年龄 int age; //成绩 int score; }; int main() { // 1、创建 Student s1={"zhangsan",18,100}; //2、指针指向变量 Student* p=&s1; //3、功过指针访问结构体变量中的数据 指针访问结构体数组使用:-> cout << "姓名:" << p->name << "年龄:" << p->age << "分数:" << p->score << endl; return 0; }
姓名:zhangsan年龄:18分数:100
五、结构体嵌套结构体
#include <iostream> #include <string> using namespace std; //1、创建学生数据类型(姓名、年龄、分数) struct student { // 成员列表 //姓名 string name; //年龄 int age; //成绩 int score; }; //教师结构体 struct teacher { // 成员列表 int id; string name; int age; struct student stu; }; int main() { teacher t1 = {1, "wanglaoshi", 28, {"zhangsan", 18, 100}}; teacher *p = &t1; cout << p->stu.name << endl; return 0; }
zhangsan
六、结构体做函数参数
#include <iostream> #include <string> using namespace std; //1、创建学生数据类型(姓名、年龄、分数) struct student { // 成员列表 //姓名 string name; //年龄 int age; //成绩 int score; }; //值传递 void printStu1(struct student stu) { stu.age=100; cout << "printStu1 打印 姓名:" << stu.name << "年龄:" << stu.age << "分数:" << stu.score << endl; } //地址传递 void printStu2(struct student *p) { p->age=200; cout << "printStu2 打印 姓名:" << p->name << "年龄:" << p->age << "分数:" << p->score << endl; } int main() { student stu = {"zhangsan", 18, 100}; printStu1(stu); cout << "main1 打印 姓名:" << stu.name << "年龄:" << stu.age << "分数:" << stu.score << endl; printStu2(&stu); cout << "main2 打印 姓名:" << stu.name << "年龄:" << stu.age << "分数:" << stu.score << endl; return 0; }
printStu1 打印 姓名:zhangsan年龄:100分数:100 main1 打印 姓名:zhangsan年龄:18分数:100 printStu2 打印 姓名:zhangsan年龄:200分数:100 main2 打印 姓名:zhangsan年龄:200分数:100
七、结构体中const使用场景
#include <iostream> #include <string> using namespace std; //1、创建学生数据类型(姓名、年龄、分数) struct student { // 成员列表 //姓名 string name; //年龄 int age; //成绩 int score; }; //地址传递 指针占用内存小 不会复制副本 使用const限定只读 void printStu(const struct student *p) { cout << "printStu 打印 姓名:" << p->name << "年龄:" << p->age << "分数:" << p->score << endl; } int main() { student stu = {"zhangsan", 18, 100}; cout << "main 打印 姓名:" << stu.name << "年龄:" << stu.age << "分数:" << stu.score << endl; printStu(&stu); return 0; }
main 打印 姓名:zhangsan年龄:18分数:100 printStu 打印 姓名:zhangsan年龄:18分数:100
八、结构体案例
学校正在做毕设项目,每名老师带领5个学生,总共有3名老师,需求如下设计学生和老师的结构体,其中在老师的结构体中,有老师姓名和一个存放5名学生的数组作为成员学生的成员有姓名、考试分数,创建数组存放3名老师,通过函数给每个老师及所带的学生赋值最终打印出老师数据以及老师所带的学生数据。
#include <iostream> #include <string> #include<ctime> using namespace std; struct student { string sName; int score; }; struct teacher { string tName; struct student stus[5]; }; //初始化数组 void allocatSpace(struct teacher arr[], int len) { string nameSeed = "ABCDE"; for (int i = 0; i < len; ++i) { arr[i].tName = "tearch_"; arr[i].tName += nameSeed[i]; for (int j = 0; j < 5; ++j) { arr[i].stus[j].sName = "student_"; arr[i].stus[j].sName += nameSeed[i]; arr[i].stus[j].score = rand() % 60 + 40; } } } //打印数据 void printTearch(struct teacher arr[], int len) { for (int i = 0; i < len; ++i) { teacher t = arr[i]; cout << t.tName << " "; for (int j = 0; j < 5; ++j) { cout << t.stus[j].sName << " "; cout << t.stus[j].score << " "; } cout << endl; } } int main() { // 创建老师数组 srand((unsigned int) time(NULL)); struct teacher tArr[3]; int len = sizeof(tArr) / sizeof(tArr[0]); // 初始化数据 allocatSpace(tArr, len); // 打印数据 printTearch(tArr, len); return 0; }
tearch_A student_A 64 student_A 88 student_A 83 student_A 90 student_A 93 tearch_B student_B 92 student_B 69 student_B 69 student_B 98 student_B 65 tearch_C student_C 69 student_C 86 student_C 72 student_C 57 student_C 95
设计一个英雄的结构体,包括成员姓名,年龄,性别;创建结构体数组,数组中存放5名英雄.
通过冒泡排序的算法,将数组中的英雄按照年龄进行升席排序,最终打印排序后的结果。
#include <iostream> #include <string> #include<ctime> using namespace std; struct hero { string name; int age; }; void sortHearo(struct hero hearos[], int len) { for (int i = 0; i < len; ++i){ for (int j = i+1; j < len; ++j){ if(hearos[j].age<hearos[i].age){ hero tem=hearos[i]; hearos[i]=hearos[j]; hearos[j]=tem; } } } } int main() { struct hero heros[5] = { {"刘备", 23}, {"关羽", 22}, {"张飞", 20}, {"赵云", 21}, {"貂蝉", 19} }; int len=sizeof(heros)/sizeof(heros[0]); for (int i = 0; i < len; ++i){ cout<<"姓名: "<<heros[i].name<<" 年龄: "<<heros[i].age<<endl; } cout<<endl; sortHearo(heros,len); for (int i = 0; i < len; ++i){ cout<<"姓名: "<<heros[i].name<<" 年龄: "<<heros[i].age<<endl; } return 0; }
姓名: 刘备 年龄: 23 姓名: 关羽 年龄: 22 姓名: 张飞 年龄: 20 姓名: 赵云 年龄: 21 姓名: 貂蝉 年龄: 19 姓名: 貂蝉 年龄: 19 姓名: 张飞 年龄: 20 姓名: 赵云 年龄: 21 姓名: 关羽 年龄: 22 姓名: 刘备 年龄: 23