使用结构体类型处理组合数据.ppt

上传人:牧羊曲112 文档编号:4940449 上传时间:2023-05-24 格式:PPT 页数:49 大小:378.50KB
返回 下载 相关 举报
使用结构体类型处理组合数据.ppt_第1页
第1页 / 共49页
使用结构体类型处理组合数据.ppt_第2页
第2页 / 共49页
使用结构体类型处理组合数据.ppt_第3页
第3页 / 共49页
使用结构体类型处理组合数据.ppt_第4页
第4页 / 共49页
使用结构体类型处理组合数据.ppt_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《使用结构体类型处理组合数据.ppt》由会员分享,可在线阅读,更多相关《使用结构体类型处理组合数据.ppt(49页珍藏版)》请在三一办公上搜索。

1、辽宁科技大学资源与土木工程学院测绘教研室,第9章用户自定义数据类型,C语言程序设计(第2版),主要内容,9.1 定义和使用结构体变量9.结构体数组9.结构体指针9.用结构体变量和结构体变量的指针 作 函数参数9.5 共用体类型9.6 枚举类型,9.1 定义和使用结构体变量,现实生活中存在这样的数据,学生信息,测量坐标表,自己建立结构体类型,C语言允许用户自己建立由不同类型数据组成的结合型的数据结构,称为“结构体”(structre)。结构体中包含的数据元素称为成员。,定义一个结构体类型的一般形式为:struct 结构体名类型说明符1 成员名1;.类型说明符n 成员名n;每个成员都是该结构体类型

2、的一个组成部分,每个成员可以是一个基本数据类型,也可以是一个构造类型。成员名的命名应符合标识符的书写规范。结构体名是由用户指定的,又称“结构体标记”,以区别于其他的结构体类型。,struct coordinate char pointname20;/*点名为字符串*/double x;/*x坐标为双精度*/double y;/*y坐标为双精度*/double H;/*高程H为双精度*/;/*注意最后有一个分号*/,struct student int num;/*学号为整型*/char name15;/*姓名为字符串*/char sex;/*性别为字符*/int age;/*年龄为整型*/ch

3、ar department 20;/*系别为字符串*/char speciality20;/*专业为字符串*/;/*注意最后有一个分号*/,说明:结构体变量的成员可以是另一个结构体变量。例如:struct date/*声明一个结构体类型struct date*/int moth;/*月*/int day;/*日*/int year;/*年*/;,struct student int num;char name15;char sex;struct date birthday;/*struct data类型*/char department 20;char speciality20;,自己建立结构

4、体类型,9.1.2 定义结构体类型变量,结构体类型一旦定义,它相当于一个模型,并没有定义变量,其中并无具体数据,系统对它也不分配实际的内存单元,相当于设计好了图纸,但并未建成具体的房屋。为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。可以采用 3种方法定义结构体类型变量。,9.1.2 定义结构体类型变量,struct student long no;char name15;char sex;int age;float score;struct student stu1,stu2;,struct coordinate char pointname20;dou

5、ble x;double y;double H;struct coordinate pt1,pt2;,1先定义结构体类型,再定义结构体变量。,9.1.2 定义结构体类型变量,2在定义结构体类型的同时定义结构体变量。,struct student long no;char name15;char sex;int age;float score;stu1,stu2;,struct coordinate char pointname20;double x;double y;double H;pt1,pt2;,9.1.2 定义结构体类型变量,3直接定义结构体类型的变量。,struct long no;

6、char name15;char sex;int age;float score;stu1,stu2;,struct char pointname20;double x;double y;double H;pt1,pt2;,这种形式指定了一个无名的结构体类型,它没有名字(不出现结构体名)。显然不能再以此结构体类型去定义其他变量。这种方式用得不多。,(1)结构体类型与结构体变量是不同的概念,不要混淆。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间。(2)结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同一对象。(3)对结构

