C语言程序设计教程(第8章结构体等构造数据类型).ppt
第8章 结构体等构造数据类型,本章需要掌握的知识点 结构体的类型说明 结构体变量的定义 结构体成员的引用 使用指针操作结构体数据,内容安排,8.1 结构体 8.2 结构体数组 8.3 结构体与指针 8.4 结构体与函数 *8.5 联合体 *8.6 枚举 8.7 类型定义,8.1 结构体,C语言提供结构体的目的 结构体类型说明 结构体变量的定义和初始化 结构体成员的引用,1. C语言提供结构体的目的,举例编写一个学生成绩打印程序,要求请求用户输入学生的基本情况,其中包括每位学生的学号、姓名和成绩,将每位同学的成绩添加5分,然后按照以下格式输出学生的成绩列表。 格式描述如下 学号 姓名 成绩 1 张三 99 2 王五 60 。,实例的数据分析,数据特点 描述学生基本信息的数据不是一个单独的数值、或者字符或者字符串。而是由学号、姓名和成绩等多个数据项一起构成的。,基于旧知识的数据对象描述,将学号、姓名和成绩分别定义为互相独立的简单变量。 缺点难以反映它们之间的内在联系。从而导致数据难于理解和处理。,结构体的引入,在C语言中,专门提供结构体机制 来描述和处理这些由多个数据项组 成的数据。,2. 结构体类型的声明,结构体通常是由多个数据项所组成的集合体。构成结构体的数据项称之为结构体成员,每一个成员具有各自的名字,可以分别属于不同的数据类型。,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . ;,成员类型可以是 基本型或结构体型,struct是关键字, 不能省略,合法标识符 可省无名结构体,例 struct student int code; 学号 char name20; float score; ;可换成 char code13;,3 结构体变量的定义和初始化,1、结构体变量的定义 2、结构体变量的初始化,1、结构体变量的定义,定义方法共3种 先声明结构体类型,再定义结构体变量 声明结构体类型的同时定义结构体变量 使用无名结构体类型直接定义 各种方法的适用情况,a、先声明结构体类型再定义变量例 struct student int code; char name20; float score; ; struct student stu1,stu2;,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . ; struct 结构体名 变量名列表;,b、声明类型的同时定义变量例 struct student int code; char name20; float score; stu1,stu2;,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . 变量名列表;,c、使用无名结构体类型直接定义例 struct int code; char name20; float score; stu1,stu2;,struct 类型标识符 成员名; 类型标识符 成员名; . 变量名列表;,各种方法的适用情况,结构体类型只需使用一次,可以使用c方法。 类型和变量的定义无法放置在一起的情况,必须使用a方法。 如果变量的定义和类型的声明能够放置在一起,a、b方法都合适。,结构体变量的初始化,例 struct student int code; char name20; float score; ; struct student stu12,“WangWu”,99;,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . ; struct 结构体名 结构体变量初始数据列表;,注意事项,类型和变量是不同的概念,不要混同。变量是一个具体的数据对象,可以参与运算。而类型不是。 成员的类型也可以是一个结构体类型。,例 struct date int month; int day; int year; ; struct student int code; char name20; struct date birthday; stu;,4 结构体变量及其成员的引用,结构体变量的引用 结构体变量成员的直接引用 结构体变量成员的逐级引用,1、结构体变量的引用,可以将一个结构体变量作为一个整体赋值给另一个同类型的结构体变量。 struct student s11,”wangli”,90, s2; s2 s1; 不能将一个结构体变量作为一个整体进行输入和输出。只能对结构体变量中的各个成员分别进行输入和输出。,2、结构体变量成员的引用,成员分量运算符,引用方式 结构体变量名.成员名,例 struct student int code; char name20; float score; s1,s2; s1.code10; s2.score85.5; s1.score s2.score 10; printf“coded, scored”, s1.code, s1.score,3、结构体变量成员的逐级引用,结构体嵌套时需逐级引用,例 struct date int month; int day; int year; ; struct student int code; struct date birthday; stu; stu.birthday.month12;,8.2 结构体数组,结构体数组的定义 结构体数组的初始化 结构体数组元素成员的引用,1、结构体数组的定义,类型说明符 数组名常量表达式; int a100; struct student stus20;,2、结构体数组的初始化,首先考虑数组的初始化。 然后考虑数组中每一个元素的初始化,也就是对每一个元素进行结构体的初始化。,struct student char number13; char name20; float Clanguage; ; struct student s3 “01“,“Wang Xiao 2“,78, “02“,“Zhang 3“, 99, “03“,“Li 4“, 91 ,3、结构体数组元素成员的引用,先数组元素再结构体成员 假如有定义struct student stus20; 那么stus0.code就是引用stus数组中第1个元素中的code成员。,补充 结构体基本应用举例,需求描述 数据结构描述 程序输入部分 程序处理部分 程序输出部分 程序的整体组合,1、需求描述,要求请求用户输入学生的基本情况,其中包括每位学生的学号、姓名和C语言课程的成绩,将每位同学的成绩添加5分,然后按照以下格式输出学生的成绩列表。 格式描述如下 学号 姓名 成绩 1 张三 99 2 王五 60 。,2、数据结构描述,define NUM 20 struct student int code; char name20; int score; ; struct student stusNUM;,3、程序输入部分,int i0; printf“Please code,name,score of student dn“,i1; scanf“d“fori0;iNUM;i ,4、程序处理部分,stusi.score stusi.score 5;,fori0;iNUM;i ,5、程序输出部分,printf“n-15s-20s-5sn”,“学号”,“姓名 “, “C语言成绩“; printf“ -15d “,stusi.code; printf“-20s“,stusi.name; printf“-5d“,stusi.score; printf“n“;,fori0;iNUM;i -代表左对齐,15代表显示数据用的域宽,6、程序的整体组合,include void main /* 数据结构描述部分 */ /* 程序输入部分 */ /* 程序处理部分 */ /* 程序输出部分 */ ,StuStruct.c,8.3 结构体与指针,结构体指针 指向结构体数组的指针,1、结构体指针,定义struct 结构体名 *结构体指针名;,如何通过指针访问结构体成员的值,方法一使用指针运算符*引用结构体成员形式,例 int n; int *p n10,struct student stu1; struct student *p *p.num101,()不能省略,如何通过指针访问结构体成员的值,方法二使用指向运算符引用结构体成员,struct student long int num; char name20; char sex; float score; stu_1,*p; p访问p指向的结构体变量的sex成员,2、指向结构体数组的指针,struct student int num; char name20; char sex; int age; stu310101,“Li Lin“,M,18, 10102,“Zhang Fun“,M,19, 10104,“Wang Min“,F,20; void main struct student *p; forpstu;pnum,p-name,p-sex,p-age; ,8.4 结构体与函数,用结构体变量作参数 用指向结构体变量的指针作参数,1、用结构体变量作函数参数,用结构体变量作为函数参数,可以从调用函 数向被调用函数完整地传递结构体变量中的 所有成员。,StruVarPara.c,1、用结构体变量作函数参数,fori0;iNUM;i ListStudentsstusi;实参是结构体变量的名字,void ListStudentsstruct student stu printf“-15d“,stu.code; printf“-20s“,stu.name; printf“-5d“,stu.score; printf“n“; ,StruVarPara.c,关键问题,结构体数据对象跟数组对象作为参数传递时有何不同,2、用指向结构体变量的指针作函数参数,被调用函数获取调用函数数据对象的地址,从 而可以通过指针访问调用函数中的结构体对象。,StruPtVarPara.c,2、用指向结构体变量的指针作函数参数,StruPtVarPara.c,fori0;iNUM;i ListStudents实参是结构体变量的地址,void ListStudentsstruct student *pStu printf“-15d“,pStu-code; printf“-20s“,pStu-name; printf“-5d“,pStu-score; printf“n“; ,关键问题,传递地址相比较于传递整个数据对象有何优点,开销小,速度快,类型定义的格式如下,例2 typedef struct student STUDENT; STUDENT z3;,8.7 类型定义,typedef 原类型名 新类型名;,例1 typedef int COUNTER; COUNTER i;使用类型定义可以提高程序的可读性,使用类型定义还可以简化变量的定义struct student int code; char name20; int score; ; struct student zhangsan;,typedef struct student int code; char name20; int score; STUDENT; STUDENT zhangsan;,struct student ;,typedef struct student STUDENT;,STUDENT zhangsan;,小结,如何声明一个新的结构体类型 定义结构体变量有哪些方法分别适用什么情况 如何初始化结构体变量 如何引用结构体变量中的成员变量 如何定义和使用结构体数组,小结续,如何定义结构体类型指针 如何通过结构体指针访问结构体成员 结构体实参采用什么方式向形参传递数据,课堂作业,请求用户输入学生的基本情况,其中包括每 位学生的学号、姓名和两门课的成绩。然后 用下面的格式输出学生的成绩列表。 格式描述如下 学号 姓名 C语言 数学 平均成绩 1 张三 60 70 65 。,要求,编写3个函数,main函数、函数、output函数。 不能在main函数中处理用户的输入和输出。 函数用来输入一个学生的信息。output函数用来输出一个学生的信息。,上机实验八,上机指导实验八 结构体等构造数据类型 实验内容课堂作业,实验步骤 (1)先自学并完成上机指导实验8 结构体P137-139内容,掌握结构体相关的调试技巧; (2)完成并提交课堂作业的程序,程序源文件的名称为班级学号后两位姓名实验八.cpp。,
如果觉得《c语言结构类型ppt C语言程序设计教程(第8章结构体等构造数据类型).ppt》对你有帮助,请点赞、收藏,并留下你的观点哦!