使用结构体类型处理组合数据课件

上传人:工**** 文档编号:567980285 上传时间:2024-07-22 格式:PPT 页数:49 大小:398.50KB
返回 下载 相关 举报
使用结构体类型处理组合数据课件_第1页
第1页 / 共49页
使用结构体类型处理组合数据课件_第2页
第2页 / 共49页
使用结构体类型处理组合数据课件_第3页
第3页 / 共49页
使用结构体类型处理组合数据课件_第4页
第4页 / 共49页
使用结构体类型处理组合数据课件_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《使用结构体类型处理组合数据课件》由会员分享,可在线阅读,更多相关《使用结构体类型处理组合数据课件(49页珍藏版)》请在金锄头文库上搜索。

1、辽宁科技大学资源与土木工程学院测绘教研室辽宁科技大学资源与土木工程学院测绘教研室第9章用户自定义数据类型C语言程序言程序设计(第(第2版)版)主要内容主要内容9. 1 9. 1 定义和使用结构体变量定义和使用结构体变量9.9.结构体数组结构体数组9.9.结构体指针结构体指针9.9.用结构体变量和结构体变量的指针用结构体变量和结构体变量的指针 作作 函数参数函数参数9.5 9.5 共用体类型共用体类型9.6 9.6 枚举类型枚举类型 9.1 定义和使用结构体变量定义和使用结构体变量 现实生活中存在这样的数据现实生活中存在这样的数据学号学号姓名姓名性别性别年龄年龄所在系所在系专业专业1001刘福刘

2、福男男18测量系测量系工程测量工程测量学生信息学生信息点号点号X坐标坐标Y坐标坐标H氮肥厂氮肥厂2503396.5128709934.8769532.743测测量量坐坐标标表表 9.1.1 自己建立结构体类型自己建立结构体类型 C语言允许用户自己建立由不同类型数据组成的结合语言允许用户自己建立由不同类型数据组成的结合型的数据结构,称为型的数据结构,称为“结构体结构体”(structre)。)。结构体结构体中包含的数据元素称为成员。中包含的数据元素称为成员。定义一个结构体类型的一般形式为:定义一个结构体类型的一般形式为:struct结构体名结构体名类型说明符类型说明符1成员名成员名1;.类型说明

3、符类型说明符n成员名成员名n;每个成员都是该结构体类型的一个组成部分,每个成员都是该结构体类型的一个组成部分,每个成每个成每个成每个成员可以是一个基本数据类型,也可以是一个构造类型。员可以是一个基本数据类型,也可以是一个构造类型。员可以是一个基本数据类型,也可以是一个构造类型。员可以是一个基本数据类型,也可以是一个构造类型。成员名的命名应符合标识符的书写规范。成员名的命名应符合标识符的书写规范。结构体名是由用户指定的,又称结构体名是由用户指定的,又称“结构体标记结构体标记”,以,以区别于其他的结构体类型。区别于其他的结构体类型。structcoordinatecharpointname20;/

4、*点名为字符串点名为字符串*/doublex;/*x坐标为双精度坐标为双精度*/doubley;/*y坐标为双精度坐标为双精度*/doubleH;/*高程高程H为双精度为双精度*/;/*/*注意最后有一个分号注意最后有一个分号注意最后有一个分号注意最后有一个分号* */ /structstudentintnum;/*学号为整型学号为整型*/charname15;/*姓名为字符串姓名为字符串*/charsex;/*性别为字符性别为字符*/intage;/*年龄为整型年龄为整型*/chardepartment 20;/*系别为字符串系别为字符串*/charspeciality20;/*专业为字符串

5、专业为字符串*/;/*/*注意最后有一个分号注意最后有一个分号注意最后有一个分号注意最后有一个分号* */ /说明:说明:结构体变量的成员可以是另一个结构体变量。例如:结构体变量的成员可以是另一个结构体变量。例如:structdate/*声明一个结构体类型声明一个结构体类型structdate*/intmoth;/*月月*/intday;/*日日*/intyear;/*年年*/;structstudentintnum;charname15;charsex;structdatebirthday;/*structdata类型类型*/chardepartment 20;charspeciality2