7、体变量中的成员(即“域”),可以单独使用,它的作用相当于普通变量。,关于结构体类型的几点说明:,9.1.2 定义结构体类型变量,9.1.3 结构体的初始化和引用,在定义结构体变量时,可以对它初始化,即赋予初始值,然后可以引用这个变量。,【例9-1】把一个坐标点的信息放在一个结构体变量中,然后输出这个点的信息。,解题思路:先在程序中建立一个结构体类型,包括坐标点的各成员,然后用它定义结构体变量,同时赋以初值(一个点的信息),最后输出该结构体变量的各成员(即点的信息)。,#includevoid main()struct coordinate char pointname20;/*点名为字符串*/

8、double x;/*x坐标为双精度*/double y;/*y坐标为双精度*/double H;/*高程H为双精度*/pt1=氮肥厂,2503396.5128,709934.8769,532.743;printf(点名:%snx坐标:%.4fny坐标:%.4fn高程:%.3fn,pt1.pointname,pt1.x,pt1.y,pt1.H);,9.1.3 结构体的初始化和引用,引用结构体变量应遵守以下规则:(1)可以引用结构体变量中成员的值,引用方式为结构体变量名.成员名如在程序中可以对变量的成员赋值pt1.H=576.237;“.”是成员运算符,它在所有的运算符中优先级最高,因此可以把p

9、t1.H作为一个整体来看待。注意:不能通过结构体变量名来得到结构体变量中所有成员的值。printf(“%sn”,pt1);/*企图用结构体变量名输出所有成员的值*/只能对结构体变量中的各个成员分别进行输入和输出。,9.1.3 结构体的初始化和引用,引用结构体变量应遵守以下规则:(2)如果成员本身又属于一个结构体类型,则要用多个成员运算符,一级一级地找到最低一级的成员。只能对最低级的成员进行赋值或存取以及运算。如引用成员的方式为:student1.no(结构体变量student1的成员no)(结构体变量student1中的成员birthday中的成员month),9.1.3 结构体的初始化和引用

