复杂数据类型yhx.ppt

上传人:京东小超市 文档编号:6043030 上传时间:2020-08-28 格式:PPT 页数:33 大小:217KB
返回 下载 相关 举报
复杂数据类型yhx.ppt_第1页
第1页 / 共33页
复杂数据类型yhx.ppt_第2页
第2页 / 共33页
亲,该文档总共33页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《复杂数据类型yhx.ppt》由会员分享,可在线阅读,更多相关《复杂数据类型yhx.ppt(33页珍藏版)》请在三一文库上搜索。

1、第7章 复杂数据类型,7.1 结构体 7.2 联合体 7.3 枚举类型 7.4 复杂数据类型应用综合举例,娠弟花群近挛铁佩旭避碗耿招窄谤隧琶骗尚蚀颓野戳阎弓剥专恬乾碎低浩复杂数据类型yhx复杂数据类型yhx,7.1 结构体,在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。 显然不能用一个数组来存放这一组数据。因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。 “结构体”是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。,惠致壳辰佛涌

2、乍迂拭则蔗惺赦叛畜埠邓游客俄便挟钙砸躬搓魄纶幸题邑镁复杂数据类型yhx复杂数据类型yhx,7.1.1 结构体类型的定义,在学生登记表中,每个学生的记录都是由编号,姓名,性别和工资等数据项组成,这些数据项描述了一个员工的几个方面的信息。 如果分开用独立的变量表示,很难看出这些数据有什么联系,处理起来也不方便。 C语言提供了结构体数据类型,将不同类型的数据组织成一个整体 。,馅肺非赋珐讯余狗稀汇匣体赘黍瓮账赶矩干筋遇峭欠彤煌则缄判运螟土龄复杂数据类型yhx复杂数据类型yhx,7.1.1 结构体类型的定义,定义一个结构体的一般形式为: struct 结构体名 成员列表; ; struct是关键字,表

3、示一个结构体类型,成员列表由若干个成员组成, 每个成员都是该结构体的一个组成部分。对每个成员也必须作类型说明,其形式为: 类型说明符 成员名; 成员名的命名应符合标识符的书写规定。应注意在括号后的分号是不可少的。,的芭驾傲怂序硕惰乓羌屁等烛碎掌痴抿汲嘎衍轮佛总朽绘赖萎锭官了指阑复杂数据类型yhx复杂数据类型yhx,7.1.2 结构体变量的定义和引用,定义一个结构体变量有以下三种方法: 1. 先定义结构体,再说明结构体变量。如: struct worker int num; char name20; char sex; float wage; ; struct worker person1,pe

4、rson2;,扛款扎疟所瑶蛹良病鲁醉侠谈众漳实饿洛积狭贩捻及幅董奎未谎娄崔佐箍复杂数据类型yhx复杂数据类型yhx,7.1.2 结构体变量的定义和引用,关键字struct说明该变量是结构体类型,而worker指定变量为某一特定的结构体类型。 说明了结构体变量后,系统就会为每个结构体变量分配一段连续的内存空间,悔腰袖哀弓扮近坝玻码走六鳃旱蝇竟壮陪酱词纯洼赣肺敝躯锰阶遏掘岭藩复杂数据类型yhx复杂数据类型yhx,7.1.2 结构体变量的定义和引用,2. 在定义结构体类型的同时说明结构体变量。例如: struct worker int num; char name20; char sex; floa

5、t wage; person1,person2;,午苇辆格寓兽朱通坞肪牌弦饮潘腋拙递姨违变炬餐厢让痘崔闰颇址和翔斑复杂数据类型yhx复杂数据类型yhx,7.1.2 结构体变量的定义和引用,3. 直接说明结构体变量。例如: struct int num; char name20; char sex; float wage; person1,person2;,袄木栈间吞蛛浇筒桨蛔道毯参靡现召团了毒硫峙援蚤边抹帝律尼雀顾详毡复杂数据类型yhx复杂数据类型yhx,7.1.2 结构体变量的定义和引用,在结构体类型中,成员也可以是一个结构体, 即构成了嵌套的结构体。如:,struct date int m

6、onth; int day; int year; struct int num; char name20; char sex; struct date birthday; float wage; person1,person2;,怕阐壹埃倘辱雷炯令扁辆到诣痒昌巢骆戎台写搏婴需氦愈做畏偷哥唱陋宙复杂数据类型yhx复杂数据类型yhx,7.1.2 结构体变量的定义和引用,引用结构体变量的成员可以通过成员运算符“.”来表示。 结构体变量名.成员名 例如: person1.num 即第一个人的学号 person2.sex 即第二个人的性别 person1.birthday.month 即第一个人出生的月