6、0; 9.1.1 自己建立结构体类型自己建立结构体类型 9.1.2 定义结构体类型变量定义结构体类型变量 结构体类型一旦定义,它相当于一个模型,并没有定义结构体类型一旦定义,它相当于一个模型,并没有定义变量,其中并无具体数据,系统对它也不分配实际的内变量,其中并无具体数据,系统对它也不分配实际的内存单元,相当于设计好了图纸,但并未建成具体的房屋。存单元,相当于设计好了图纸,但并未建成具体的房屋。为了能在程序中使用结构体类型的数据,应当定义结构为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。可以采用体类型的变量,并在其中存放具体的数据。可以采用3种方法定义结

7、构体类型变量。种方法定义结构体类型变量。 9.1.2 定义结构体类型变量定义结构体类型变量 structstudentlongno;charname15;charsex;intage;floatscore;structstudentstu1,stu2;结构体类型名结构体类型名结构体变量名结构体变量名structcoordinatecharpointname20;doublex;doubley;doubleH;structcoordinatept1,pt2;1 1先定义结构体类型,再定义结构体变量。先定义结构体类型,再定义结构体变量。先定义结构体类型,再定义结构体变量。先定义结构体类型,再定义结

8、构体变量。结构体类型名结构体类型名结构体变量名结构体变量名 9.1.2 定义结构体类型变量定义结构体类型变量2 2在定义结构体类型的同时定义结构体变量。在定义结构体类型的同时定义结构体变量。在定义结构体类型的同时定义结构体变量。在定义结构体类型的同时定义结构体变量。structstudentlongno;charname15;charsex;intage;floatscore;stu1,stu2;stu1,stu2;structcoordinatecharpointname20;doublex;doubley;doubleH;pt1,pt2;pt1,pt2; 9.1.2 定义结构体类型变量定义

9、结构体类型变量3 3直接定义结构体类型的变量。直接定义结构体类型的变量。直接定义结构体类型的变量。直接定义结构体类型的变量。structlongno;charname15;charsex;intage;floatscore;stu1,stu2; structcharpointname20;doublex;doubley;doubleH;pt1,pt2;这种形式指定了一个这种形式指定了一个无名的结构体类型无名的结构体类型无名的结构体类型无名的结构体类型,它没有名字,它没有名字(不出现结构体名)。(不出现结构体名)。显然不能再以此结构体类型去显然不能再以此结构体类型去定义其他变量。这种方式用得不多

10、。定义其他变量。这种方式用得不多。(1)结构体类型与结构体变量是不同的概念)结构体类型与结构体变量是不同的概念,不要不要混淆。只能对变量赋值、存取或运算,而不能对一混淆。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不个类型赋值、存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间。分配空间的,只对变量分配空间。(2)结构体类型中的成员名可以与程序中的变量名)结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同一对象。相同,但二者不代表同一对象。(3)对结构体变量中的成员(即)对结构体变量中的成员(即“域域”),可以单),可以单独使用,它的作用

11、相当于普通变量。独使用,它的作用相当于普通变量。关于结构体类型的几点说明:关于结构体类型的几点说明: 9.1.2 定义结构体类型变量定义结构体类型变量9.1.3 结构体的初始化和引用结构体的初始化和引用在定义结构体变量时,可以对它初始化,即赋予初在定义结构体变量时,可以对它初始化,即赋予初始值,然后可以引用这个变量。始值,然后可以引用这个变量。【例例9-1】把一个坐标点的信息放在一个结构体变量中,把一个坐标点的信息放在一个结构体变量中,然后输出这个点的信息。然后输出这个点的信息。解题思路:解题思路:先在程序中建立一个结构体类型,包括坐标点的各成员,先在程序中建立一个结构体类型,包括坐标点的各成

