用户自己建立数据类型(NEW).ppt

上传人:牧羊曲112 文档编号:6592235 上传时间:2023-11-15 格式:PPT 页数:48 大小:759KB
返回 下载 相关 举报
用户自己建立数据类型(NEW).ppt_第1页
第1页 / 共48页
用户自己建立数据类型(NEW).ppt_第2页
第2页 / 共48页
用户自己建立数据类型(NEW).ppt_第3页
第3页 / 共48页
用户自己建立数据类型(NEW).ppt_第4页
第4页 / 共48页
用户自己建立数据类型(NEW).ppt_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《用户自己建立数据类型(NEW).ppt》由会员分享,可在线阅读,更多相关《用户自己建立数据类型(NEW).ppt(48页珍藏版)》请在三一办公上搜索。

1、第九章 用户自己建立数据类型,结构体共用体枚举类型,2,结构简介,存储全校 19,00名学生的信息(学号、姓名、性别和成绩),问题:,I.使用数组,解决方案:,score,num,sex,name,不能建立数组间的关系,II.使用多维数组,C 语言不允许一个数组包含多种数据类型,III.使用结构,C 语言引入了称为结构的数据存储方式,“结构”是一种构造数据类型,它是由若干数据项组合而成的复杂数据对象,这些数据项称为结构的成员。,9.1 定义和使用结构体变量,结构体(structure)是用户自定义的一种数据类型,包含若干个类型不同的数据项。用途:把不同类型的数据组合成一个整体。而分别用独立变量

2、来表示不能反映它们之间的内在联系。,例:定义一个结构体类型student,包含学号、姓名、性别、年龄、成绩、家庭地址。,结构体类型的定义,struct 结构体名 类型标识符 成员名1;类型标识符 成员名2;,struct是关键字,不能省略,合法标识符可省略:无名结构体,成员类型可以是基本类型或构造类型,必须有分号,5,定义结构,struct structurenamedatatype variable1;datatype variable2;.;,结构成员,;,结构名,struct,student,int num;,char name20;,char sex;,定义结构,float score

3、;,C 语言中的有效数据类型,6,定义结构,struct student int num;char name20;char sex;float score;,num,name,sex,student,结构定义并不预留内存,结构定义放置在程序的开始部分,位于头文件声明之后,score,结构定义仅描述了一个结构的形式。如果要在程序里使用结构,需要声明结构变量。,struct date int year;int month;int day;,struct std_info int num;char name20;char sex;float score;char addr30;struct date

4、 birthday;,日期结构体类型:由年、月、日三项组成,学生信息结构类型:由学号、姓名、性别、成绩、地址和生日共6项组成,结构体变量的定义,间接定义法:先定义结构体类型,后定义结构体变量,struct student int num;char name20;char sex;int age;float score;char addr30;struct student stu1,stu2;,直接定义法:在定义结构类型的同时,定义结构变量,struct student int num;char name20;char sex;int age;float score;char addr30;st

5、u1,stu2;,结构体类型名student可以不写,struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu2;,stu1:,num name sex age score addr,stu1在内存中共占字节数:2+20+1+2+4+30=59,结构体变量的引用,结构体变量的引用原则结构体变量不能整体输入输出,要通过成员运算符“.”,逐个访问其成员,且访问的格式为:结构体变量.成员,struct date int year;int month;int day;struct date

6、birth;,printf(%d,%d,%d,birth);printf(%d,%d,%d,birth.year,birth.month,birth.day);,“.”是成员运算符,优先级最高,如果某成员本身又是一个结构类型,则只能通过多级的分量运算,对最低一级的成员进行引用。结构变量.成员.子成员.最低级子成员,引用结构变量student中的birthday成员的格式分别为:,结构体变量的引用原则,struct std_info int num;char name20;char sex;float score;struct date birthday;student;,struct date

7、 int year;int month;int day;,num name sex score birthday,student:,对最低一级成员,可像同类型的普通变量一样,进行相应的各种运算。,结构体变量的初始化,一般形式 结构体类型名 结构体变量=初值表;说明若某成员本身又是结构体类型,则该成员的初值为一个初值表初值的数据类型,应与结构变量中相应成员的类型一致,struct std_info int num;char name20;char sex;float score;struct date birthday;;struct std_info student=102,Zhangsan,

8、M,85,1980,9,20;,struct student int num;char name20;char sex;float score;struct student student1,student2;,struct student student1=1,Yao Ming,M,90.5;,1,Yao Ming,M,赋值的顺序应与成员声明时的顺序一样;允许初始化语句中的值的数目比结构成员数目少。,student1.num,student1.name,student1.sex,90.5,student1.score,结构变量初始化,student2.num=1;student2.name=

