首页 > 其他分享 >第八章 结构体

第八章 结构体

时间:2024-11-18 12:43:33浏览次数:3  
标签:arr name int age 第八章 结构 struct

C++开发语言基础学习

8 结构体

8.1 结构体的定义与使用

  1. 定义结构体类型(创建模版) :struct 结构体名 {结构体成员列表}

    struct Student{
        string name;
        int age;
        int score;
    }
    
  2. 创建结构体变量(根据模板创建实体)三种方式:

    • struct 结构体名 结构体变量名 + 各属性分别初始化

      struct Student s1;
      s1.name  = "张三";
      s1.age   = 18;
      si.score = 100;
      
    • struct 结构体名 结构体变量名 = {……}

      struct Student s1 = {"张三" , 18 , 100};
      
    • 定义结构体类型时直接创建结构体变量 + 各属性分别初始化

      struct Student{
          string name;
          int age;
          int score;
      }s1;
      
      s1.name  = "张三";
      s1.age   = 18;
      si.score = 100;
      

    注意:在C++中创建结构体变量时 struct 关键字可以省略,但是定义结构体类型时不能省略关键字

  3. 可以将结构体 struct 结构体名 看作是用户自己创建的一种数据类型

8.2 结构体数组

  1. 定义:元素是结构体的数组

  2. 语法:struct 结构体名 数组名[元素个数] = { {} , {} , …… }

  3. 实例:

    /************** 结构体数组定义 **************/
    struct Student arr_student[3] = { {"张三",18,100} , {"李四",19,90} , {"王五",18,79} };
    
    /************** 结构体数组赋值 **************/
    arr_student[0].name  = "赵六";
    arr_student[1].score = 50;
    arr_student[2].age   = 33;
    
    /************** 结构体数组遍历 **************/
    for(int i=0;i<3;i++)
    {
        cout << "姓名: "   << arr_student[i].name 
             << "\t年龄: " << arr_student[i].age 
             << "\t分数: " << arr_student[i].score << endl;
    }
    
    /**************** 输出结果 ****************/
    // 姓名: 赵六     年龄: 18       分数: 100
    // 姓名: 李四     年龄: 19       分数: 50
    // 姓名: 王五     年龄: 33       分数: 79
    

8.3 结构体指针

  1. 定义结构体指针: struct 结构体名* p = &结构体变量名

  2. 访问结构体成员: p->成员名

  3. 修改结构体成员: p->成员名 = 值

  4. 实例:

    /****************** 创建结构体变量 ********************/
    struct Student s1 = { "张三",19,100 };
    
    /****************** 创建结构体指针 ********************/
    struct Student* p = &s1;
    
    /***************** 通过指针修改结构体 ******************/
    p->age = 20;
    
    /***************** 通过指针访问结构体 ******************/
    cout << "姓名: " << p->name << "\t年龄: " << p->age << endl;
    

8.4 结构体嵌套

  1. 实例:

    struct Student {		// 定义学生结构体类型
        string name;
        int age;
        int score;
    }
    
    struct Class_grade1 {	// 定义班级结构体类型
        int class_id;
        int student_num;
        struct Student stu;	// 成员中包括学生结构体类型
    }
    

8.5 结构体做函数参数

  1. 参数传递方法:值传递、地址传递

  2. 两种传参方法的区别:值传递只在函数内部修改,不会对实际结构体产生影响;地址传递会对实际结构体的成员值产生影响

  3. 实例:

    /********************** 值传递 ************************/
    void print_val_prop(struct Student s)
    {
    	s.name = "王五";
        cout << s.name << "\t" << s.age << "\t" << s.score << endl;
    }
    
    /********************** 地址传递 ***********************/
    void print_add_prop(struct Student* p)
    {
    	s->name = "王五";
        cout << p->name << "\t" << p->age << "\t" << p->score << endl;
    }
    
    int main() {
    	struct Student s1 = { "张三",19,95 };
    	print_val_prop(s1);		// 传入结构体
    	print_add_prop(&s1);	// 传入结构体地址
    
    	system("pause");
    	return 0;
    }
    