12、员,然后用它定义结构体变量,同时赋以初值(一个点的信然后用它定义结构体变量,同时赋以初值(一个点的信息),最后输出该结构体变量的各成员(即点的信息)。息),最后输出该结构体变量的各成员(即点的信息)。#includevoidmain()structcoordinatecharpointname20;/*点名为字符串点名为字符串*/doublex;/*x坐标为双精度坐标为双精度*/doubley;/*y坐标为双精度坐标为双精度*/doubleH;/*高程高程H为双精度为双精度*/pt1=氮肥厂氮肥厂,2503396.5128,709934.8769,532.743;printf(点名点名:%sn

13、x坐标坐标:%.4fny坐标坐标:%.4fn高程高程:%.3fn,pt1.pointname,pt1.x,pt1.y,pt1.H);9.1.3 结构体的初始化和引用结构体的初始化和引用引用结构体变量应遵守以下规则:引用结构体变量应遵守以下规则:(1)可以引用结构体变量中成员的值,引用方式为)可以引用结构体变量中成员的值,引用方式为结构体变量名结构体变量名结构体变量名结构体变量名. .成员名成员名成员名成员名如在程序中可以对变量的成员赋值如在程序中可以对变量的成员赋值pt1.H=576.237;“.”是成员运算符,它在所有的运算符中优先级最高,是成员运算符,它在所有的运算符中优先级最高,因此可以

14、把因此可以把pt1.H作为一个整体来看待。作为一个整体来看待。注意:不能通过结构体变量名来得到结构体变量中所注意:不能通过结构体变量名来得到结构体变量中所有成员的值。有成员的值。printf(“%sn”,pt1);/*企图用结构体变量名输出所有成员的值企图用结构体变量名输出所有成员的值*/只能对结构体变量中的各个成员分别进行输入和输出。只能对结构体变量中的各个成员分别进行输入和输出。9.1.3 结构体的初始化和引用结构体的初始化和引用引用结构体变量应遵守以下规则:引用结构体变量应遵守以下规则:(2)如果成员本身又属于一个结构体类型,则要用)如果成员本身又属于一个结构体类型,则要用多个成员运算符

15、,一级一级地找到最低一级的成员。多个成员运算符,一级一级地找到最低一级的成员。只能对最低级的成员进行赋值或存取以及运算。只能对最低级的成员进行赋值或存取以及运算。如引用成员的方式为:如引用成员的方式为:student1.no(结构体变量(结构体变量student1的成员的成员no)student1.birthday.month(结构体变量(结构体变量student1中的中的成员成员birthday中的成员中的成员month)9.1.3 结构体的初始化和引用结构体的初始化和引用引用结构体变量应遵守以下规则:引用结构体变量应遵守以下规则:(3)对结构体变量的成员可以像普通变量一样进行)对结构体变量

16、的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。各种运算(根据其类型决定可以进行的运算)。如:如:pt1.H=pt1.H+1.5(赋值运算)(赋值运算)HAB=ptB.H-ptA.H(减法运算)(减法运算)(4)同类的结构体变量可以互相赋值,如:)同类的结构体变量可以互相赋值,如:pt1=pt2;9.1.3 结构体的初始化和引用结构体的初始化和引用引用结构体变量应遵守以下规则:引用结构体变量应遵守以下规则:(5)可以引用结构体变量成员的地址,也可以引用结)可以引用结构体变量成员的地址,也可以引用结构体变量的地址。构体变量的地址。scanf(“%f”,&pt1.x);(输入

17、输入pt1.x的值的值)printf(“%o”,&pt1);(输出结构体变量输出结构体变量pt1的首地址的首地址)但不能用以下形式的语句整体读入结构体变量但不能用以下形式的语句整体读入结构体变量scanf(“%s,%f,%f,%f”,&pt1);结构体变量的地址主要用作函数参数,通过它来传递结构体变量的地址主要用作函数参数,通过它来传递结构体变量的地址。结构体变量的地址。9.1.3 结构体的初始化和引用结构体的初始化和引用【例例9-2】输入两点的输入两点的x坐标、坐标、y坐标和高程,输出两点间坐标和高程,输出两点间的距离和高差的距离和高差。解题思路:解题思路:解题思路:解题思路:#includ

