第五章 复杂构造数据类型_第1页
第五章 复杂构造数据类型_第2页
第五章 复杂构造数据类型_第3页
第五章 复杂构造数据类型_第4页
第五章 复杂构造数据类型_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

上节回顾一维数组:二维数组:数组与函数/指针的混合使用字符数组:元素:inta[6];初始化:inta[6]={1,3,5,7,9,2};a[0]~a[5]inta[6],n;for(n=0;n<6;n++)

scanf(“%d”,a[n]);元素:初始化:b[0][0]~a[1][2]intb[2][3]intb[2][3]={1,3,5,7,9,2};intb[2][3],m,n;for(n=0;n<2;n++)for(m=0;m<3;m++)

scanf(“%d”,b[n][m]);charc[6];初始化:charc[6]={‘G’,’o’,’o’,’d’};charc[6]={“good”};charc[6]=“good”;输入:输入:输入/输出:gets();puts();%s1/11/20231《C语言程序设计》第五章复杂构造数据类型5.1结构体5.2共用体5.3枚举类型1/11/20232《C语言程序设计》学生学号姓名性别成绩家庭住址5.1结构体

5.1.1结构体的引出及使用这些项目之间是彼此联系的,应组织定义成一个组合项,统一表示和使用,见下例:年龄1/11/20233《C语言程序设计》学号姓名性别年龄成绩家庭地址intnumcharname[8]charsexintagefloatscorecharaddr[20]9001李华女2086济南某一个学生的具体信息表示:思考:实际应用中还有哪些具备多个属性的数据?struct

student{

intnum;charname[8];charsex;

intage;floatscore;charaddr[20];};1/11/20234《C语言程序设计》

这种由若干个不同类型的数据项组成的组合类型,在C语言中叫做结构体类型,相当于其它语言中描述的“记录”。结构体类型在使用之前应先定义其类型结构,然后再定义该类型变量,才能使用。

二、结构体的定义及使用1/11/20235《C语言程序设计》

结构体是由一些逻辑相关,但数据类型不同的分量组成的一组数据。注意:用户需要先定义结构体类型,之后才能定义结构体变量注意不要忘了分号成员表列结构体类型定义形式:struct

结构体名{数据类型成员名1;

数据类型成员名2;::

数据类型成员名n;};关键字用户定义的标识符struct

student{

intnum;charname[8];charsex;

intage;floatscore;charaddr[20];};1/11/20236《C语言程序设计》三、定义结构体变量的方法1.先定义结构体类型,

再定义变量

structstudent{charname[10];

int

age;floats1,s2;};结构体变量st1和st2各自都需要20个字节的存储空间st1st2nameages1s2nameages1s2结构体名数据类型变量列表;structstudentst1,st2结构体类型两个structstudent类型的变量10个字节2个字节4个字节4个字节1/11/20237《C语言程序设计》2.定义结构体类型同时定义变量

structstudent{charname[10];

int

age;floats1,s2;}st1,st2;3.直接定义结构体变量

struct

{charname[10];

int

age;floats1,s2;}

st1,st2;4.说明:(1)结构体变量具有结构体类型的一切特征在内存中结构体变量占有一片连续的存储单元存储单元的字节数可用sizeof

运算符算出

printf(“%d\n”,sizeof(structstudent));

printf(“%d\n”,sizeof(st1));birthday?

(year、month、day)1/11/20238《C语言程序设计》(2)结构体类型可以嵌套定义例:

structdate{intyear;

intmonth;

intday;};

structstud{charname[10];

structdatebirthday;floats1,s2;};

或:structstud{charname[10];

structdate{intyear;

intmonth;

intday;}birthday;floats1,s2;};1/11/20239《C语言程序设计》四、结构体变量的引用1.引用结构体变量中的成员

格式:

结构体变量名.成员名structstudent{charname[10];

intage;floats1,s2;};注意:一般是对结构体变量的各个成员分别进行赋值st1={“Mary”,21,78,86};这样的整体赋值是不允许的!structstudentst1;

=“Mary”;

st1.age

=21;st1.s1

=78;

st1.s2

=86;

成员运算符gets();1/11/202310《C语言程序设计》structdate{int

year

;

intmonth;

intday;};structstud{charname[10];

int

age

;

structdatebirthday;

floats1,s2;};structstudst2;intage,year;strcpy(,“John”);

st2.age=20;st2.birthday.year=1980;st2.birthday.month=11;st2.birthday.day=23;st2.s1=89;st2.s2=95;age=24;year=2000;1/11/202311《C语言程序设计》2.相同类型的结构体变量可以进行整体赋值