9、Zhang Zi Liang;student2.sex=M;printf(请输入成绩:n);scanf(%f,结构变量赋值,1,Zhang Zi Liang,M,用输入语句或赋值语句来给结构变量的各个成员赋值,78,78,student3=student2;,1,Zhang Zi Liang,M,78,问题描述:根据学员的成绩,输出不及格学员的详细信息。,使用结构示例,#includestruct studentint num;/学号char*name;/姓名char sex;/性别float score;/成绩;void main()static struct student stu1=1,

10、李亚鹏,M,61;static struct student stu2=2,周晶晶,F,92.5;static struct student stu3=3,姚光明,M,59;printf(不及格学员的名单如下:n);if(stu1.score=60,不及格学员的名单如下:,3 姚光明 M 59.00,1,李亚鹏,M,78,2,周晶晶,F,92,3,姚光明,M,59,struct std_info int num;char name20;char sex;struct date birthday;;main()struct std_info stu=102,Zhangsan,M,1980,9,2

11、0;printf(Num:%dn,stu.num);printf(Name:%sn,stu.name);printf(Sex:%cn,stu.sex);printf(Birthday:%,);,例 定义一个结构变量stu,用于存储和显示一个学生的基本 情况。,struct std_info stu;scanf(%d%s%c%d%d%d,&stu.num,stu.name,&stu.sex,&stu.birthday.year,&stu.birthday.month,&);,9.2使用结构体数组,定义:结构数组的每一个元素,都是结构类型数据,均包含结构类型的所有成员。,struct studen

12、t int num;char name20;char sex;int age;float score;;struct student stu3;,stu0stu1stu2,结构体数组初始化:结构体类型名 结构体数组名n初值表1,初值表2,.,初值表n;,struct student int num;char name20;char sex;int age;float score;;struct student stu3101,Lilin,M,18,87.5,102,Zhanghua,M,18,99,103,Wuli,F,19,78.5;,例定义结构类型struct std_info,定义一个结

13、构数组stu,用于存储和显示三个学生的基本情况。,struct date int year;int month;int day;struct std_info int num;char name20;char sex;struct date birthday;stu3=102,Zhangsan,M,1980,9,20,105,Lisi,M,1980,8,15,112,Wangwu,F,1980,3,10;,main()int i;printf(No.Name Sex Birthdayn);for(i=0;i3;i+)printf(%-7d,stui.num);printf(%-9s,stui.

14、name);printf(%-4c,stui.sex);printf(%d-%d-%dn,stui.birthday.year,stui.birthday.month,stui.birthday.day);,程序运行结果:No.Name Sex Birthday102 Zhangsan M 1980-9-20105 Lisi M 1980-8-15112 Wangwu F 1980-3-10,统计后选人选票,struct person char name20;int count;leader3=“Lian”,0,“ABian”,0,”Song“,0;main()int i,j;char lea

15、der_name20;for(i=1;i=10;i+)scanf(%s,leader_name);for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;for(i=0;i3;i+)printf(%5s:%dn,leaderi.name,leaderi.count);,9.3 结构体指针,指向结构体变量的指针,结构体变量在内存中的起始地址称为结构体变量的指针。,struct student int num;char name20;char sex;int age;float score;;main()struct s

16、tudent stu;struct student*p=,struct student int num;char name20;char sex;int age;float score;;main()struct student stu;struct student*p=,引用结构体变量成员的三种形式:,结构体变量.成员名stu.num(*p).成员名(*p).nump-成员名 p-num,若struct student stu;struct student*p=&stu;则,结构体成员运算符.和-的比较:二者的优先级相同,自左向右结合运算符.前面只能是结构体变量名或(*p)运算符-前面只能是

17、指向结构体的指针变量名,不能是其它变量名 stu-num,分析下列表达式:p-nump-num+p-num,设有以下语句:struct stint n;struct st*next;static struct st a3=5,则表达式()的值是6。A.p+-n B.p-n+C.(*p).n+D.+p-n,D,指向结构体数组的指针,struct student int num;char name20;char sex;int age;;struct student stu3101,Lilin,M,18,102,Zhanghua,M,18,103,Wuli,F,19,;struct student

18、*p=stu;main()for(;pnum,p-name,p-sex);,说明:如果指针变量p指向结构体数组,则p+1指向结构体数组的下一个元素,而不是当前元素的下一个成员。如果指针变量p指向一个结构变量(或结构数组),就不能再使之指向结构体变量(或结构数组元素)的某一成员。p=stu;p=stu.name;(+p)-num(p+)-num,下面程序的输出结果为()。struct st int x;int*y;*p;int dt4=10,20,30,40;struct st aa4=50,A.10 B.50 C.51 D.60 20 60 60 70 20 21 21 31,dt,aa,x,

19、y,&dt0&dt1&dt2&dat3,p,p+,用结构体变量和指向结构体的指针作函数参数,用结构体类型数据作为函数参数有以下三种形式:用结构体变量的成员作参数用法与普通变量作参数相同,值传递用结构体变量作参数函数的实参和形参必须都是结构体变量,程序效率低,不主张用用指向结构体变量的指针作参数 提高运行效率,9.4 用指针处理链表,一、链表结构,链表的三要素:头指针变量head指向链表的首结点(链表中每一个元素称为一个结点)每个结点由2个域组成:数据域-存储结点本身的信息指针域-存储后继结点的指针(地址)尾结点的指针域为NULL(空),作为链表结束的标志,9.5 共用体类型,概念:使几个不同的

20、变量占有同一段内存空间的结构称为共用体共用体类型的定义-与结构体类型的定义类似,union 共用体类型名 类型标识符 成员名1;类型标识符 成员名2;,union category int class;char position10;,共用体变量的定义-与结构体变量的定义类似,间接定义法:先定义共用体类型,后定义共用体变量,union data int i;char ch;float f;union data un1,un2,un3;,直接定义法:在定义共用体类型的同时,定义共用体变量,union data int i;char ch;float f;un1,un2,un3;,union da

21、ta int i;char ch;float f;union data un1,un2,un3;,注意:共用变量占用的内存空间,等于最长成员的长度,而不是各成员长度之和。,un1占用的内存空间为字节(不是4+1+4=9字节)。,共用体变量的引用 与结构体变量的引用一样,也只能逐个引用共用体变量的成员 un11;ma;un1.i=1;mun1.i;特点(1)系统采用覆盖技术,实现共用变量各成员的内存共享,所以在某一时刻,最后一次存入的成员值是起作用的。例如,执行un1.i=1;un1.ch=c;un1.f=3.14后,un1.f才是有效的成员。(2)由于所有成员共享同一内存空间,故共用变量与其各

22、成员的地址相同。例如,un1=un1.i=un1.ch=un1.f。(3)不能对共用体变量进行初始化(注意:结构体变量可以);也不能将共用变量作为函数参数,以及使函数返回一个共用体数据,但可以使用指向共用变量的指针。(4)共用类型可以出现在结构类型定义中,反之亦然。,结构体与共用体区别:存储方式不同,联系:两者可相互嵌套,下面定义中sizeof(a)和sizeof(a.share)的值是?struct date int day;int month;int year;union int share1;float share2;share;a;,例,sizeof(a)=10sizeof(a.sha

23、re)=4,下面定义中变量w在内存中所占字节数?union aa float x,y;char c6;struct st union aa v;float w5;double ave;w;,例,sizeof(w)=34,下列程序输出结果是()。#include main()unionint k;char i2;*s,a;s=,例,a.k,a.i0,a.i1,共用体变量a,或s-k,或s-i0,或s-i1,在内存中存储形式为,0011 1001,下列程序输出结果是()。#include main()unionint k;char i2;*s,a;s=,例,共用体变量a,s-k,s-i0,s-i1

24、,0011 1001,0011 1000,在内存中存储形式为,下列程序输出结果是()。#include main()unionint k;char i2;*s,a;s=,例,共用体变量a,0011 1001,0011 1000,低字节,高字节,故s-k在内存中存储数据为:0011 1000 0011 1001,s-k,s-i0,s-i1,以下程序运行的输出结果是()。main()union char i2;int k;r;r.i0=2;r.i1=0;printf(%dn,r.k);A.2 B.1 C.0 D.不确定,A,例,e.in,e.a,或e.b,共用体变量e,e.in.x,e.in.y,

25、程序运行的结果是_。main()union EXAMPLE struct int x;int y;in;int a;int b;e;e.a=1;e.b=2;e.in.x=e.a*e.b;e.in.y=e.a+e.b;);,程序运行的结果是_。main()union EXAMPLE struct int x;int y;in;int a;int b;e;e.a=1;e.b=2;e.in.x=e.a*e.b;e.in.y=e.a+e.b;);,e.in,e.a,或e.b,共用体变量e,1,e.in.x,e.in.y,例,程序运行的结果是_。main()union EXAMPLE struct in