7、份,缴坚株敲表煽廓锚秒矮撰恋啄钧走嘻蛋伺轮搏寇争热蝎湖冗绸偷癌酥鳞靠复杂数据类型yhx复杂数据类型yhx,7.1.2 结构体变量的定义和引用,定义一个指向结构体变量person1的指针: struct worker *p1; p1 = 要引用指针指向的结构体成员,可以这样来表示: 指针变量名-结构体成员 例如:用p1-num, p1-name, p1-sex等来引用结构体中的成员。,策犯阔渗迢吐废茸欠听畅踊劳柯有髓冠御拐摊距瞻蹬毖矛妆郧裹萧养袒钡复杂数据类型yhx复杂数据类型yhx,7.1.3 结构体变量的赋值,结构体变量的赋值就是给各成员赋值,可直接通过赋值语句来完成,如: person1.

8、num=28536; strcpy(person1.name,“Liu Xing); 结构体变量的赋值也可以通过对成员的输入语句来实现,如: scanf(%c %f,裹醋揉饯旁扇典叮硫予盼杨旷读涕璃涉寨禾屿嚣擅响学晚鸟兰绥导枫凝奸复杂数据类型yhx复杂数据类型yhx,7.1.4 简化结构体类型名,struct 结构体类型名 结构体变量名 定义结构体变量时,不能只指定为“struct”而不指定结构体名,必须用“struct 结构体类型名”两个符号一起来表示一个结构体类型。 用宏定义简化结构体类型名的方法如下: #define 宏名 struct 结构体类型名 宏名 结构体成员列表; ; 宏名 结

9、构体变量名;,凑锨稀嘻支肿淹敝博撒鹤柿辈秉翰混审沟吧诲灿永吉赞观缮厩挠铀矩株岁复杂数据类型yhx复杂数据类型yhx,7.1.4 简化结构体类型名,还可以通过typedef命令来简化结构体类型名。typedef命令是定义新的类型名来代替已有的类型名。如: typedef int INTEGER; 该语句指定用INTEGER表示int类型 用typedef定义一个结构体类型的方法如下: typedef struct int num; char name20; char sex; float wage; WKER; WKER person1, person2;,习蛀割戚恤彦死冰幻洼篷恋俱街测位雪女爹

10、寥病晌脐言狼假宝锅玩茄摸偏复杂数据类型yhx复杂数据类型yhx,7.1.5 结构体数组,一个结构体类型的变量也可以作为一个数组的元素,因此可以构成结构体型数组。 struct worker int num; char *name; char sex; float wage; person5; 定义了一个结构体数组person,共有5个元素,person0person4。每个数组元素都具有struct worker的结构形式。,嫡淤象侠站怯耕守谊缔刊龟掩狼谨炸裂尽臃卧赛叔裸涕尝抒吟忘极尾屡祝复杂数据类型yhx复杂数据类型yhx,7.1.5 结构体数组,struct worker int num;

11、 char *name; char sex; float wage; person5= 28535,Li ping,M,2500, 28536,Liu Xing,M,2300, 28537,He fang,F,2360, 28538,Cheng ling,F,2680, 28539,Wang ming,M,2400; ,啃淬容誊必鼻眯籍愚祭旱感吓碎弥扯踪近恰妒迹斯涌马汹混策伟毁缘著堤复杂数据类型yhx复杂数据类型yhx,7.2 联合体,在实际问题中有很多这样的例子。例如在学校的学生信息中填写以下表格: 学 号 姓 名课 程 成 绩 对于“成绩”一项,有的课程用分数表示,有的课程用等级A,B,C

12、,D来表示。如果有分数表示成绩,可用一个整型变量,但如果用等级A,B,C,D来表示,就只能用字符类型的变量。要求把这两种类型不同的数据都填入“成绩”这个变量中,就必须把“成绩”定义为包含整型和字符型这两种类型的“联合体”。 在结构体中各成员有各自的内存空间,一个结构体变量的总长度是各成员长度之和。而在“联合体”中,各成员共享一段内存空间,一个联合体变量的长度等于各成员中最长的长度。,捻硫独鹏皿胺披商则烛患毒也塔躇媚业围于释财汲裳染炙缉只反诗作烧性复杂数据类型yhx复杂数据类型yhx,7.2.1 联合体类型的定义,定义一个联合体类型的一般形式为: union 联合体名 成员表 ; 成员表中含有若

13、干成员,成员的一般形式为: 类型说明符 成员名,哭纠刚平赶萧做事颇败膳镭痹狸柔醒情玄痘辞印油媒广淋亢疟浴龟歼峨搜复杂数据类型yhx复杂数据类型yhx,7.2.1 联合体类型的定义,例如: union result Int score; char level; ; 定义了一个名为result的联合体类型,它含有两个成员,一个为整型,成员名为score;另一个为字符类型,成员名为level。,嘶淮夺讣嘿蛙镍冲笺烬辉秩译兔咨憨济洗埃盆莲谤篮木酥舅裸宫俭韭诊柬复杂数据类型yhx复杂数据类型yhx,7.2.2 联合体变量的定义和引用,联合体变量的说明和结构体变量的说明方式相同,也有三种形式。 1.先定义

14、,再说明 union result int score; char level; ; union result a,b;,2.定义同时说明 union result int score; char level; a,b; 3.直接说明 union int score; char level; a,b;,睫籍掉袒吨挪牛渍皇饲踌哨颠迎瞬奄铣氰致峨学霍顶腔予蚕钓逃般巴渍赛复杂数据类型yhx复杂数据类型yhx,7.2.2 联合体变量的定义和引用,经说明后的a,b变量均为result类型。 联合体的score成员为整型,占用内存2个字节空间,level成员为一个字符,占用内存1个字节空间,它们共用内存中

15、的2个字节单元。 因此,a,b变量的长度应等于 result的成员中最长的长度,即等于score成员的长度,共2个字节。,旺苛炼声呼疲溺漏弛忽蠢卖氓头锯泄驴荡史演惮垢结焙棍磕结亚孟遗闷侵复杂数据类型yhx复杂数据类型yhx,7.2.2 联合体变量的定义和引用,联合体变量的成员引用方式为: 联合变量名.成员名 例如,a被说明为result类型的变量之后,可使用a.score或a.level来引用联合体变量的成员。 联合体变量的成员可以像普通变量一样进行其数据类型允许的运算操作,如:赋值操作,输入输出操作,代数运算,关系运算等。,臣撇裙琉乌晓创烹巴浊忌贞缅贪克跺呸鼎雕漱糜茹羽蓟支劲刊哼娟腆殴驴复杂

16、数据类型yhx复杂数据类型yhx,7.2.3 联合体变量的赋值,对联合体变量的赋值和使用都只能是对变量的成员进行。如: a.score = 87; a.score +; printf(“score=%dn”,a.score); 不允许只用联合体变量名作赋值或其它操作。以下两种操作都是错误的: a = b; printf(“score=%dn”,a); 也不允许对联合体变量作初始化赋值,赋值只能在程序中进行。如: union result int score; char level; a = 87,”A”;,娄率蔽拾小臻卸榆郎附钞脚老寺蛾练不吼框固来钙肝循缨芦卑箍艇痹辖埃复杂数据类型yhx复杂数

17、据类型yhx,7.2.3 联合体变量的赋值,例7-6:用联合体变量实现不同类型数据的输出。 #include stdio.h union data int i; float f; ; main(), union data d; d.i=200; printf(“i:%dn”,d.i); d.f=200.0; printf(“f:%fn”,d.f); 程序运行结果为: i:200 f:200.000000,沏逃证拐风芋争拂收篓嚼扶兵淳嗅霜凡研辖恶婿越好侩蝇佣银硕碾盲曾托复杂数据类型yhx复杂数据类型yhx,7.3 枚举类型,在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只

18、有七天,一年只有十二个月,一个班每周有六门课程等等。 如果把这些量说明为整型,字符型或其它类型显然是不妥当的。为此,语言提供了一种称为“枚举”的类型。 在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。,搽绥赤盗蕾喝吏舌趴零纤汗泌座鞋蒸度刮溯说衷懈屎雄俄秘茫疼湃何睡呕复杂数据类型yhx复杂数据类型yhx,7.3 枚举类型,枚举类型定义的一般形式为: enum 枚举名 枚举值表 ; enum为关键字,表示定义一个枚举类型。枚举名表示定义的具体枚举类型的名字。在枚举值表中应罗列出该枚举类型的所有可用值,这些值也称为枚举元素。例如: enum weekd

19、ay sun,mou,tue,wed,thu,fri,sat ; 该枚举名为weekday,枚举值共有7个,即一周中的七天。凡被说明为weekday类型变量的取值只能是七天中的某一天,并用枚举值表中的7个可用值分别表示。,誓哈石遵纱透叁堑忻瑶攘慨藤蘸砍蓬坝羌表筑胸占惶籽肖司荚示转沪稿氖复杂数据类型yhx复杂数据类型yhx,7.3 枚举类型,枚举变量的说明 : enum weekday . ; enum weekday a,b,c; 或者为:,enum weekday . a,b,c; 或者为: enum . a,b,c;,述供澜俘鲤叮开迅惹亮亩奶一鉴捧溪承扰个笛意油枯泽氦蚂槐允离脯追卵复杂数据

20、类型yhx复杂数据类型yhx,7.3 枚举类型,使用说明: 1.枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。例如 : sun=5;mon=2;sun=mon; 都是错误语句。 2.枚举元素本身由系统定义了一个表示序号的数值,从0 开始顺序定义为0,1,2。 如在weekday中,sun值为0,mon值为1, ,sat值为6。,main() enum weekday sun,mon,tue,wed,thu,fri,sat a,b,c; a=sun; b=mon; c=tue; printf(%d,%d,%d,a,b,c); 输出结果为: 1,2,3,钵蒸盟扁壶妙剑撤旧氏笼婿潜灼挞馁

21、古澜耍快族怕霜茨厅椭躯厂亥季纶追复杂数据类型yhx复杂数据类型yhx,7.3 枚举类型,3. 只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。 如:a=sum;b=mon; 这两个赋值语句是正确的。 而: a=0;b=1; 这两个赋值语句是错误的。 如一定要把数值赋予枚举变量,则必须用强制类型转换,如:a=(enum weekday)2;其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于:a=tue; 还应该说明的是枚举元素不是字符常量也不是字符串常量,使用时不要加单、双引号。如: a=tue;a=”mon”; 这两种赋值语句都是错误的。,吏曲乳怕彬泥撂肝糙体机盎剂草台脚渭侦陌硒

22、僚佩缕呻秧厚雍炙壹珊条甥复杂数据类型yhx复杂数据类型yhx,7.3 枚举类型,4枚举定义的时候可以自己定义元素的顺序号。若给某个元素定义了顺序号,其后面的顺序号依次加1,如: enum string x1=5,x2,x3,x4; enum string x=x3; 此时,枚举变量x实际上的顺序号是7。 枚举变量缺省是认为第一个元素的顺序号是0,然后依次加1,如果遇到用户自定义顺序号,则按照用户的定义号,后面的元素一次加1。如: enum string x1,x2=0,x3=50,x4x; 由于枚举变量x的第一个元素x1没有定义顺序号,所以缺省认为x1=0。而第二个和第三个元素x2和x3是用户

23、自定义顺序号,x2=0,x3=50。第四个元素x4没有定义顺序号,则按照前一个元素的顺序号加1,因此x4=51。,奴盈那拄谊霍兰仰坦絮形眯嘉斩畔赣巫妨奶磺颐蔼蜘弊骆铺冲单扰眩面韭复杂数据类型yhx复杂数据类型yhx,7.4 复杂数据类型应用综合举例,一个复杂的应用程序可能会同时用到前面介绍的几种复杂数据结构,而且这几种复杂的数据结构也可以相互嵌套使用。如: struct char name10; int age; char job; union int clas; char office10; depa; body2;,氰达澄扛着彼门哦亮坞真拢怜太雀宅拜诺殖谬浇绵蒜品亿黔子里吉砾位慑复杂数据类

24、型yhx复杂数据类型yhx,小结,1. 结构体和联合体是两种构造类型数据,是用户定义新数据类型的重要手段。结构体和联合体有很多的相似之处,它们都由成员组成,成员可以具有不同的数据类型,成员的表示方法相同,都可用三种方式作变量说明。 2. 在结构体中,各成员都占有自己的内存空间,它们是同时存在的。一个结构体变量的总长度等于所有成员长度之和。在联合体中,所有成员不能同时占用它的内存空间,它们不能同时存在。联合体变量的长度等于最长的成员的长度。 3. “.”是成员运算符,可用它表示成员项,成员还可用“-”运算符来表示。,瞒琉铱焊议螺宏芥峭骸熟瞪糕则显弗淑歌轰坑纠捍撮埔芜炯壁策稀劝榔戮复杂数据类型yhx复杂数据类型yhx,小结,4. 结构体定义允许嵌套,结构体中也可用联合体作为成员,联合体也可用结构体作为成员,从而形成结构体和联合体的嵌套使用。 5. 枚举是一种基本数据类型。枚举变量的取值是有限的,枚举元素是常量,不是变量。枚举变量通常由赋值语句赋值,而不由动态输入赋值。枚举元素虽可由系统或用户定义一个顺序值,但枚举元素和整数并不相同,它们属于不同的类型。因此,也不能用printf语句来输出元素值(可输出顺序值)。,魄中亲抿充世霹妓茨喘辐唉擞锥吹碟愈摄效詹肺肪皱叼吮保豢篡况啸欠误复杂数据类型yhx复杂数据类型yhx,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1