210 likes | 337 Views
第九章 结构体. 学习目标. 掌握结构体类型的概念和声明结构体类型的方式 掌握结构体类型变量 掌握访问结构体类型成员 掌握使用结构体处理实际问题. 问题提出:. 学生是一个由学号、姓名、性别等 属性 组成的整体,如何用一种数据类型来描述学生呢?. 问题分析:. 学生的学号、姓名、性别等属性,都可以用基本数据类型来描述,如: 学号可以表示为 char acNum[15]; 姓名可以表示为 char acName[20]; 成绩可以表示为 float fScore;
E N D
学习目标 • 掌握结构体类型的概念和声明结构体类型的方式 • 掌握结构体类型变量 • 掌握访问结构体类型成员 • 掌握使用结构体处理实际问题
问题提出: • 学生是一个由学号、姓名、性别等属性组成的整体,如何用一种数据类型来描述学生呢?
问题分析: • 学生的学号、姓名、性别等属性,都可以用基本数据类型来描述,如: • 学号可以表示为char acNum[15]; • 姓名可以表示为char acName[20]; • 成绩可以表示为float fScore; • 如果这些变量彼此独立,是不能描述学生这个整体的。我们如何将不同类型但彼此都属于同一个整体的信息表示出来呢? • 结构体为我们提供了解决方案。
结构体类型的定义 • 定义的一般形式: struct <结构名> {成员列表 }; • 例如: struct tagStudent_t /*类型定义*/ { char acNum[15]; /*学号为字符串*/ char acName[20]; /*姓名为字符串*/ float fScore; /*成绩为浮点型*/ };
模仿练习: 学生的学号、姓名、性别、年龄、家庭住址、成绩定义为一个学生结构体。
结构体类型定义总结 • 定义结构体的目的:将一些相关类型定义在一个整体里。 • 结构体类型用一片连续的存储空间存放不同类型的成员,结构体成员和普通变量的存储方式、运算规则相同。 • 结构体成员允许为各种类型,包括结构体类型,但不允许嵌套定义(不允许在定义结构体时,该结构体的成员变量定义结构体)。
问题提出: 定义了学生类型的结构体,如何使用这种类型呢?
15B 20B 4B 4B 问题分析: • 结构体类型的使用方法和其他基本类型一样,也必须定义结构体变量,才能使用。 • 上例学生类型的变量存储空间表示如下: acNum acSex acName fScore
结构体变量说明和引用 • 常用的说明方式: • (1)定义后说明。 • 根据上面定义有: struct tagStudent_t stStu1,stStu2; • (2)在定义的后面说明。 • 在定义的分号前放上stStu1,stStu2 • (3)在定义后说明可以省略结构体名。
结构体变量说明和引用 • (4)利用重命名类型说明 如: • typedef struct tagStudent_t • { • … • }Student_t; • Student_t stStu1,stStu2; • 结构体变量的引用:结构体变量名.成员名 例:stStu1.sex='f';
结构体变量举例 定义学生类型结构体,并为一个学生的各项值赋值并输出 #include <stdio.h> struct tagStudent_t /*结构体类型定义*/ { char acNum[15]; char acName[20]; char acSex[4]; int iAge; }; void main( ) { struct tagStudent_t stStu1; /*定义结构体stu,说明s1为结构体变量*/ strcpy(stStu1. acNum,“20030311”); strcpy(stStu1. acName,"xiaomin"); strcpy(stStu1. acSex,”男”); stStu1.iAge=20; printf("Number=%s\nname=%s\n", stStu1.acNum, stStu1.acName); printf("sex=%s\nage=%d", stStu1.acSex, stStu1.iAge); }
模仿练习: • 定义学生结构体,成员包括学号、姓名、性别、年龄、两门功课的成绩,定义结构体变量并为该结构体变量赋值,然后输出所有信息。
结构体变量总结 • 说明一个变量类型为结构体类型,必须先有结构体的定义,才能有该类型的变量。在使用结构体类型名定义时,不能把struct漏掉。如 • tagStudent_t stStu1,stStu2;为非法定义。 • 结构体变量的引用:结构体变量名.成员名 • 结构体每个成员变量必须单独赋值和使用,不允许对结构体变量整体赋值,除了定义时(结构体变量的初始化),不允许将一个结构体变量赋值给另一个结构体变量。
案例1(项目)提出:在学生成绩管理系统中,学生信息如何定义?案例1(项目)提出:在学生成绩管理系统中,学生信息如何定义? • 在学生成绩管理系统中,我们知道,学生信息由很多项组成,比如:学号,姓名,各科成绩,总分和平均分,而其中各科成绩又有多个数据。 • 我们可以通过结构体类型来进行学号,姓名,各科成绩,总分和平均分的定义,然后再用数组类型定义各科成绩。
案例1(项目)实现 /*定义学生结构体*/ typedef struct tagStudent_t { char no[11]; /*学号*/ char name[20]; /*姓名*/ int score[MAXSUB];/*各科成绩*/ int sum; /*总分*/ float average; /*平均分*/ }Student;
讨论 • 结构体类型定义后还需要定义结构体变量吗? • 输入输出结构体变量成员怎么表示?
结论1—结构体类型与变量的区别 • 结构体类型必须先定义,才有变量定义。 • 定义了结构体类型不分配存储空间,作用类似int等基本数据类型。 • 定义结构体类型后必须定义该类型的变量,才分配存储空间,该存储空间的大小和结构由结构体类型确定。 • 不能对结构体类型进行引用,结构体变量可引用。 例如: Student_t.acNum是非法的,而stStuu1.acNum是合法的。
结论2—输入输出结构体变量成员怎么表示? • 结构体成员变量的引用方式为: 结构体变量名.成员变量名 • 输入输出的方式根据成员变量的类型进行格式控制,其方法与普通变量相同
学以致用 • 根据对学生基本信息的数据类型定义为结构体,扩展到对教师信息(姓名、年龄、工龄、工号、工资等信息)定义为结构体,对学校信息(地址、名称、占地面积、类型、教职工人数、在校学生总数、部门个数等)定义为结构体等等 。