structdate{intyear;

intmonth;

intday;};structstud{charname[10];

intage;

structdatebirthday;floats1,s2;};structstudst1,st2,st3;strcpy(,“John”);st1.age=20;st1.birthday.year=1980;st1.birthday.month=11;st1.birthday.day=23;st1.s1=89;st1.s2=95;st2=st1;strcpy(,“Mary”);st3.age=20;st3.birthday=st1.birthday;st3.s1=76;st3.s2=85;注意要正确赋值的条件是变量st1已经有了数据1/11/202312《C语言程序设计》3.结构体变量的输入输出

C语言不允许结构体变量整体进行输入和输出,

只能对结构体变量的成员进行输入和输出gets(

);scanf(“%d”,&st1.age);scanf(“%d%d%d”,

&st1.birthday.year,

&st1.birthday.month,&st1.birthday.day);scanf(“%f%f”,&st1.s1,

&st1.s2

);

puts(

);printf(“%4d”,

st1.age

);printf(“%d.%d.%d”,

st1.birthday.year

,st1.birthday.month,st1.birthday.day);printf(“%5.2f,%5.2f\n”,

st1.s1

,s1t.s2);

1/11/202313《C语言程序设计》五、结构体变量的初始化structstudent{charname[10];

intage;floatscore1,score2;}

st1={“Mary”,21,78,86};structstud{charname[10];

structdatebirthday;floatscore1,score2;};structstudst2={“John”,

1980,11,23

,89,95};structstudent{charname[10];

intage;floatscore1,score2;};structstudentst1;st1={“Mary”,21,78,86};这是初始化,正确这是赋值,错误C不允许这么做1/11/202314《C语言程序设计》5.1.2结构体数组的引出及使用思考:如何表示100个学生的姓名、年龄、数学成绩以及语文成绩等信息?1/11/202315《C语言程序设计》1、结构体数组的定义

(1).先定义结构体类型再定义结构体数组

structstudent

{charname[10];

intage;floats1,s2;};

structstudentst[6];(2).定义结构体类型的同时定义数组

structstudent

{charname[10];

intage;floats1,s2;}

st[6];

(3).直接定义结构体数组

struct

{charname[10];

intage;floats1,s2;}

st[6];1/11/202316《C语言程序设计》

2、结构体数组的初始化将每个数组元素的数据用花括号{}括起来structstudent{charname[10];

intage;floats1,s2;};structstudentst[3]={

,

,

};Mary217886Alex209080Mike197568st[0]st[1]st[2]{“Mary”,21,78,86}{“Alex”,20,90,80}{“Mike”,19,75,68}1/11/202317《C语言程序设计》(2).数组元素之间可以整体赋值也可以将一个元素赋给一个相同类型的结构体变量

structstudent

x

,

st[3]={

{“Mary”,21,78,86},

{“Alex”,…}

};

st[2]=st[0];x=st[1];

(3).只能对数组元素的成员进行输入和输出gets(

st[2].name

);scanf(“%d”,

&st[2].age

);scanf(“%f%f”,

&st[2].s1

,&st[2].s2);puts(

st[0].name

);printf(“%4d%5.2f

%5.2f\n”,

st[0].age

,st[0].s1,

st[0].s2);都是结构体变量的整体赋值3、结构体数组的引用(1).引用某个数组元素的成员例:puts(

st[0].name

);

printf(“%d,%d”,

st[1].age,st[1].s1

);1/11/202318《C语言程序设计》例5.1:有30名学生,每个学生包括学号、姓名、成绩,要求找出成绩最高者,并输出他的信息#include<stdio.h>#defineN30voidmain(){

inti,m;

intmax;

for(

i=1

;i<N;i++)if(st[i].score>max){

max=st[i].score;m=i;

}}5.1.3结构体程序举例structstudent{intn;charname[10];

intscore;};

structstudentst[N];for(i=0;i<N;i++)

scanf(“%d%s%d”,

&st[i].n

,st[i].name,

&st[i].score);max=st[0].score;printf(“%4d”,

st[m].n

);

printf(“%10s”,

st[m].name

);

printf(“%5d”,

st[m].score);1/11/202319《C语言程序设计》例5.2:按成绩对学生信息进行从高到底的排序#include<stdio.h>#defineN30structstud{intn;charname[10];

ints;};voidinput(structstud

a[]){inti;for(i=0;i<N;i++)

scanf(“%d%s%d”,

&a[i].n,

a[i].name,

&a[i].s);}

voidoutput(structstud

a[]){inti;for(i=0;i<N;i++)

printf(“%4d%10s%4d”,

a[i].n,a[i].name,a[i].s);}

voidsort(structstud

a[]){inti,j;

structstud

temp;for(i=0;i<N-1

;i++)for(j=i+1;j<N

;j++)if(

a[i].s<a[j].s

){temp=a[i];a[i]=a[j];a[j]=temp;}}voidmain(){

structstud

st[N];

input(st);

sort(st);

output(st);}1/11/202320《C语言程序设计》5.1.4结构体与指针结构体变量的指针就是该变量所占据的内存段的起始地址。定义一个指针变量,指向一个结构体变量,此时该指针变量的值就是结构体变量的起始地址。可以用此指针来使用该结构体变量。1/11/202321《C语言程序设计》一、指向结构体变量的指针