18、e#includevoidmain()structcoordinatecharname20;doublex;doubley;doubleH;pt1,pt2;doubleS,h;scanf(%s%lf%lf%lf,pt1.name,&pt1.x,&pt1.y,&pt1.H);scanf(%s%lf%lf%lf,pt2.name,&pt2.x,&pt2.y,&pt2.H);S=sqrt(pt2.x-pt1.x)*(pt2.x-pt1.x)+(pt2.y-pt1.y)*(pt2.y-pt1.y);h=pt2.H-pt1.H;printf(“%s-%s之间的距离为之间的距离为:%.4fm,高差为高差为

19、:%.3fmn”,pt1.name,pt2.name,S,h);【例例9-3】如下图为按图根水准测量要求施测某闭合水准如下图为按图根水准测量要求施测某闭合水准路线观测成果略图。路线观测成果略图。A点为已知点高程,图中箭头表示水点为已知点高程,图中箭头表示水准测量的前进方向,试计算待定点准测量的前进方向,试计算待定点B、C、D点的高程。点的高程。9.2 结构体数组结构体数组1.1.计算闭合差计算闭合差2.2.判断闭合差是否超限判断闭合差是否超限3.3.计算各测段观测高差的改正数计算各测段观测高差的改正数5.5.计算各测段的改正后的高差计算各测段的改正后的高差6.6.计算各点的高程值计算各点的高程

20、值4.4.检查闭合差是否分配完检查闭合差是否分配完闭合水准路线成果计算闭合水准路线成果计算1 19.2 结构体数组结构体数组71.86410-2.5694-1.66382.313BM.ABM.A已知点已知点25.654BM.ABCD29-0.0550.0130.0190.0080.0151.877-2.550-1.6552.328027.53124.98123.32625.654BCBDBM.A0.055 #include#includestructCD/*CD代表测段的意思代表测段的意思*/charCDname10;/*测段名测段名*/charCZname;/*测点名测点名*/doubleC

21、DZS;/*测段站数测段站数*/doubleCDh;/*测段高差测段高差*/doubleCDGZV;/*测段改正数测段改正数*/doubleCDGZh;/*测段改正高差测段改正高差*/doubleH;/*H为测站高程为测站高程*/CDS4=AB,A,7,1.864,0.0,0.0,25.654,BC,B,10,-2.569,0.0,0.0,0.0,CD,C,4,-1.663,0.0,0.0,0.0,DA,D,8,2.313,0.0,0.0,0.0,; voidmain()inti;doublesumCDZS=0,sumCDh=0;/*sumCDZS为测站总数,为测站总数,sumCDh为高差之和

22、为高差之和*/doublef;/*f为允许误差为允许误差*/for(i=0;i4;i+)sumCDZS=sumCDZS+CDSi.CDZS;/*sumCDZS为测站总数为测站总数*/sumCDh=sumCDh+CDSi.CDh;/*sumCDh为高差之和为高差之和*/f=12*sqrt(sumCDZS)/1000;printf(nt=中间计算过程中间计算过程=nn);printf(tt测站总数为测站总数为%.f站站,测站高差之和为测站高差之和为%.3fmntt允许误差允许误差为为:%.3fm,sumCDZS,sumCDh,f); if(fabs(sumCDh)=f)printf(闭合差未超限闭

23、合差未超限!n);for(i=0;i4;i+)CDSi.CDGZV=CDSi.CDZS/sumCDZS*sumCDh*(-1);CDSi.CDGZh=CDSi.CDh+CDSi.CDGZV;printf(tt%c点高差改正数为点高差改正数为%.3fm,改正后高差为改正后高差为%.3fmn,CDSi.CZname,CDSi.CDGZV,CDSi.CDGZh);for(i=1;i4;i+)CDSi.H=CDSi-1.H+CDSi-1.CDGZh;/*计算各测站高程计算各测站高程*/printf(nt=计算结果计算结果=nn);for(i=0;i4;i+)printf(tttt%c点高程为点高程为:

24、%.3fmn,CDSi.CZname,CDSi.H);elseprintf(tt闭合差超限闭合差超限!);printf(nt=n);说明:说明:(1)结构体数组可以在定义时初始化,但只能对全局的或静结构体数组可以在定义时初始化,但只能对全局的或静态存储的数组进行初始化。态存储的数组进行初始化。(2)结构体数组的引用类似于结构体变量的引用,只是用结)结构体数组的引用类似于结构体变量的引用,只是用结构体数组元素来代替结构体变量。如第一个学生的个人信息:构体数组元素来代替结构体变量。如第一个学生的个人信息:stu0.nostu0.namestu0.sexstu0.agestu0.scorestu0.

