第8章-结构.ppt
- 文档编号:2580625
- 上传时间:2022-11-02
- 格式:PPT
- 页数:29
- 大小:308KB
第8章-结构.ppt
《第8章-结构.ppt》由会员分享,可在线阅读,更多相关《第8章-结构.ppt(29页珍藏版)》请在冰豆网上搜索。
高职学院高职学院计算机教研室计算机教研室程序设计基础程序设计基础第八章第八章结构高职学院高职学院计算机教研室计算机教研室程序设计基础程序设计基础2回顾q数组的概念q数组的声明,初始化,元素的引用,输入输出q字符数组和字符串,输入输出q一维数组和二维数组的区别和联系q通过定义子函数处理数组类型的数据q数组使用时一些重要提示q下标从0开始q二维数组可以看做是若干个一维数组,同时这些一维数组的每个元素又是一个一维数组q数组通常出现在循环结构中,一维-单循环,二维-二重循环(外层循环处理有多少个一维数组,内层处理每个一维数组对应的操作)高职学院高职学院计算机教研室计算机教研室程序设计基础程序设计基础3导入q客观世界中计算机需要处理的数据千变万化,而且常常是以一组或集合的形式出现,元素间存在着各种联系。
如果一组数据具有相同的性质,可以采用数组结构进行表示。
但实际应用中,也同样存在着大量由不同性质的数据构成的实体。
q如学生信息通常包括学生的姓名、年龄、家庭住址、联系电话等多个字段组成,磁盘上存储的一个文件则包含了文件的大小,名字,创建时间等信息。
对于描述学生信息和磁盘文件这样的一组信息,它们作为一个逻辑整体出现,由字符串、数值等多种类型数据构成,不适合使用数组表示(数组的构成元素必须是同一数据类型)。
q为此,语言提供了一种新的称为结构(有些教材也称之为结构体)的数据描述机制,用于处理类似上述的组合数据。
q结构与数组类似,都是由若干分量组成的。
数组是由相同类型的数组元素组成,但结构的分量可以是不同类型结构的分量可以是不同类型的。
高职学院高职学院计算机教研室计算机教研室程序设计基础程序设计基础4结构类型定义q结构是一组由多个相关的数据项组合而成的自定义复合数据类型,这些数据项称为结构的成员,每个成员都有自己的名字,可以是不同的数据类型,通过成员名实现对成员变量的访问。
结构类型为程序处理复杂的数据提供了便利的手段,支持用户根据需要应用需要构造新的数据类型。
q在程序中使用结构之前,首先要对结构的组成进行描述,称为结构类型的定义。
结构类型的定义需要描述它的成员情况,包括每个成员的类型和名字。
结构类型的定义用关键字struct引导,其基本形式如下q结构类型名称由用户自己定义,该名称和struct关键字共同构成了结构类型的描述;中包围的是组成该结构的成员描述序列,成员的数量可以是一个也可以是多个。
每个成员描述的形式与变量定义一样,需要给出成员变量的类型和名字,并用分号结束。
多个成员的描述信息是平行的,顺序可以调换,使用时依据成员名字确定对应关系。
struct结构类型名称成员列表;高职学院高职学院计算机教研室计算机教研室程序设计基础程序设计基础5结构类型定义q前面提到的学生信息就可以采用如下方式定义为一个结构类型:
q自定义的结构类型和系统提供的标准数据类型(如int、char、float、double)一样,都可以用来定义变量,只是对于结构类型需要先由用户完成类型的定义,才能定义对应的结构类型的变量。
q有了上面结构类型定义的描述,就可以定义对应的结构变量了,如:
struct_StuInfostu1,stu2;q就定义了两个_StuInfo结构类型的变量,“struct_StuInfo”为新定义的结构类型的关键字,对应变量的名字为stu1和stu2。
struct_StuInfocharname10;intage;charaddr50;charphone20;高职学院高职学院计算机教研室计算机教研室程序设计基础程序设计基础6结构类型定义q上述结构变量的声明也可在结构类型定义的同时完成,描述为:
qC语言中还支持通过typedef关键字,为用户自定义的结构类型取一个别名,以方便在程序中使用。
如上面的结构类型定义可改写为右图q程序中需要定义此结构类型的变量时,可以使用STUINFO代替原来的struct_StuInfo:
STUINFOstu1,stu2;等价于struct_StuInfostu1,stu2;q上述两条语句都声明了两个结构变量。
为了与其他变量类型关键字和对象名字区分,本书中自定义结构类型的名字均采用大写字母表示。
struct_StuInfocharname10;intage;charaddr50;charphone20;stu1,stu2;typedefstructcharname10;intage;charaddr50;charphone20;STUINFO;高职学院高职学院计算机教研室计算机教研室程序设计基础程序设计基础7结构类型定义qtypedef关键字不仅可以给自定义的结构类型取别名,也可以对已有的标准数据类型起别名,如:
typedefintINTEGER;typedeffloatREAL;q在具有上述typedef语句的程序中,下列语句就是等价的:
inti,j;等价于INTEGERi,j;floatpai;等价于REALpai;q结构类型的成员可以是任何类型的变量,也可以是结构类型。
对于前面磁盘文件信息就可以定义为:
typedefstructintmonth;intday;intyear;MYDATE;typedefstructcharfile_name50;intsize;MYDATEcreate_time;MYFILE;高职学院高职学院计算机教研室计算机教研室程序设计基础程序设计基础8结构变量的初始化q结构类型的定义一般书写在程序的开头,放在所有函数(包括main函数)的定义之前,以便本文件中所有的函数都能使用它来定义变量。
当然也可以在具体函数定义中定义结构类型,仅供本函数体内使用。
q结构类型的定义语句并不会产生内存分配,仅是对结构类型构成的说明,只有在定义相应的结构变量时才分配内存空间。
结构变量的定义可以出现在任何可以定义普通变量的地方,同样遵守变量先定义后使用的原则。
q与简单变量和数组一样,定义结构变量的同时也可以直接进行初始化。
对结构变量的初始化就是为结构变量的成员提供初值,形式上与数组的初始化相似。
下面结构变量的定义包含了相应的初始化描述:
STUINFOstu1=“Zhang”,21,“Beijing,china”,“01012345678”;q定义了STUINFO类型的变量stu1,初始化后的stu1变量在内存中可表示为:
q这种对结构变量各个成员整体赋值的形式只能出现在结构变量定义时的初始化操作,而不能用于对已经定义了的结构变量赋值。
stu1Zhang21Beijing,china01012345678nameageaddrphone高职学院高职学院计算机教研室计算机教研室程序设计基础程序设计基础9结构变量的使用q程序中对结构变量的操作主要有两种情况:
操作整个结构变量和对结构变量的成员变量的访问。
对于整个结构变量的操作通常仅限于同类型的结构变量之间进行整体赋值,从而得到结构变量值的新的副本,如下面语句:
STUINFOstu1=“Li”,20,“Shanghai,china”,“020156545678”,stu2;stu2=stu1;q程序中对结构变量的使用更多是对其成员变量的访问,包括对结构变量的输入输出、存取等操作,都是通过操作结构变量的成员实现。
C语言提供了圆点运算符(.)来实现对结构变量成员的访问,具体访问方式是在结构变量名的后面加上一个圆点,再加上成员变量的名称。
对于结构变量的成员变量,可以像同类型的普通变量一样进行使用,对其进行赋值和读取。
q如果初始化时把Zhang同学的年龄和电话号码录入错误,可以通过如下语句对其进行修正:
stu1.age=19;strcpy(stu1.phone,“01078675645”);高职学院高职学院计算机教研室计算机教研室程序设计基础程序设计基础10结构变量的使用q也可以使用printf语句对stu1变量的各个成员变量的值进行输出:
printf(“stu1.nameis:
%sn”,stu1.name);printf(“stu1.ageis:
%dn”,stu1.age);printf(“stu1.addris:
%sn”,stu1.addr);printf(“stu1.phoneis:
%sn”,stu1.phone);q需要注意格式控制符与成员变量类型的匹配,不能使用printf语句对结构变量进行整体输出,下面写法是错误的:
printf(“%s%d%s%sn”,stu1);q如果成员变量依然是结构类型,则需要再次通过圆点运算符去访问其成员,直到成员变量为普通数据类型。
例如:
MYFILEfp=“CProgramming”,10240,3,14,2014;printf(“Thefile%siscreatedat%d-%d-%dn”,fp.name,fp.create_time.year,fp.create_time.month,fp.create_time.day);q结构变量成员可以和其他普通变量具有相同的名字,但不会引起混淆。
因为,结构变量的成员变量不是单独存在的,也不能直接使用,必须和结构变量的名字一起使用才表示其为具体某个结构变量的成员变量,而不是普通变量。
高职学院高职学院计算机教研室计算机教研室程序设计基础程序设计基础11结构变量示例q例例8-1编写程序,计算两点间的直线距离并输出。
q分析:
数学中我们知道,一个点可以用两个坐标来表示(x,y),其中x表示水平坐标,y为垂直坐标。
若两点坐标分别为(x1,y1)和(x2,y2),则两点间的直线距离可以用如下公式表示:
x=x1-x2,y=y1y2;距离d=。
q为了更好的在程序中表示一个点,可将其定义为一个结构类型,由x坐标和y坐标两个成员表示,如:
typedefstructdoublex;doubley;#include#includetypedefstructdoublex;doubley;POINT;intmain()POINTpoint1,point2;doublex,y,result;printf(Enterpoint1coordinate:
);scanf(%lf%lf,&(point1.x),&(point1.y);printf(Enterpoint2coordinate:
);scanf(%lf%lf,&(point2.x),&(point2.y);x=point1.x-point2.x;y=point1.y-point2.y;result=sqrt(x*x+y*y);printf(Thedistanceabout(%.2f,%.2f)and(%.2f,%.2f)is:
%.2fn,point1.x,point1.y,point2.x,point2.y,result);return0;高职学院高职学院计算机教研室计算机教研室程序设计基础程序设计基础12结构变量的存储q结构变量在内存中采用连续的内存空间依次存储所有成员变量,正常情况下单个结构变量所占用的内存空间应该是其所有成员所占存储空间的总和。
如前面定义过的结构类型STUINFOq对应的结构变量成员中有3个char型数组,长度分别为10、50和20,1个整型变量,其成员正常占用的存储空间大小应为:
(10+50+20)*1+1*4=84q可通过sizeof()运算符来检查这种类型的结构变量实际占用存储空间的大小。
结果sizeof获得的结果(88)与理论上的计算结果84有4个字节上的差异,即实际存储时多用了4个字节。
具体原因参考教材,略typedefstructcharname10;intage;charaddr50;charphone20;STUINFO;高职学院高职学院计算机教研室计算机教研室程序设计基础程序设计基础13结构数组q结构里可以包含数组成员,同时也可以定义以结构作为元素的数组。
结构数组的定义与普通元素构成的数组相似,使用时需要遵守结构变量及其成员的运算
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 结构