资源描述
,信息科学与工程学院,第,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 stu1=2,“,WangWu,”,99;,struct,结构体名,类型标识符 成员名;,类型标识符 成员名;,.,;,struct,结构体名,结构体变量,=初始数据列表;,注意事项,类型和变量是不同的概念,不要混同。变量是一个具体的数据对象,可以参与运算。而类型不是。,成员的类型也可以是一个结构体类型。,code,name,birthday,month,day,year,例,struct date,int month;,int day;,int year;,;,struct student,int code;,char name20;,struct date birthday;,stu;,4,结构体变量及其成员的引用,结构体变量的引用,结构体变量成员的直接引用,结构体变量成员的逐级引用,1,、结构体变量的引用,可以将一个结构体变量作为一个整体赋值给另一个同类型的结构体变量。,struct student s1=1,”wangli”,90,s2;,s2=s1;,不能将一个结构体变量作为一个整体进行输入和输出。,只能对结构体变量中的各个成员分别进行输入和输出。,printf(%d,%s,%fn,s1);,2,、结构体变量成员的引用,成员,(,分量,),运算符,引用方式:,结构体变量名,.,成员名,例,struct student,int code;,char name20;,float score;,s1,s2;,s1.code,=10;,s2.score,=85.5;,s1.score,=,s2.score,10;,printf(“code=%d,score=%d”,s1.code,s1.score,),3,、结构体变量成员的逐级引用,结构体嵌套时需,逐级引用,例,struct date,int month;,int day;,int year;,struct student,int code;,struct date birthday;,stu;,stu.birthday.month=12;,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 i=0;,printf(Please input code,name,score of,student%d:n,i+1);,scanf(%d,scanf(%s,stusi.name);,scanf(%d,for(i=0;iNUM;i+),4,、程序处理部分,stusi.score=stusi.score+5;,for(i=0;iNUM;i+),5,、程序输出部分,printf(“n%-15s%-20s%-5sn”,“,学号”,“,姓名,C,语言成绩,);,printf(“%-15d ,stusi.code);,printf(%-20s,stusi.name);,printf(%-5d,stusi.score);,printf(n);,for(i=0;i,引用结构体成员,struct,student,long int num;,char name20;,char sex;,float score;,stu_1,*p;,p=,p-sex=M;,p-score=89.5;,访问,p,指向的结构体变量的,sex,成员,2,、指向结构体数组的指针,struct,student,int num;,char name20;,char sex;,int age;,stu3=10101,Li Lin,M,18,10102,Zhang Fun,M,19,10104,Wang Min,F,20;,void main(),struct student*p;,for(p=stu;pnum,p-name,p-sex,p-age);,num,name,sex,age,stu0,p,stu1,stu2,p+1,8.4,结构体与函数,用结构体变量作参数,用指向结构体变量的指针作参数,1,、用结构体变量作函数参数,用结构体变量作为函数参数,可以从调用函,数向被调用函数完整地传递结构体变量中的,所有成员。,StruVarPara.c,1,、用结构体变量作函数参数,for(i=0;iNUM;i+),ListStudents(,stusi,);/,实参是结构体变量的名字,void ListStudents(,struct student stu,),printf(%-15d,stu.code,);,printf(%-20s,stu.name,);,printf(%-5d,stu.score,);,printf(n);,StruVarPara.c,关键问题,结构体数据对象跟数组对象作为参数传递时有何不同?,2,、用指向结构体变量的指针作函数参数,被调用函数获取调用函数数据对象的地址,从,而可以通过指针访问调用函数中的结构体对象。,StruPtVarPara.c,2,、用指向结构体变量的指针作函数参数,StruPtVarPara.c,for(i=0;icode,);,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,函数、,input,函数、,output,函数。,不能在,main,函数中处理用户的输入和输出。,input,函数用来输入,一个学生,的信息。,output,函数用来输出,一个学生,的信息。,上机实验八,上机指导,实验八 结构体等构造数据类型,实验内容:课堂作业,实验步骤:,(,1,)先自学并完成上机指导实验,8,结构体,P137-139,内容,掌握结构体相关的调试技巧;,(,2,)完成并提交课堂作业的程序,程序源文件的名称为:班级,+,学号后两位,+,姓名,+,实验八,.cpp,。,
展开阅读全文