structstudent{longnum;charname[20];charsex;floatscore;};

structstudentstu1;

structstudent*p;

p=&stu1;

(*p).num=89101;

strcpy((*p).name,"LiLin");(*p).sex='M';(*p).score=89;相当于:stu1.num=89101;strcpy(,“LiLin");stu1.sex='M';stu1.score=89;注意:()不能省,因为成员运算符优先级最高1/11/202322《C语言程序设计》为了使用方便和直观,可以用指向运算符p->num来代替(*p).num(指向运算符优先级也是最高的)因此有三种引用结构体成员的方法:

1、结构体变量.成员名

2、(*p).成员名

3、p->成员名分析以下几种运算符:p->nump->num++++p->num*p.num

×(*p).num1/11/202323《C语言程序设计》2、指向结构体数组的指针

structstudent{intnum;charname[20];charsex;floatscore;};

structstudentstu[3];

structstudent*p;……for(p=stu;p<stu+3;p++)

printf(“%ld,%s,%c,%f”,p->num,p->name,p->sex,p->score);1/11/202324《C语言程序设计》3、用结构体变量和其指针作函数参数

将一个结构体变量的值传递给一个函数有3个方法:A、用结构体类型作参数。采用的是“值传递”的方式。调用时形参要占用内存单元,如果结构体复杂、规模大,其在时间和空间上的开销很大。而且值传递是单向的,使用不便。B、用指向结构体变量的指针作实参,将结构体变量(或数组)的地址传递给形参。这种方法传递地址,即节省空间又可以双向传递值。1/11/202325《C语言程序设计》C、用结构体变量的成员分别作参数,用法和普通变量作实参是一样的,属于“值传递”。此时应当注意形参与实参的类型、顺序、个数等要保持一致。此种用法不多见。1/11/202326《C语言程序设计》5.2共用体一.共用体的概念所谓“共用体”类型,是指使几个不同类型的变量共同占用同一段内存单元。如图示:实型整型

字符型起始地址1000采用软件技术中的覆盖技术,对于临时变量使用共用体可以节省内存空间。1/11/202327《C语言程序设计》二.共用体的定义例1:uniondata{inti;charch;floatf;}aa,bb,cc;union共用体类型名{类型标识符1成员名1;类型标识符2成员名2;

….. …….类型标识符n成员名n;}变量列表;共用体类型的变量声明形式也有3种,同结构体类型。1/11/202328《C语言程序设计》例2:uniondata{inti;charch;floatf;};uniondataaa,bb;例3:union{inti;charch;floatf;}aa,bb,cc;注意不要忘了分号1/11/202329《C语言程序设计》共用体变量所占内存的长度等于最长的成员的长度。而不是各成员的长度之和,这一点不同于结构体。例如前面的例子data类型的变量aa,占据的内存空间为4个字节,而不是2+1+4=7个字节。共用体变量所占的内存空间1/11/202330《C语言程序设计》三.共用体变量的引用共用体变量只能引用它的成员,不能引用共用体变量本身。共用体变量.成员名例如前例中的变量aa,可以引用它的成员

aa.i=56;

aa.f=123.6432;

aa.ch=‘A’;如下使用是错误的:printf(“%d”,aa);1/11/202331《C语言程序设计》四.共用体类型数据的特点(1)每一瞬时只能存放其中的一个成员,而不是同时存放几种,即其它成员不起作用。(2)只有最后一个存放的成员的值有效,其他成员将失去原值。如上例中的变量aa

只有最后一个成员值aa.ch=‘A’是有效的。(3)共用体变量的地址和它的成员地址都是同一地址。

即&aa和&aa.i、&aa.ch、&aa.f的起始地址都是一样的。(4)共用体变量不能初始化,也不能对变量名整体赋值,不能引用变量名来输出一个值,只能引用它的某个成员。1/11/202332《C语言程序设计》(5)共用体变量不能作为函数的参数,也不能作为函数返回值。但可以使用指向共用体变量的指针。(6)共用体类型可以出现在结构体中,共用体成员也可以是结构体类型。(7)可以定义共用体数组。1/11/202333《C语言程序设计》例

:设有若干个人员的数据,其中有学生和教师。学生的数据包括:姓名、号码、性别、职业、班级。教师的数据包括:姓名、号码、性别、职业、职务。现要求把他们放在同一表格中,见图。numnamesexjobclassposition101Lifs501102Fengmtprof如果job项为s,则第5项为class,如果job项为t,则第5项为position。要求输入人员的数据,然后再输出。1/11/202334《C语言程序设

温馨提示

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

评论

0/150

提交评论