25、address同结构体变量一样,结构体数组元素不能整体的输入输出,只同结构体变量一样,结构体数组元素不能整体的输入输出,只能以单个成员为对象进行输入输出。能以单个成员为对象进行输入输出。 9.2 结构体数组结构体数组9.3 结构体指针结构体指针所谓结构体指针就是指向结构体数据的指针,一个结所谓结构体指针就是指向结构体数据的指针,一个结构体变量的起始地址就是这个结构体变量的指针。如构体变量的起始地址就是这个结构体变量的指针。如果把一个结构体变量的起始地址存放在一个指针变量果把一个结构体变量的起始地址存放在一个指针变量中,那么,这个指针变量就指向该结构体变量。指针中,那么,这个指针变量就指向该结构

26、体变量。指针变量既可以指向结构体变量,也可以指向结构体数组变量既可以指向结构体变量,也可以指向结构体数组中的元素。但是,指针变量的基类型必须与结构体变中的元素。但是,指针变量的基类型必须与结构体变量的类型相同。量的类型相同。【例例9-4】通过指向结构体变量的指针变量输出结构体变通过指向结构体变量的指针变量输出结构体变量中成员的信息。量中成员的信息。9.3 结构体指针结构体指针解题思路:解题思路:(1)对结构体变量成员赋值;)对结构体变量成员赋值;(2)通过指向结构体变量的指针访问结构体变量中)通过指向结构体变量的指针访问结构体变量中的成员。的成员。#include#includevoidmai

27、n()structcoordinatecharpointname20;doublex;doubley;doubleH;structcoordinatept1;structcoordinate*p;p=&pt1;strcpy(pt1.pointname,氮肥厂氮肥厂);pt1.x=2503396.5128;pt1.y=709934.8769;pt1.H=532.743;printf(点名点名:%snx坐标坐标:%.4fny坐标坐标:%.4fn高程高程%.3fn,pt1.pointname,pt1.x,pt1.y,pt1.H);printf(n点名点名:%snx坐标坐标:%.4fny坐标坐标:%.

28、4fn高程高程%.3fn,(*p).pointname,(*p).x,(*p).y,(*p).H);说明:说明:(*p)(*p)表示表示表示表示p p指向的结构体变量,指向的结构体变量,指向的结构体变量,指向的结构体变量,(*p).x(*p).x是是是是p p指向的结构体指向的结构体指向的结构体指向的结构体变量中的成员变量中的成员变量中的成员变量中的成员x x。注意,。注意,。注意,。注意,* *p p两侧的括号不可省,因为成两侧的括号不可省,因为成两侧的括号不可省,因为成两侧的括号不可省,因为成员运算符员运算符员运算符员运算符“ “.” .”优先于优先于优先于优先于“*”“*”运算符,运算符

29、,运算符,运算符,* *p.xp.x就等价于就等价于就等价于就等价于* *(p.xp.x)了。了。了。了。9.3 结构体指针结构体指针9.3 结构体指针结构体指针注意:注意:为了使用方便和直观,为了使用方便和直观,C语言允许把语言允许把(*p).x改用改用p-x来代替,它表示来代替,它表示p所所指向的结构体变量中的所所指向的结构体变量中的x成员。成员。“-”称为指向运算符。称为指向运算符。如果如果p指向一个结构体变量,以下指向一个结构体变量,以下3种形式等价:种形式等价:(1)结构体变量)结构体变量.成员名成员名(2)(*p).成员名成员名(3)p-成员名成员名指向结构体变量的指针变量,也可以

