《第五章复杂构造数据类型.ppt》由会员分享,可在线阅读,更多相关《第五章复杂构造数据类型.ppt(40页珍藏版)》请在三一办公上搜索。
1、2023/9/11,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;,char c6=“good”;,char c6=“good
2、”;,输入:,输入:,输入/输出:,gets();puts();%s,2023/9/11,C语言程序设计,2,第五章 复杂构造数据类型,5.1 结构体5.2 共用体5.3 枚举类型*5.4 链表(不讲),2023/9/11,C语言程序设计,3,学生,5.1 结构体5.1.1 结构体的引出及使用,这些项目之间是彼此联系的,应组织定义成一个组合项,统一表示和使用,见下例:,一、结构体的引出,某一个学生的具体信息表示:,思考:实际应用中还有哪些具备多个属性的数据?,struct student int num;char name8;char sex;int age;float score;char
3、addr20;,2023/9/11,C语言程序设计,5,这种由若干个不同类型的数据项组成的组合类型,在C语言中叫做结构体类型,相当于其它语言中描述的“记录”。结构体类型在使用之前应先定义其类型结构,然后再定义该类型变量,才能使用。,2、结构体的定义,2023/9/11,C语言程序设计,6,结构体是由一些逻辑相关,但数据类型不同的分量组成的一组数据。,注意:用户需要先定义结构体类型,之后才能定义结构体变量,注意不要忘了分号,关键字,用户定义的标识符,struct student int num;char name8;char sex;int age;float score;char addr20
4、;,2023/9/11,C语言程序设计,7,3、定义结构体变量的方法,(1).先定义结构体类型,再定义变量 struct student char name10;int age;float s1,s2;,结构体变量st1和st2各自都需要20个字节的存储空间,nameages1s2,nameages1s2,数据类型 变量列表;,struct student,st1,st2,10个字节2个字节4个字节4个字节,(2).定义结构体类型同时定义变量 struct student char name10;int age;float s1,s2;st1,st2;,(3).直接定义结构体变量 struct
5、 char name10;int age;float s1,s2;st1,st2;,【说明】:(1)结构体变量具有结构体类型的一切特征 在内存中结构体变量占有一片连续的存储单元 存储单元的字节数可用sizeof 运算符算出 printf(“%dn”,sizeof(struct student);printf(“%dn”,sizeof(st1);,birthday?,(year、month、day),2023/9/11,C语言程序设计,9,(2)结构体类型可以嵌套定义 例:struct date int year;int month;int day;struct stud char name10
6、;struct date birthday;float s1,s2;,或:struct stud char name10;struct date int year;int month;int day;birthday;float s1,s2;,2023/9/11,C语言程序设计,10,4、结构体变量的引用,(1).引用结构体变量中的成员 格式:结构体变量名.成员名,struct student char name10;int age;float s1,s2;,注意:一般是对结构体变量的各个成员分别进行赋值st1=“Mary”,21,78,86;这样的整体赋值是不允许的!,struct stud
7、ent st1;st1.name=“Mary”;st1.age=21;st1.s1=78;st1.s2=86;,成员运算符,gets(st1.name);,struct date int year;int 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.birt
8、hday.day=23;st2.s1=89;st2.s2=95;age=24;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;st1.birt
9、hday.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”,2023/9/11,C语言程序设计,14,可以定义与结构体成员同名的变量,他们之间不会发生混乱。,struct student stu;int age,year;stu.age=20;stu.birthday.year=19
10、80;age=24;year=2000;,2023/9/11,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,11,23,89,95;,struct student char name10;int age;float score1,score2;struct st
11、udent st1;st1=“Mary”,21,78,86;,这是初始化,正确,这是赋值,错误C不允许这么做,2023/9/11,C语言程序设计,16,5.1.2 结构体数组的引出及使用,思考:如何表示100个学生的姓名、年龄、数学成绩以及语文成绩等信息?,2023/9/11,C语言程序设计,17,1、结构体数组的定义(1).先定义结构体类型 再定义结构体数组 struct student char name10;int age;float s1,s2;struct student st6;,(2).定义结构体类型的同时定义数组 struct student char name10;int a
12、ge;float s1,s2;st6;,(3).直接定义结构体数组 struct char name10;int age;float s1,s2;st6;,2023/9/11,C语言程序设计,18,2、结构体数组的初始化 将每个数组元素的数据用花括号 括起来,struct student char name10;int age;float s1,s2;struct student st3=,;,“Mary”,21,78,86,“Alex”,20,90,80,“Mike”,19,75,68,(2).数组元素之间可以整体赋值 也可以将一个元素赋给一个相同类型的结构体变量 struct studen
13、t x,st3=“Mary”,21,78,86,“Alex”,;st2=st0;x=st1;,(3).只能对数组元素的成员进行输入和输出,gets(st2.name);scanf(“%d”,3、结构体数组的引用(1).引用某个数组元素的成员 例:puts(st0.name);printf(“%d,%d”,st1.age,st1.s1);,例5.1:定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。,#include,5.1.3 结构体程序举例,structint year;int month;int day;date;,printf(Input year,month
14、,day:);scanf(%d,%d,%d,switch(date.month)case 1:days=date.day;break;case 2:days=date.day+31;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 30struct stud int n
15、;char name10;int s;,void input(struct stud a)int i;for(i=0;iN;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
16、stud stN;input(st);sort(st);output(st);,2023/9/11,C语言程序设计,22,5.1.4 结构体与指针,结构体变量的指针就是该变量所占据的内存段的起始地址。定义一个指针变量,指向一个结构体变量,此时该指针变量的值就是结构体变量的起始地址。可以用此指针来使用该结构体变量。,2023/9/11,C语言程序设计,23,一、指向结构体变量的指针,struct student long num;char name20;char sex;float score;struct student stu1;struct student*p;p=,相当于:stu1.nu
17、m=89101;strcpy(stu1.name,“Li Lin);stu1.sex=M;stu1.score=89;,注意:()不能省,因为成员运算符优先级最高,2023/9/11,C语言程序设计,24,为了使用方便和直观,可以用指向运算符p-num来代替(*p).num(指向运算符优先级也是最高的)因此有三种引用结构体成员的方法:1、结构体变量.成员名 2、(*p).成员名 3、p-成员名,分析以下几种运算符:p-nump-num+p-num*p.num,(*p).num,2023/9/11,C语言程序设计,25,2、指向结构体数组的指针,struct student int num;ch
18、ar name20;char sex;float score;struct student stu3;struct student*p;for(p=stu;pnum,p-name,p-sex,p-score);,2023/9/11,C语言程序设计,26,3、用结构体变量和其指针作函数参数,将一个结构体变量的值传递给一个函数有3个方法:A、用结构体类型作参数。采用的是“值传递”的方式。调用时形参要占用内存单元,如果结构体复杂、规模大,其在时间和空间上的开销很大。而且值传递是单向的,使用不便。B、用指向结构体变量的指针作实参,将结构体变量(或数组)的地址传递给形参。这种方法传递地址,即节省空间又可
19、以双向传递值。,2023/9/11,C语言程序设计,27,C、用结构体变量的成员分别作参数,用法和普通变量作实参是一样的,属于“值传递”。此时应当注意形参与实参的类型、顺序、个数等要保持一致。此种用法不多见。,2023/9/11,C语言程序设计,28,5.2 共用体,一.共用体的概念,所谓“共用体”类型,是指使几个不同类型的变量共同占用同一段内存单元。如图示:,起始地址1000,采用软件技术中的覆盖技术,对于临时变量使用共用体可以节省内存空间。,2023/9/11,C语言程序设计,29,二.共用体的定义,例1:union data int i;char ch;float f;aa,bb,cc;
20、,union,共用体类型名,类型标识符1 成员名1;,类型标识符2 成员名2;.类型标识符n 成员名n;,变量列表;,共用体类型的变量声明形式也有3种,同结构体类型。,2023/9/11,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;,注意不要忘了分号,2023/9/11,C语言程序设计,31,共用体变量所占内存的长度等于最长的成员的长度。而不是各成员的长度之和,这一点不同于结构体。例如前面的例子data类型的变量aa,占据的内存
21、空间为4个字节,而不是2+1+4=7个字节。,共用体变量所占 的内存空间,2023/9/11,C语言程序设计,32,三.共用体变量的引用,共用体变量只能引用它的成员,不能引用共用体变量本身。,共用体变量成员名,例如前例中的变量aa,可以引用它的成员 aa.i=56;aa.f=123.6432;aa.ch=A;,如下使用是错误的:printf(“%d”,aa);,四.共用体类型数据的特点,(1)每一瞬时只能存放其中的一个成员,而不是同时存放几种,即其它成员不起作用。,(2)只有最后一个存放的成员的值有效,其他成员将失去原值。如上例中的变量aa 只有最后一个成员值aa.ch=A是有效的。,(3)共
22、用体变量的地址和它的成员地址都是同一地址。即&aa和&aa.i、&aa.ch、&aa.f的起始地址都是一样的。,(4)共用体变量不能初始化,也不能对变量名整体赋值,不能引用变量名来输出一个值,只能引用它的某个成员。,2023/9/11,C语言程序设计,34,(5)共用体变量不能作为函数的参数,也不能作为函数返回值。但可以使用指向共用体变量的指针。,(6)共用体类型可以出现在结构体中,共用体成员也可以是结构体类型。,(7)可以定义共用体数组。,2023/9/11,C语言程序设计,35,例:设有若干个人员的数据,其中有学生和教师。学生的数据包括:姓名、号码、性别、职业、班级。教师的数据包括:姓名、
23、号码、性别、职业、职务。现要求把他们放在同一表格中,见图。,如果job项为s,则第5项为class,如果job项为t,则第5项为position。要求输入人员的数据,然后再输出。,2023/9/11,C语言程序设计,36,数据类型定义:整体是一个结构体类型;其中第5项可以用共用体来处理。,struct member int num;char name20;char sex;char job;union int class;char position10;category;mem20;,2023/9/11,C语言程序设计,37,5.3 枚举类型,所谓“枚举”,是指将变量的所有取值一一列举出来,变
24、量的取值只限于列举出来的值的范围。该变量称之为枚举型变量。枚举类型和构造类型数据相似。所列举的值叫做枚举元素(枚举常量)。,定义一个枚举类型名,再用它定义变量。enum 枚举类型名枚举元素,枚举元素,枚举元素n;enum 枚举类型名变量列表;,关键字,类型名和枚举元素名由用户自己命名,类型名和枚举元素名由用户自己命名,某些数据的取值使用有限个,有意义的名字表达,更为直观。例如:月份,季度,星期,商品类别等。,2023/9/11,C语言程序设计,38,例1:enum weekdaysun,mon,tue,wd,thu,fri,sat;enum weekday day;,例2:enum weekd
25、ay sun,mon,tue,wd,thu,fri,sat day;,例3:enum sun,mon,tue,wd,thu,fri,sat day;,说明:(1)、C语言中枚举元素按常量处理,它们是有值的。它们的值是系统按其定义顺序自动赋予的 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;,当然可以采用强制类型转换的方式赋值,但多数情况不采用。,