8.6 const修饰结构体

  1. 作用:避免在结构体地址传递时,函数内部对结构体内容进行的修改,也就是将传入的结构体当做“只读文件”

  2. 修饰方式: function(const struct 结构体名* p)

  3. 实例:

    void print_add_prop(const struct Student* p)
    {
    	s->name = "王五";
        cout << p->name << "\t" << p->age << "\t" << p->score << endl;
    }
    
  • 结构体综合案例1:毕业设计管理

    三名老师,各带5名学生,学生包括名字和成绩,教师包括名字和学生,使用函数对所有信息赋值,最后打印所有信息

    #include <iostream>
    #include <string>
    using namespace std;
    
    struct Student {
    	string name;
    	int score;
    };
    
    struct Teacher {
    	string name;
    	struct Student std_arr[5];
    };
    
    void Teacher_Regist(Teacher* p,int tch_num)
    {
    	for (int i = 0; i < tch_num; i++)
    	{
    		printf("请输入第%d个教师的姓名:", i+1);
    		cin >> (p + i)->name;
    		for (int j = 0; j < 5; j++)
    		{
    			printf("请输入本教师的第%d个学生姓名:", j + 1);
    			cin >> (p + i)->std_arr[j].name;
    			printf("请输入本教师的第%d个学生成绩:", j + 1);
    			cin >> (p + i)->std_arr[j].score;
    		}
    		cout << "-----------------------------------------------" << endl;		
    	}
    }
    
    int main() {
    	struct Teacher tch[3];
    	int tch_num = sizeof(tch) / sizeof(tch[0]);
    	Teacher_Regist(tch, tch_num);
    	for (int i = 0; i < tch_num; i++)
    	{
    		printf("教师%d:%s\n", i + 1, tch[i].name.c_str());
    		for (int j = 0; j < 5; j++)
    			{
    				cout << "\t\t学生" << j+1 << ":" << tch[i].std_arr[j].name
    					 << "\t"         << tch[i].std_arr[j].score << "分" << endl;
    			}
    	}
    	system("pause");
    	return 0;
    }
    
    /******************** 输出结果 **********************/
    教师1:焦施懿
                    学生1:薛晟医   98分
                    学生2:薛晟贰   85分
                    学生3:薛晟叁   95分
                    学生4:薛晟思   68分
                    学生5:薛晟伍   77分
    教师2:焦施尔
                    学生1:秦念医   84分
                    学生2:秦念贰   71分
                    学生3:秦念叁   99分
                    学生4:秦念思   88分
                    学生5:秦念伍   89分
    教师3:焦施散
                    学生1:程韧医   86分
                    学生2:程韧贰   96分
                    学生3:程韧叁   94分
                    学生4:程韧思   86分
                    学生5:程韧伍   31分
    

    注意:第38行printf("教师%d:%s\n", i + 1, tch[i].name.c_str())中为什么要加.c_str()

    问题出现:在最初使用的是printf("教师%d:%s\n", i + 1, tch[i].name),也就是C语言中打印字符串的方式,但是发现打印出的汉字是乱码,查找资料后得知是C和C++字符串风格不同导致的

    C++中使用 printf() 打印字符串的问题

    ​ C++中的printf函数需要一个C风格字符串(即以'\0'结尾的字符数组)。而tch[i].name的类型是std::string,不是char[],直接使用%s输出会出现问题,因为std::string不能直接传递给%s,它不是C风格字符串。

    解决办法

    ​ 使用 .c_str()std::string 转换为C风格字符串:即在函数中字符串变量对应位置后添加 .c_str()

  • 结构体综合案例2:冒泡升序排信息

    设计一个包含姓名、年龄、性别的英雄结构体,将5名英雄按照年龄升序排列,并打印最终结果

    #include <iostream>
    #include <string>
    using namespace std;
    
    struct Hero {
    	string name;
    	int age;
    	string gender;
    };
    
    int main() {
    	struct Hero hero_arr[] = {
    		{"刘备",25,"男"},
    		{"张飞",23,"男"},
    		{"貂蝉",18,"女"},
    		{"关于",24,"男"},
    		{"赵云",22,"男"}
    	};
    	int hero_num = sizeof(hero_arr) / sizeof(hero_arr[0]);
    	for (int i = 0; i < hero_num-1; i++)
    	{
    		for (int j = i + 1; j < hero_num; j++)
    		{
    			if (hero_arr[i].age > hero_arr[j].age)
    			{
    				int temp = hero_arr[i].age;
    				hero_arr[i].age = hero_arr[j].age;
    				hero_arr[j].age = temp;
    			}
    		}
    	}
    	for (int i = 0; i < hero_num; i++)
    	{
    		cout << hero_arr[i].name << "\t" 
    			 << hero_arr[i].age  << "\t" 
    			 << hero_arr[i].gender << endl;
    	}
    
    	system("pause");
    	return 0;
    }
    
    /******************** 输出结果 **********************/
    刘备    18      男
    张飞    22      男
    貂蝉    23      女
    关于    24      男
    赵云    25      男
    