26、t x;int y;in;int a;int b;e;e.a=1;e.b=2;e.in.x=e.a*e.b;e.in.y=e.a+e.b;);,e.in,e.a,或e.b,共用体变量e,1,e.in.x,e.in.y,2,例,程序运行的结果是_。main()union EXAMPLE struct int x;int y;in;int a;int b;e;e.a=1;e.b=2;e.in.x=e.a*e.b;e.in.y=e.a+e.b;);,e.in,e.a,或e.b,共用体变量e,2,e.in.x,e.in.y,4,例,9.6 使用枚举类型,用途:如果一个变量只有几种可能的值,就可以定义成

27、枚举类型枚举类型的定义 enum 枚举类型名取值表;例:enum weekdays Sun,Mon,Tue,Wed,Thu,Fri,Sat;枚举变量的定义-与结构体变量定义类似间接定义:enum weekdays work;直接定义:enum weekdays Sun,Mon,Tue,Wed,Thu,Fri,Sat work;,说明:(1)枚举型仅适应于取值有限的数据。例:1周天,年个月。(2)取值表中的值称为枚举元素,其含义由程序解释。例:不是因为写成“Sun”就自动代表“星期天”。事实上,枚举元素用什么表示都可以。(3)枚举元素按常量处理,它们的值是定义时的顺序号(从开始),所以枚举元素可

