复杂构造数据类型.ppt

上传人:max****ui 文档编号:15363631 上传时间:2020-08-09 格式:PPT 页数:40 大小:398.50KB
收藏 版权申诉 举报 下载
复杂构造数据类型.ppt_第1页
第1页 / 共40页
复杂构造数据类型.ppt_第2页
第2页 / 共40页
复杂构造数据类型.ppt_第3页
第3页 / 共40页
资源描述:

《复杂构造数据类型.ppt》由会员分享,可在线阅读,更多相关《复杂构造数据类型.ppt(40页珍藏版)》请在装配图网上搜索。

1、2020/8/7,C语言程序设计,1,上节回顾,一维数组:,二维数组:,数组与函数/指针的混合使用,字符数组:,元素:,int a6;,初始化:,int a6 = 1 , 3 , 5 , 7 , 9 ,2 ;,a0a5,int a6,n; for(n=0;n6;n+) scanf(“%d”,an);,元素:,初始化:,b00a12,int b23,int b23 = 1 , 3 , 5 , 7 , 9 ,2 ;,int b23,m,n; for(n=0;n2;n+) for(m=0;m3;m+) scanf(“%d”,bnm);,char c6;,初始化:,char c6 = G,o ,o,d

2、 ;,char c6 = “good” ;,char c6 = “good” ;,输入:,输入:,输入/输出:,gets(); puts(); %s,2020/8/7,C语言程序设计,2,第五章 复杂构造数据类型,5.1 结构体 5.2 共用体 5.3 枚举类型 *5.4 链表(不讲),2020/8/7,C语言程序设计,3,学生,5.1 结构体5.1.1 结构体的引出及使用,这些项目之间是彼此联系的,应组织定义成一个组合项,统一表示和使用,见下例:,一、结构体的引出,某一个学生的具体信息表示:,思考:实际应用中还有哪些具备多个属性的数据?,struct student int num; cha

3、r name8; char sex; int age; float score; char addr20; ;,2020/8/7,C语言程序设计,5,这种由若干个不同类型的数据项组成的组合类型,在C语言中叫做结构体类型,相当于其它语言中描述的“记录”。 结构体类型在使用之前应先定义其类型结构,然后再定义该类型变量,才能使用。,2、 结构体的定义,2020/8/7,C语言程序设计,6,结构体是由一些逻辑相关, 但数据类型不同的分量组成的一组数据。,注意: 用户需要先定义 结构体类型, 之后才能 定义结构体变量,注意不要忘了分号,关键字,用户定义 的标识符,struct student int n

4、um; char name8; char sex; int age; float score; char addr20; ;,2020/8/7,C语言程序设计,7,3、定义结构体变量的方法,(1). 先定义结构体类型, 再定义变量 struct student char name10 ; int age ; float s1 , s2 ; ;,结构体变量st1和st2各自都 需要20个字节的存储空间,name age s1 s2,name age s1 s2,数据类型 变量列表;,struct student,st1,st2,10个字节 2个字节 4个字节 4个字节,(2). 定义结构体类型同

5、时定义变量 struct student char name10 ; int age ; float s1 , s2 ; st1 , st2 ;,(3). 直接定义结构体变量 struct char name10 ; int age ; float s1 , s2 ; st1 , st2 ;,【 说明】: (1) 结构体变量具有结构体类型的一切特征 在内存中结构体变量占有一片连续的存储单元 存储单元的字节数可用sizeof 运算符算出 printf(“%dn” , sizeof(struct student) ) ; printf(“%dn” , sizeof(st1) ) ;,birthda

6、y?,(year、month、day),2020/8/7,C语言程序设计,9,(2) 结构体类型可以嵌套定义 例: struct date int year ; int month ; int day ; ; struct stud char name10 ; struct date birthday ; float s1 , s2 ; ;,或 : struct stud char name10 ; struct date int year ; int month ; int day ; birthday ; float s1 , s2 ; ;,2020/8/7,C语言程序设计,10,4、 结

7、构体变量的引用,(1). 引用结构体变量中的成员 格式: 结构体变量名. 成员名,struct student char name10 ; int age ; float s1 , s2 ; ;,注意: 一般是对结构体变量的各个成员分别进行赋值 st1 = “Mary”, 21 , 78 , 86 ; 这样的整体赋值是不允许的!,struct student st1 ; st1. name = “Mary” ; st1. age = 21 ; st1. s1 = 78 ; st1. s2 = 86 ;,成员运算符,gets(st1.name);,struct date int year ; i

8、nt month ; int day ; ; struct stud char name10 ; int age ; struct date birthday; float s1 , s2 ; ;,struct stud st2 ; int age , year ; strcpy(st2. name ,“John”) ; st2. age = 20 ; st2. birthday. year = 1980 ; st2. birthday. month = 11 ; st2. birthday. day = 23 ; st2. s1 = 89 ; st2. s2 = 95 ; age = 24