10、,引用结构体变量应遵守以下规则:(3)对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。如:pt1.H=pt1.H+1.5(赋值运算)(减法运算)(4)同类的结构体变量可以互相赋值,如:pt1=pt2;,9.1.3 结构体的初始化和引用,引用结构体变量应遵守以下规则:(5)可以引用结构体变量成员的地址,也可以引用结构体变量的地址。scanf(“%f”,结构体变量的地址主要用作函数参数,通过它来传递结构体变量的地址。,9.1.3 结构体的初始化和引用,【例9-2】输入两点的x坐标、y坐标和高程,输出两点间的距离和高差。,解题思路:,#include#include

11、void main()struct coordinatechar name20;double x;double y;double H;pt1,pt2;double S,h;scanf(%s%lf%lf%lf,pt1.name,【例9-3】如下图为按图根水准测量要求施测某闭合水准路线观测成果略图。A点为已知点高程,图中箭头表示水准测量的前进方向,试计算待定点B、C、D点的高程。,9.2 结构体数组,计算闭合差,判断闭合差是否超限,计算各测段观测高差的改正数,计算各测段的改正后的高差,计算各点的高程值,检查闭合差是否分配完,闭合水准路线成果计算,9.2 结构体数组,7,1.864,10,-2.56

12、9,4,-1.663,8,2.313,BM.A,BM.A,已知点,25.654,BM.A,B,C,D,29,-0.055,0.013,0.019,0.008,0.015,1.877,-2.550,-1.655,2.328,0,27.531,24.981,23.326,25.654,B,C,B,D,BM.A,0.055,#include#includestruct CD/*CD代表测段的意思*/char CDname10;/*测段名*/char CZname;/*测点名*/double CDZS;/*测段站数*/double CDh;/*测段高差*/double CDGZV;/*测段改正数*/d

13、ouble CDGZh;/*测段改正高差*/double H;/*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,;,void main()int i;double sumCDZS=0,sumCDh=0;/*sumCDZS为测站总数,sumCDh为高差之和*/double f;/*f为允许误差*/for(i=0;i4;i+)sumCDZS=sumCDZS+CDSi.CDZS;/*sumCDZS为测站总数*/

14、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(闭合差未超限!n);for(i=0;i4;i+)CDSi.CDGZV=CDSi.CDZS/sumCDZS*sumCDh*(-1);CDSi.CDGZh=CDSi.CDh+CDSi.CDGZV;printf(tt%c点高差改正数为%.3fm,改正后高差为%

15、.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点高程为:%.3fmn,CDSi.CZname,CDSi.H);elseprintf(tt闭合差超限!);printf(nt=n);,说明:(1)结构体数组可以在定义时初始化,但只能对全局的或静态存储的数组进行初始化。(2)结构体数组的引用类似于结构体变量的引用,只是用结构体数组元素来代替结构体变量。如第一个学生的个

16、人信息:stu0.nostu0.namestu0.sexstu0.agestu0.scorestu0.address同结构体变量一样,结构体数组元素不能整体的输入输出,只能以单个成员为对象进行输入输出。,9.2 结构体数组,9.3 结构体指针,所谓结构体指针就是指向结构体数据的指针,一个结构体变量的起始地址就是这个结构体变量的指针。如果把一个结构体变量的起始地址存放在一个指针变量中,那么,这个指针变量就指向该结构体变量。指针变量既可以指向结构体变量,也可以指向结构体数组中的元素。但是,指针变量的基类型必须与结构体变量的类型相同。,【例9-4】通过指向结构体变量的指针变量输出结构体变量中成员的信

17、息。,9.3 结构体指针,解题思路:(1)对结构体变量成员赋值;(2)通过指向结构体变量的指针访问结构体变量中 的成员。,#include#includevoid main()struct coordinatechar pointname20;double x;double y;double H;struct coordinate pt1;struct coordinate*p;p=,说明:(*p)表示p指向的结构体变量,(*p).x是p指向的结构体变量中的成员x。注意,*p两侧的括号不可省,因为成员运算符“.”优先于“*”运算符,*p.x就等价于*(p.x)了。,9.3 结构体指针,9.3

18、结构体指针,注意:为了使用方便和直观,C语言允许把(*p).x改用p-x来代替,它表示p所所指向的结构体变量中的x成员。“-”称为指向运算符。如果p指向一个结构体变量,以下3种形式等价:(1)结构体变量.成员名(2)(*p).成员名(3)p-成员名指向结构体变量的指针变量,也可以用来指向结构体数组元素。,8.3.1 数组元素的指针,【例9-5】有3个点坐标,放在结构体数组中,要求输出全部坐标信息。,解题思路:(1)声明结构体类型struct coordinate,并定义结构体数组,同时使之初始化;(2)定义一个指向struct coordinate类型数据的指针变量;(3)使p指向结构体数组的

19、首元素,输出它指向的元素中的有关信息;(4)利用循环使p指向结构体数组的下几个元素并输出它们的信息。,#includestruct coordinatechar pointname20;double x;double y;double H;struct coordinate pt3=氮肥厂,2503396.5128,709934.8769,532.743,扶绥中学,2505530.1986,710280.0416,543.112,渠黎中学,2503369.2088,712593.9624,512.223;void main()struct coordinate*p;printf(点名 x坐标

20、y坐标 Hn);for(p=pt;ppointname,p-x,p-y,p-H);,pt1,pt2,p是指向struct coordinate结构体类型数据的指针变量。在for语句中先使p的初值为pt,也就是数组pt第一个元素的起始地址,图中 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

21、后,p就指向下一个元素。例如:(+p)-H 先使p自然加1,然后得到p指向的元素中x成员值(即543.112)(p+)-H 先求得p-H的值(即532.743),然后再使p自加1,指向pt1(2)程序已定义了p是一个指向struct coordinate类型数据的指针变量,它用来指向一个struct coordinate类型的数据,不应用来指向pt数组中的某一成员。如果要将某一成员的地址赋给p,可以用强制类型转换,先将成员的地址转换成p的类型。例如p=(struct coordinate*)pt0.pointname;,9.3 结构体指针,9.4 用结构体变量和结构体变量的指针作函数参数,将一

22、个结构体变量的值传递给另一个函数,有3种方法:(1)用结构体变量的成员作参数。其用法和普通变量作参数一样,属于“值传递”方式。应当注意实参与形参的类型保持一致。(2)用结构体变量作实参。用结构体变量作实参时,采用的也是“值传递”的方式,将结构体变量所占的内存单元的内容全部顺序传递给形参,形参也必须是同类型的结构体变量。在函数调用期间形参也要占用内存单元。这种传递方式在空间和时间上开销较大,如果结构体规模很大时,开销是很可观的。此外由于采用值传递方式,如果在执行被调用函数期间改变了形参(也是结构体变量)的值,该值不能返回主调函数,这往往会造成使用上的不便。因此较少使用。,9.4 用结构体变量和结

23、构体变量的指针作函数参数,(3)用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传递给形参。,8.3.2 通过指针引用数组元素,【例9-6】有N个结构体变量BC,内含边长名,每条边长的3次观测值,要求输出平均边长最长的边长信息(包括边长名、3次观测值和平均边长)。,解题思路:(1)用input函数来输入数据和求平均边长;(2)用maxL函数来找平均边长最长的边长;(3)用print函数来输出边长最长的边长信息。,#include#define N 3/*观测3条边长*/struct length/*声明结构体类型*/char name20;/*边长名*/float L3;/

24、*每条边长观测3次的数据*/float aver;/*平均边长*/;void main()void input(struct length BC);/*函数声明*/struct length maxL(struct length BC);/*函数声明*/void print(struct length BC);/*函数声明*/struct length BCN,*p=BC;/*定义结构体数组和指针*/input(p);/*调用input函数*/print(maxL(p);/*调用print函数,以maxL函数的返回值作为实参*/,void input(struct length BC)int

25、i;printf(请输入各条边长的信息:边长名、三次观测值:n);for(i=0;iN;i+)scanf(%s%f%f%f,BCi.name,struct length maxL(struct length BC)int i,m=0;for(i=0;iBCm.aver)m=i;return BCm;void print(struct length BC)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 共用体类型,共用体(un

26、ion)是一种构造类型,它很像结构体类型,也是将不同类型的数据项组成一个整体,但共用体中所有的成员变量均占用同一段内存空间,即共用体变量所占的存储空间不是各成员所需存储空间字节数的总和,而是共用体成员中需要空间最大的那个成员所需的字节数。对于共用体变量,在某一时间点上,只能存储其某一成员的信息。,一、共用体的概念,9.5 共用体类型,定义一个共用体类型的语法形式为:union 共用体类型名;,9.5 共用体类型,例如:,union student charnumber10;charname10;charsex8;intage;,说明:共用体 student 的4个成员变量共用同一段内存空间,系

27、统根据成员变量的引用不同,决定哪个成员有效,并使用内存空间。,先定义共用体类型,再定义共用体变量。,例如:union student charnumber10;charname10;charsex8;intage;union student stu;,二、共用体变量的定义和引用,1.共用体变量的定义,9.5 共用体类型,2.共用体变量的定义,在定义共用体的同时定义变量。例如:,union student charnumber10;charname10;charsex8;intage;stu;,二、共用体变量的定义和引用,9.5 共用体类型,3.共用体变量的定义,在定义共用体的同时定义变量,可以

28、省略共用体标识符。例如:,union charnumber10;charname10;charsex8;intage;stu;,二、共用体变量的定义和引用,9.5 共用体类型,1枚举类型定义的一般形式为:enum 枚举名 枚举值表;在枚举值表中应列出所有可用值。这些值也被称为枚举元素。例如:enum weekday Sun,Mon,Tue,Wed,Thu,Fri,Sat;枚举名为weekday,枚举值共有7个。枚举类型中个每个元素对应一个数值,系统默认从0开始。如在weekday中,Sun值为0,Mon值为1,Tue值为,Wed值为,Thu值为,Fri值为,Sat值为6。一旦定义它们的值是不能改变的。,9.6 枚举类型,2枚举变量的说明同结构和共用体变量定义一样,枚举变量也可用不同的方式说明,即先定义后说明,同时定义说明或直接说明。例如:enum weekdaySun,Mon,Tue,Wed,Thu,Fri,Sat;enum weekday a,b;或者为:enum weekdaySun,Mon,Tue,Wed,Thu,Fri,Sat a,b;或者为:enum Sun,Mon,Tue,Wed,Thu,Fri,Sata,b;,9.6 枚举类型,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号