28、以进行比较,比较规则是:序号大者为大!例:上例中的Sun的值为0、Mon的值为1、Sat的值为6,所以MonSun,Sat最大。(4)枚举元素的值也是可以人为改变的:在定义时由程序指定。例:如果enum weekdays Sun=,Mon,Tue,Wed,Thu,Fri,Sat;则Sun=,Mon=,从Tue=2开始,依次增。注意:不同的枚举元素不可以指定相同的值(5)一个整数不能直接赋值给枚举变量 例:workday2;(非法,因为类型不同)改写成:workday(enum weekday)2;,下面程序的输出是()。main()enum teammy,your=4,his,her=his+

29、10;printf(%d%d%d%dn,my,your,his,her);A.0 1 2 3 B.0 4 0 10 C.0 4 5 15 D.1 4 5 15,C,下面程序的输出是。main()enum emem1=3,em2=1,em3;char*aa=AA,BB,CC,DD;printf(%s%s%sn,aaem1,aaem2,aaem3);,DDBBCC,9.7用typedef声明新类型名,作用:用typedef定义已有类型的别名。该别名与标准类型名一样,可用来定义相应的变量。定义已有类型别名的方法(1)按定义变量的方法,写出定义体;(2)将变量名换成别名;(3)在定义体最前面加上typ

30、edef。,关键字,例:给实型float定义1个别名REAL。(1)按定义实型变量的方法,写出定义体:float f;(2)将变量名换成别名:float REAL;(3)在定义体最前面加上typedef:typedef float REAL;,例:给结构类型struct date定义1个别名DATE。struct date int year,month,day;(1)按定义结构变量的方法,写出定义体:struct date d;(2)将变量名换成别名:struct date DATE;(3)在定义体最前面加上typedef:typedef struct date DATE;,typedef i

31、nt*ipoin;ipoin p;,说明(1)用typedef只是给已有类型增加个别名,并不能创造个新的类型。(2)typedef与#define有相似之处,但二者是不同的:前者是由编译器在编译时处理的;后者是由编译预处理器在编译预处理时处理的,而且只能作简单的字符串替换。,1.设有以下定义typedef union long i;int k5;char c;DATE;struct date int cat;DATE cow;double dog;too;DATE max;则语句printf(%d,sizeof(struct date)+sizeof(max)的执行结果是()。A.25 B.3

32、0 C.18 D.8,2.下面程序的输出是()。typedef union long x2;int y4;char z8;MYTYPE;MYTYPE them;main()printf(%dn,sizeof(them);A.32 B.16 C.8 D.24,4.设有以下说明语句typedefstructintn;charch8;PER;则下面叙述中正确的是A)PER是结构体变量名 B)PER是结构体类型名C)typedefstruct是结构体类型 D)struct是结构体类型名,3.若要说明一个类型名STP,使得定义语句STP s;等价于char*s;,以下选项中正确的是 A)typedef STP char*s;B)typedef*char STP;C)typedef STP*char;D)typedef char*STP;,B,C,D,B,若有以下说明和定义 typedef int*INTEGER INTEGER p,*q;以下叙述正确的是_。A)p是int型变量 B)p是基类型为int的指针变量 C)q是基类型为int的指针变量D)程序中可用INTEGER代替int类型名,B,

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号