9、; year = 2000 ;,(2).结构体变量使用说明: 相同类型的结构体变量可以进行整体赋值,struct date int year ; int month ; int day ; ; struct stud char name10 ; int age ; struct date birthday; float s1 , s2 ; ;,struct stud st1, st2, st3; strcpy(st2. name ,“John”) ; st1. age = 20 ; st1. birthday.year = 1980 ; st1. birthday.month = 11 ; s

10、t1. birthday.day = 23 ; st1. s1 = 89 ; st1. s2 = 95 ; st2=st1; strcpy(st2. name ,“Mary”) ; st3. age=20; st3. birthday=st1. birthday; st3. s1 = 76; st3. s2 = 85;, C语言不允许结构体变量整体进行输入和输出, 只能对结构体变量的成员进行输入和输出,gets( st1. name ) ; scanf(“%d”,2020/8/7,C语言程序设计,14, 可以定义与结构体成员同名的变量,他们之间不会发生混乱。,struct student st

11、u; int age, year; stu.age=20; stu.birthday.year=1980; age=24; year=2000;,2020/8/7,C语言程序设计,15,5、 结构体变量的初始化,struct student char name10 ; int age ; float score1 , score2 ; st1=“ Mary”, 21, 78, 86 ;,struct stud char name10 ; struct date birthday ; float score1 , score2 ; ; struct stud st2= “John” , 1980

12、 , 11 , 23 , 89 , 95 ;,struct student char name10 ; int age ; float score1 , score2 ; ; struct student st1; st1=“ Mary”, 21, 78, 86 ;,这是初始化, 正确,这是赋值, 错误 C不允许这么做,2020/8/7,C语言程序设计,16,5.1.2 结构体数组的引出及使用,思考:如何表示100个学生的姓名、年龄、数学成绩以及语文成绩等信息?,2020/8/7,C语言程序设计,17,1、 结构体数组的定义 (1). 先定义结构体类型 再定义结构体数组 struct stud

13、ent char name10 ; int age ; float s1 , s2 ; ; struct student st6 ;,(2). 定义结构体类型的同时定义数 组 struct student char name10 ; int age ; float s1 , s2 ; st6 ;,(3). 直接定义结构体数组 struct char name10 ; int age ; float s1 , s2 ; st6 ;,2020/8/7,C语言程序设计,18,2、结构体数组的初始化 将每个数组元素的数据用花括号 括起来,struct student char name10 ; int

14、 age ; float s1 , s2 ; ; struct student st3= , , ;,“Mary”, 21, 78, 86,“Alex”, 20, 90, 80,“Mike”,19, 75, 68,(2). 数组元素之间可以整体赋值 也可以将一个元素赋给一个相同类型的结构体变量 struct student x , st3= “Mary”,21,78,86, “Alex”, ; st2 = st0 ; x = st1 ;,(3). 只能对数组元素的成员进行输入和输出,gets( st2. name ) ; scanf(“%d” , ,3、 结构体数组的引用 (1). 引用某个数

15、组元素的成员 例: puts( st0. name ) ; printf(“%d, %d”, st1. age , st1. s1 ) ;,例5.1: 定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。,#include ,5.1.3 结构体程序举例,struct int year; int month; int day; date;,printf(Input year,month,day: ); scanf(%d,%d,%d,switch(date.month) case 1:days=date.day; break; case 2:days=date.day+3

16、1; break; case 12:days=date.day+334; break; if(date.year%4=0,printf(n%d/%d is the %dth day in %d.n,date.month,date.day,days,date.year);,void main( ) int days; ,例5.2: 按成绩对学生信息进行从高到底的排序,#include #define N 30 struct stud int n ; char name10 ; int s ; ;,void input(struct stud a ) int i ; for ( i=0 ; iN

17、; i+) scanf(“%d%s%d”, ,void output(struct stud a ) int i ; for ( i=0 ; iN ; i+) printf(“%4d%10s%4d”, ai.n, ai.name, ai.s) ; ,void sort(struct stud a ) int i , j ; struct stud temp; for ( i=0 ; iN-1 ; i+) for ( j=i+1 ; jN ; j+) if ( ai.saj.s ) temp=ai ; ai=aj ; aj=temp ; ,void main( ) struct stud stN

18、; input(st); sort(st); output(st); ,2020/8/7,C语言程序设计,22,5.1.4 结构体与指针,结构体变量的指针就是该变量所占据的内存段的起始地址。 定义一个指针变量,指向一个结构体变量,此时该指针变量的值就是结构体变量的起始地址。可以用此指针来使用该结构体变量。,2020/8/7,C语言程序设计,23,一、指向结构体变量的指针,struct student long num; char name20; char sex; float score; struct student stu1; struct student *p; p=,相当于: stu1

19、.num=89101; strcpy(stu1.name,“Li Lin); stu1.sex=M; stu1.score=89;,注意:( )不能省,因为成员运算符优先级最高,2020/8/7,C语言程序设计,24,为了使用方便和直观,可以用指向运算符p-num来代替(*p).num (指向运算符优先级也是最高的) 因此有三种引用结构体成员的方法: 1、结构体变量. 成员名 2、(*p). 成员名 3、p-成员名,分析以下几种运算符: p-num p-num+ +p-num *p.num,(*p).num,2020/8/7,C语言程序设计,25,2、指向结构体数组的指针,struct stu

20、dent int num; char name20; char sex; float score; struct student stu3; struct student *p; for(p=stu;pnum, p-name,p-sex,p-score);,2020/8/7,C语言程序设计,26,3、用结构体变量和其指针作函数参数,将一个结构体变量的值传递给一个函数有3个方法: A、用结构体类型作参数。采用的是“值传递”的方式。调用时形参要占用内存单元,如果结构体复杂、规模大,其在时间和空间上的开销很大。而且值传递是单向的,使用不便。 B、用指向结构体变量的指针作实参,将结构体变量(或数组)的

21、地址传递给形参。这种方法传递地址,即节省空间又可以双向传递值。,2020/8/7,C语言程序设计,27,C、用结构体变量的成员分别作参数,用法和普通变量作实参是一样的,属于“值传递”。此时应当注意形参与实参的类型、顺序、个数等要保持一致。此种用法不多见。,2020/8/7,C语言程序设计,28,5.2 共用体,一.共用体的概念,所谓“共用体”类型, 是指使几个不同类型的变量共同占用同一段内存单元。如图示:,起始地址1000,采用软件技术中的覆盖技术,对于临时变量使用共用体可以节省内存空间。,2020/8/7,C语言程序设计,29,二.共用体的定义,例1: union data int i; c

22、har ch; float f; aa,bb,cc;,union,共用体类型名,类型标识符1 成员名1;,类型标识符2 成员名2; . . 类型标识符n 成员名n;,变量列表;,共用体类型的变量声明形式也有3种,同结构体类型。,2020/8/7,C语言程序设计,30,例2: union data int i; char ch; float f; ; union data aa,bb;,例3: union int i; char ch; float f; aa,bb,cc;,注意不要忘了分号,2020/8/7,C语言程序设计,31,共用体变量所占内存的长度等于最长的成员的长度。而不是各成员的长度

23、之和,这一点不同于结构体。 例如前面的例子data类型的变量aa,占据的内存空间为4个字节,而不是2+1+4=7个字节。,共用体变量所占 的内存空间,2020/8/7,C语言程序设计,32,三.共用体变量的引用,共用体变量只能引用它的成员,不能引用共用体变量本身。,共用体变量成员名,例如前例中的变量aa,可以引用它的成员 aa.i=56; aa.f=123.6432; aa.ch=A;,如下使用是错误的:printf(“%d”,aa);,四.共用体类型数据的特点,(1)每一瞬时只能存放其中的一个成员,而不是同时存放几种,即其它成员不起作用。,(2)只有最后一个存放的成员的值有效,其他成员将失去

24、原值。 如上例中的变量aa 只有最后一个成员值aa.ch=A是有效的。,(3)共用体变量的地址和它的成员地址都是同一地址。 即 char name20; char sex; char job; union int class; char position10; category; mem20;,2020/8/7,C语言程序设计,37,5.3 枚举类型,所谓“枚举”,是指将变量的所有取值一一列举出来,变量的取值只限于列举出来的值的范围。该变量称之为枚举型变量。枚举类型和构造类型数据相似。 所列举的值叫做枚举元素(枚举常量)。,定义一个枚举类型名,再用它定义变量。 enum 枚举类型名 枚举元素,

25、枚举元素,枚举元素n;enum 枚举类型名变量列表;,关键字,类型名和枚举元素名由用户自己命名,类型名和枚举元素名由用户自己命名,某些数据的取值使用有限个,有意义的名字表达,更为直观。例如:月份,季度,星期,商品类别等。,2020/8/7,C语言程序设计,38,例1: enum weekdaysun,mon,tue,wd,thu,fri,sat ; enum weekday day;,例2: enum weekday sun,mon,tue,wd,thu,fri,sat day;,例3: enum sun,mon,tue,wd,thu,fri,sat day;,说明: (1)、C语言中枚举元素

26、按常量处理,它们是有值的。它们的值是系统按其定义顺序自动赋予的 0、1、2、3、4、。 因此上例中的枚举元素sun的值为0,mon的值为1,依次类推。枚举变量的值即是它所取的枚举元素的值,此值可输出查看,如dayfri;则day的值为5,可以输出printf(“%d”,day); 输出结果为5。,(2)、枚举元素的值也可以改变,但必须在定义时指定。 如:enum weekday sun=7,mon,tue,wd,thu,fri,dat ; 如果定义时未指定值,则按顺序取默认值:mon取值为8。,3、枚举元素是常量,不是变量,不能在定义以外的任何位置对它们赋值,如sun=5;,4、枚举值可用来做判断比较,如: if(day= =sun) ; if(daymon &dayfri) ,5、枚举变量取值只能是所列举的枚举元素,不能直接赋予一个整数值,如:day2;,当然可以采用强制类型转换的方式赋值,但多数情况不采用。,

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!