30、用来指向结构指向结构体变量的指针变量,也可以用来指向结构体数组元素。体数组元素。8.3.1 数组元素的指针数组元素的指针【例例9-5】有有3个点坐标,放在结构体数组中,要求输出全个点坐标,放在结构体数组中,要求输出全部坐标信息。部坐标信息。解题思路:解题思路:(1)声明结构体类型)声明结构体类型structcoordinate,并定义结构体数组,同,并定义结构体数组,同时使之初始化;时使之初始化;(2)定义一个指向)定义一个指向structcoordinate类型数据的指针变量;类型数据的指针变量;(3)使)使p指向结构体数组的首元素,输出它指向的元素中的有关指向结构体数组的首元素,输出它指向

31、的元素中的有关信息;信息;(4)利用循环使)利用循环使p指向结构体数组的下几个元素并输出它们的信指向结构体数组的下几个元素并输出它们的信息。息。#includestructcoordinatecharpointname20;doublex;doubley;doubleH;structcoordinatept3=氮肥厂氮肥厂,2503396.5128,709934.8769,532.743,扶绥中学扶绥中学,2505530.1986,710280.0416,543.112,渠黎中学渠黎中学,2503369.2088,712593.9624,512.223;voidmain()structcoor

32、dinate*p;printf(点名点名x坐标坐标y坐标坐标Hn);for(p=pt;ppointname,p-x,p-y,p-H);pt1pt2512.223712593.96242503369.2088渠黎中学渠黎中学543.112710280.04162505530.1986扶绥中学扶绥中学532.743709934.87692503396.5128氮肥厂氮肥厂pt0pppp是指向是指向structcoordinate结结构体类型数据的指针变量。构体类型数据的指针变量。在在for语句中先使语句中先使p的初值为的初值为pt,也就是数组,也就是数组pt第一个元第一个元素的起始地址,图中素的起

33、始地址,图中p的指的指向。在第一个循环中输出向。在第一个循环中输出pt0的各个成员值,然后的各个成员值,然后p+,使使p自加自加1。P加加1意味着意味着p所所增加的值为结构体数组增加的值为结构体数组pt的的一个元素所占的字节数(在一个元素所占的字节数(在VC+)环境下)环境下,本例一个,本例一个元素所占的字节数为元素所占的字节数为20+8+8+8=44字节)。执行字节)。执行p+后,后,p的值等于的值等于pt+1,p指向指向pt1,见图,见图p的指向。的指向。9.3 结构体指针结构体指针注意:注意:(1)如果)如果p的初值为的初值为pt,即指向,即指向pt的第一个元素,的第一个元素,p加加1后

34、,后,p就指向下一个元素。例如:就指向下一个元素。例如:(+p)-H先使先使p自然加自然加1,然后得到,然后得到p指向的元素中指向的元素中x成员值成员值(即(即543.112)(p+)-H先求得先求得p-H的值(即的值(即532.743),然后再使),然后再使p自加自加1,指向,指向pt1(2)程序已定义了)程序已定义了p是一个指向是一个指向structcoordinate类型数据的类型数据的指针变量,它用来指向一个指针变量,它用来指向一个structcoordinate类型的数据,不类型的数据,不应用来指向应用来指向pt数组中的某一成员。数组中的某一成员。如果要将某一成员的地址赋给如果要将某

35、一成员的地址赋给p,可以用强制类型转换,先将,可以用强制类型转换,先将成员的地址转换成成员的地址转换成p的类型。例如的类型。例如p=(structcoordinate*)pt0.pointname;9.3 结构体指针结构体指针9.4 用结构体变量和结构体变量的指针作函数参数用结构体变量和结构体变量的指针作函数参数将一个结构体变量的值传递给另一个函数,有将一个结构体变量的值传递给另一个函数,有3种方法:种方法:(1)用结构体变量的成员作参数。)用结构体变量的成员作参数。其用法和普通变量作参数其用法和普通变量作参数一样,属于一样,属于“值传递值传递”方式。应当注意实参与形参的类型保持方式。应当注意