标签:arr,name,int,age,第八章,结构,struct
From: https://blog.csdn.net/LightingEngineer/article/details/143853859

相关文章

  • Scala-数据类型-概述(Scala 3.x 类型层次结构)
    ScalaScala-数据类型Scala1.`Any`—顶级类型2.`Matchable`—匹配类型3.`AnyVal`—值类型的父类4.`AnyRef`—引用类型的父类5.`Null`-引用类型的子类型Tips:为什么`null`不推荐使用?6.`Nothing`-底层类型(BottomType)整理不易,对您有帮助的话,还请......
  • 第八章习题
    习题8.4importnumpyasnpimportpandasaspdimportsympyasspsp.init_printing(use_latex=True)fromscipy.integrateimportodeintimportmatplotlib.pyplotaspltplt.rcParams['font.sans-serif']=['TimesNewRoman+SimSun+WFMSansSC......
  • MoD:轻量化、高效、强大的新型卷积结构 | ACCV'24
    来源:晓飞的算法工程笔记公众号,转载请注明出处论文:CNNMixture-of-Depths论文地址:https://arxiv.org/abs/2409.17016创新点提出新的卷积轻量化结构MoD,在卷积块(Conv-Blocks)内通过动态选择特征图中的关键通道进行集中处理,提高效率。CNNMoD保留了静态计算图,这提高了训......
  • 芒果Ultralytics最新YOLO11算法原理解析-包含最新详细-结构图,以及内附YOLO11各部分细
    YOLO11系列是YOLO家族中最先进的(SOTA)、最轻量级、最高效的模型,其表现优于其前辈。它由Ultralytics创建,该组织发布了YOLOv8,这是迄今为止最稳定、使用最广泛的YOLO变体。YOLO11将延续YOLO系列的传奇。在本文中,我们将探讨YOLO11文章目录YOLO11架构、YOLO11......
  • Java程序基础③Java运算符+逻辑控制+循环结构+输入输出
    目录1.Java运算符1.1算术运算符1.2增量运算符1.3关系运算符1.4逻辑运算符1.5位运算符1.6移位操作符1.7(三目)条件操作符1.8操作符优先级2.Java逻辑控制2.1顺序结构2.2分支结构2.2.1 if语句2.2.2switch语句3.循环结构3.1while循环3.2for循环3.......
  • 第八章 分布式系统的麻烦
    任何可能出错的东西都会出错故障与部分失效单机与分布式系统差异:单机软件运行较可预测,硬件正常时操作结果具确定性,遇硬件问题多导致整个系统故障。而分布式系统会面临部分失效情况,具有不确定性,其部分组件可能以不可预知方式损坏,这使分布式系统工作难度增加不同计算系统的故......
  • NOIP 数据结构
    线段树标记看成序列而不是数权值对权值、标记对标记、标记对权值P1471区间加,区间平均值,区间方差区间平均值等同于区间和将方差式子拆解:$\frac{1}{n}\sum(A_i-\overline{A})^2=\frac{1}{n}(\sum{A_i}^2-2\sumA_i\overline{A}+n{\overline{A}}^2)$把\(\overline......
  • 一楼防潮施工是防止地面湿气对建筑物结构和室内环境的影响,施工时需要选择合适的防潮材
    一楼防潮施工标准主要是为了防止地下水、地面湿气对一楼结构和室内环境造成影响。尤其是在潮湿地区或地下水位较高的地区,防潮工程尤为重要。以下是关于一楼防潮施工标准的详细介绍。1. 防潮设计要求(1)防潮设计的依据《建筑防水工程质量验收规范》GB50208《地下工程防水技术......
  • ES6 Set和Map数据结构用法详解
    文章目录前言Set数据结构创建Set添加元素删除元素删除所有数据获取set的大小(类似于数组的长度)检查是否包含某个元素四种遍历set的方法1.for...of循环2.forEach方法3.转换为数组后使用for循环4.keys(),values(),entries()集合运算方法Map数据结构创建Map添加元素(设......
  • 构建L2L结构IPSecVPN
    1.启动设备2.配置IP地址FW1配置:3.给防火墙划分区域[FW1]firewallzonetrust[FW1-zone-trust]addintg0/0/0[FW1-zone-trust]q[FW1]firewallzoneuntrust[FW1-zone-untrust]addintg0/0/14.配置路由条目[FW1]iproute-static0.0.0.00.0.0.0100.0.0.25.配置NA......