36、实参与形参的类型保持一致。一致。(2)用结构体变量作实参。)用结构体变量作实参。用结构体变量作实参时,采用的用结构体变量作实参时,采用的也是也是“值传递值传递”的方式,将结构体变量所占的内存单元的内容的方式,将结构体变量所占的内存单元的内容全部顺序传递给形参,全部顺序传递给形参,形参也必须是同类型的结构体变量形参也必须是同类型的结构体变量形参也必须是同类型的结构体变量形参也必须是同类型的结构体变量。在。在函数调用期间形参也要占用内存单元。这种传递方式在空间和函数调用期间形参也要占用内存单元。这种传递方式在空间和时间上开销较大,如果结构体规模很大时,开销是很可观的。时间上开销较大,如果结构体规模

37、很大时,开销是很可观的。此外由于采用值传递方式,如果在执行被调用函数期间改变了此外由于采用值传递方式,如果在执行被调用函数期间改变了形参(也是结构体变量)的值,该值不能返回主调函数,这往形参(也是结构体变量)的值,该值不能返回主调函数,这往往会造成使用上的不便。因此较少使用。往会造成使用上的不便。因此较少使用。9.4 用结构体变量和结构体变量的指针作函数参数用结构体变量和结构体变量的指针作函数参数(3)用指向结构体变量(或数组)的指针作实参,)用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传递给形参。将结构体变量(或数组)的地址传递给形参。 8.3.2 通过指针引用数组元

38、素通过指针引用数组元素【例例9-6】有有N个结构体变量个结构体变量BC,内含边长名,每条边长,内含边长名,每条边长的的3次观测值,要求输出平均边长最长的边长信息(包括次观测值,要求输出平均边长最长的边长信息(包括边长名、边长名、3次观测值和平均边长)。次观测值和平均边长)。解题思路:解题思路:(1)用)用input函数来输入数据和求平均边长;函数来输入数据和求平均边长;(2)用)用maxL函数来找平均边长最长的边长;函数来找平均边长最长的边长;(3)用)用print函数来输出边长最长的边长信息。函数来输出边长最长的边长信息。#include#defineN3/*观测观测3条边长条边长*/str

39、uctlength/*声明结构体类型声明结构体类型*/charname20;/*边长名边长名*/floatL3;/*每条边长观测每条边长观测3次的数据次的数据*/floataver;/*平均边长平均边长*/;voidmain()voidinput(structlengthBC);/*函数声明函数声明*/structlengthmaxL(structlengthBC);/*函数声明函数声明*/voidprint(structlengthBC);/*函数声明函数声明*/structlengthBCN,*p=BC;/*定义结构体数组和指针定义结构体数组和指针*/input(p);/*调用调用inpu

40、t函数函数*/print(maxL(p);/*调用调用print函数函数,以以maxL函数的返回值作为函数的返回值作为实参实参*/voidinput(structlengthBC)inti;printf(请输入各条边长的信息:边长名、三次观测请输入各条边长的信息:边长名、三次观测值:值:n);for(i=0;iN;i+)scanf(%s%f%f%f,BCi.name,&BCi.L0,&BCi.L1,&BCi.L2);BCi.aver=(BCi.L0+BCi.L1+BCi.L2)/3.0;structlengthmaxL(structlengthBC)inti,m=0;for(i=0;iBCm.

41、aver)m=i;returnBCm;voidprint(structlengthBC)printf(n边长最长的是:边长最长的是:n);printf(边长名边长名:%sn三次观测值三次观测值:%10.5f%10.5f%10.5fn平均平均边长:边长:%10.5fn,BC.name,BC.L0,BC.L1,BC.L2,BC.aver); 9.5 共用体类型共用体类型共用体(共用体(unionunion)是一种构造类型)是一种构造类型, ,它很像结构它很像结构体类型,也是将不同类型的数据项组成一个整体类型,也是将不同类型的数据项组成一个整体,但共用体中所有的成员变量均占用同一段体,但共用体中所有

42、的成员变量均占用同一段内存空间,即共用体变量所占的存储空间不是内存空间,即共用体变量所占的存储空间不是各成员所需存储空间字节数的总和,而是共用各成员所需存储空间字节数的总和,而是共用体成员中需要空间最大的那个成员所需的字节体成员中需要空间最大的那个成员所需的字节数。对于共用体变量,在某一时间点上,只能数。对于共用体变量,在某一时间点上,只能存储其某一成员的信息。存储其某一成员的信息。一、共用体的概念一、共用体的概念一、共用体的概念一、共用体的概念 9.5 共用体类型共用体类型定义一个共用体类型的语法形式为:定义一个共用体类型的语法形式为: unionunion共用体类型名共用体类型名共用体类型

43、名共用体类型名 ;1;2;n; 9.5 共用体类型共用体类型例如:例如:unionstudentcharnumber10;charname10;charsex8;intage;说明:说明:共用体共用体student的的4个成员变量共用同一段内存空个成员变量共用同一段内存空间,系统根据成员变量的引用不同,决定哪个成间,系统根据成员变量的引用不同,决定哪个成员有效,并使用内存空间。员有效,并使用内存空间。先定义共用体类型,再定义共用体变量先定义共用体类型,再定义共用体变量。例如:例如:unionstudentcharnumber10;charname10;charsex8;intage;union

44、studentstu;二、共用体变量的定义和引用二、共用体变量的定义和引用1.1.1.1.共用体变量的定义共用体变量的定义共用体变量的定义共用体变量的定义 9.5 共用体类型共用体类型2.2.2.2.共用体变量的定义共用体变量的定义共用体变量的定义共用体变量的定义 在定义共用体的同时定义变量。在定义共用体的同时定义变量。例如:例如:unionstudentcharnumber10;charname10;charsex8;intage;stu;二、共用体变量的定义和引用二、共用体变量的定义和引用 9.5 共用体类型共用体类型3.3.3.3.共用体变量的定义共用体变量的定义共用体变量的定义共用体变

45、量的定义 在定义共用体的同时定义变量,可以省略共用体标在定义共用体的同时定义变量,可以省略共用体标识符。识符。例如:例如:unioncharnumber10;charname10;charsex8;intage;stu;二、共用体变量的定义和引用二、共用体变量的定义和引用 9.5 共用体类型共用体类型1枚举类型定义的一般形式为:枚举类型定义的一般形式为:enum枚举名枚举名枚举值表枚举值表;在枚举值表中应列出所有可用值。这些值也被称为枚举在枚举值表中应列出所有可用值。这些值也被称为枚举元素。元素。例如:例如:enumweekdaySun,Mon,Tue,Wed,Thu,Fri,Sat;枚举名为

46、枚举名为weekday,枚举值共有,枚举值共有7个。枚举类型中个每个个。枚举类型中个每个元素对应一个数值,系统默认从元素对应一个数值,系统默认从0开始。如在开始。如在weekday中,中,Sun值为值为0,Mon值为值为1,Tue值为,值为,Wed值为,值为,Thu值为,值为,Fri值为,值为,Sat值为值为6。一旦定义它们的值。一旦定义它们的值是不能改变的。是不能改变的。 9.6 枚举类型枚举类型2枚举变量的说明枚举变量的说明同结构和共用体变量定义一样,枚举变量也可用不同结构和共用体变量定义一样,枚举变量也可用不同的方式说明,即先定义后说明,同时定义说明或同的方式说明,即先定义后说明,同时定义说明或直接说明。直接说明。例如:例如:enumweekdaySun,Mon,Tue,Wed,Thu,Fri,Sat;enumweekdaya,b;或者为:或者为:enumweekdaySun,Mon,Tue,Wed,Thu,Fri,Sata,b;或者为:或者为:enumSun,Mon,Tue,Wed,Thu,Fri,Sata,b; 9.6 枚举类型枚举类型

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号