C语言程序设计Ch结构体共用体和枚举_第1页
C语言程序设计Ch结构体共用体和枚举_第2页
C语言程序设计Ch结构体共用体和枚举_第3页
C语言程序设计Ch结构体共用体和枚举_第4页
C语言程序设计Ch结构体共用体和枚举_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

会计学1C语言程序设计Ch结构体共用体和枚举2

结构体类型

数组中的各元素是属于同一类型的,但有时需要将不同类型的数据组合成一个有机的整体,并且这些数据是相互联系的,这就引出了结构体。

结构体是由多种类型的数据组成的整体。组成结构体的各个分量称为结构体的数据成员(简称成员)。

第7章

结构体、共用体和枚举第1页/共58页3

结构体类型

定义结构体

定义结构体的一般格式为:struct结构体名{

成员列表

}变量名列表;

第7章

结构体、共用体和枚举第2页/共58页4说明:

结构体定义是以关键字struct开始的,结构体名应是有效的C++标识符。结构体中的每个成员都必须通过定义来确定成员名及其类型。例如:structstudent{intnum; //学号charname[20]; //姓名charsex; //性别intage; //年龄}student1;

第7章

结构体、共用体和枚举第3页/共58页5

其中,student是定义的结构体名,该结构体有四个成员变量num、name、sex、age。student1是定义的结构体变量。结构必须至少包含一个成员。

也可以在结构体定义后再定义结构体变量。

格式是:struct结构体名变量名列表;

第7章

结构体、共用体和枚举第4页/共58页6如:structstudent{intnum; //学号

charname[20]; //姓名

charsex; //性别

intage; //年龄};structstudentstudent1;或studentstudent1;

第7章

结构体、共用体和枚举第5页/共58页7结构体变量的初始化结构体变量的初始化就是在定义结构体变量的同时,为其成员提供初值,可采用以下两种方法:(1)在定义结构体类型的同时,为结构体变量初始化。

struct结构体名{成员列表

}变量名={初始值列表};

第7章

结构体、共用体和枚举第6页/共58页8如:structstudent{intnum; //学号

charname[20]; //姓名

charsex; //性别

intage; //年龄

}student1={9901,"wang",‘f’,23};

第7章

结构体、共用体和枚举第7页/共58页9(2)利用已有的结构体类型定义结构体变量,并同时初始化。格式是:结构体名称变量名={值1,值 2,……};如:student stu={1,”zhang”,’M’,20,90.0};此时,student1变量中的num成员的值为9901,name成员的值为"wang",sex成员的值为23。

第7章

结构体、共用体和枚举第8页/共58页10结构体变量的引用

定义了结构体变量以后,就可以在程序中使用这些变量。引用结构体变量时应注意:(1)不能将结构体变量作为一个整体来引用,只能引用结构体变量中的成员。引用结构体变量中成员的格式为:

结构体变量名.成员名

如:cout<<;此处的“.”是成员运算符,它的优先级别最高。

第7章

结构体、共用体和枚举第9页/共58页11结构体变量的引用

(2)若结构体的成员本身又是一个结构体变量,则要使用多个成员运算符,一级一级地找到最低一级的成员进行引用。如:

structBirthTime{intyear;intmonth;intday;};structStudent{charnum[20];//学号BirthTimebirth_day;//出生日期}stu1;

stu1.birth_day.month=10;

第7章

结构体、共用体和枚举第10页/共58页12结构体变量的引用

(3)对结构体成员变量的使用可像普通那样进行,如:进行赋值,参加运算等。如:students1,s2;s1.num=9901;s2.num=s1.num+1;

第7章

结构体、共用体和枚举第11页/共58页13结构体变量的引用

(4)可以将一个已有值的结构体变量的值直接赋给另外一个相同类型的结构体变量。方法是:

结构体变量名1=结构体变量名2;如:

studentst1={1,”zhang”,’M’,20,90.0};studentst2;st2=st1;

第7章

结构体、共用体和枚举第12页/共58页14结构体变量的引用

(5)可以引用成员的地址。也可以引用结构体变量的地址。如:&student.num&st1//Demo:

//结构体类型的应用--顺序表的逆置操作.cpp

第7章

结构体、共用体和枚举第13页/共58页15结构数组

结构数组:即数据类型为结构体类型的数组,这样,数组中的每个元素都属于同一种结构体类型,每一元素都分别包含了结构体中的每个成员。

第7章

结构体、共用体和枚举第14页/共58页16结构数组1.结构数组的定义structstudent{intnum;charname[20];intage;floatscore;charaddr[30];};studentstu[3];或者?

第7章

结构体、共用体和枚举第15页/共58页17结构数组

这就定义了一个结构数组stu,它已含三个元素,其中每个元素都为student类型,且每个数组元素都各自拥有自己的一套结构成员num、name、age、score和addr。

第7章

结构体、共用体和枚举第16页/共58页18

2.结构体数组的初始化

结构体数组在定义时也可以进行初始化。其初始化方法与一般数组的初始化方法基本相同,只是必须为每个元素提供各结构成员的值,如:

structstudent{intnum; charname[20]; charsex; intage;};studentstu[3]={{1,"sum1",‘M’,20},{2,"zhao2",‘M’,25},{3,"qian3",‘M’,21}};

第7章

结构体、共用体和枚举第17页/共58页19指向结构体类型的指针1.指向结构体变量的指针

结构体变量的指针:是指结构体变量所占内存单元的起始地址。因此,可以定义指针变量指向结构体变量。此时该指针变量的值就是结构体变量在内存中起始地址。

第7章

结构体、共用体和枚举第18页/共58页20指向结构体类型的指针【例】指向结构体变量的指针的使用。

#include"iostream"usingnamespacestd;voidmain(void){structstudent{//定义结构体类型studentlongintnum;charname[20];charsex;floatscore;};studentstu1;//定义结构体类型student的变量stu1student*p;//定义student类型的指针变量pp=&stu1;//将结构体变量stu1的地址赋给指针变量p

第7章

结构体、共用体和枚举第19页/共58页21stu1.num=1;//分别给结构体变量stu1的各成员赋值strcpy(,"lilin");stu1.sex='M';stu1.score=89;//输出stu1各成员的值cout<<stu1.num<<"\t"<<<<"\t"<<stu1.sex<<"\t"<<stu1.score<<endl;//借助指针变量p输出它所指向的结构体变量各成员的值cout<<(*p).num<<"\t"<<(*p).name<<"\t"<<(*p).sex<<"\t"<<(*p).score<<endl;cout<<p->num<<"\t"<<p->name<<"\t"<<p->sex<<"\t"<<p->score<<endl;}

第7章

结构体、共用体和枚举第20页/共58页22程序的运行结果:1lilinM891lilinM891lilinM89可见,三种访问结构体变量各成员的值的结果完全相同。说明:(1)上例中(*p).num也可写为p->num。(2)结构体取成员的运算可以采用以下三种形式:①结构体变量名.成员名②(*结构体指针变量名).成员名③结构体指针变量名->成员名

第7章

结构体、共用体和枚举第21页/共58页23指向结构体数组首元素的指针【例】指向结构体的指针的使用。#include<iostream>usingnamespacestd;structstudent{intnum;charname[20];charsex;intage;};studentstu[3]={{1,"lilin",'M',18},{2,"sum",'M',19},{3,"zhao",'M',20}};voidmain(void){

第7章

结构体、共用体和枚举第22页/共58页24指向结构体数组首元素的指针

student*p;for(p=stu;p<stu+3;p++)cout<<p->num<<"\t"<<p->name<<"\t"<<p->sex<<"\t"<<p->age<<endl;}程序的输出结果为:1lilin

M182sumM193zhaoM20

第7章

结构体、共用体和枚举第23页/共58页25指向结构体数组首元素的指针说明:把stu赋给指针变量p,就表示p指向了该数组的首元素(p的值为数组的起始地址)。p++表示p指向数组的下一个元素,利用这种方法可以访问数组中所有元素的值。//Demo:结构数组的应用例子//结构数组的应用举例--排序.cpp

第7章

结构体、共用体和枚举第24页/共58页26用结构体类型作为函数的参数1.用结构体类型的变量作函数的参数(传值)在C++语言中,允许把结构体类型的变量直接作为函数的参数,但要注意:此时主调函数的调用点上的实参与被调函数相应位置上的形参必须是相同的结构体类型,是将实参的值(各成员的值)传递给相应的形参。

第7章

结构体、共用体和枚举第25页/共58页27用结构体类型作为函数的参数【例】用结构体类型的变量作为函数的参数。

#include"iostream“usingnamespacestd;structstudent{intnum;charname[20];charsex;intage;};voidprint(students){cout<<s.num<<"\t"<<<<"\t"<<s.sex<<"\t“<<s.age<<"\t"<<endl;}

第7章

结构体、共用体和枚举第26页/共58页28

studentstu[3]={{1,"lilin",'M',18}, {2,"sum",'M',19}, {3,"zhao",'M',20}};voidmain(void){inti;for(i=0;i<3;i++)print(stu[i]);}程序的执行结果是:1lilinM182sumM193zhaoM20

第7章

结构体、共用体和枚举第27页/共58页29可见,当把一个结构体类型的变量作为函数的参数时,可以将该变量的值(包含结构体类型中各成员的值)传递给被调函数的形参。用指向结构体的指针作函数的参数(传指针)用指向结构体变量的指针作参数。这种方式同指针作为函数的参数的原理一致,传递的是结构体变量的地址(指针)。

第7章

结构体、共用体和枚举第28页/共58页30【例】用指针的方法实现上例程序的功能。

#include"iostream“usingnamespacestd;structstudent{intnum;charname[20];charsex;intage;};voidprint(student*);studentstu[3]={{1,"lilin",'M',18},{2,"sum",'M',19},{3,"zhao",'M',20}};voidmain(void){inti;for(i=0;i<3;i++)print(&stu[i]);}voidprint(student*s){cout<<s->num<<"\t"<<s->name<<"\t"<<s->sex<<"\t“<<s->age<<"\t"<<endl;}

第7章

结构体、共用体和枚举第29页/共58页31用结构体变量的引用作为函数的参数此时,被调函数的形参必须声明成引用形式,函数的形参作为实参的一个别名来使用,从而达到对实参操作的目的。【例】用结构体变量引用的方法实现例2-28程序的功能。#include"iostream"usingnamespacestd;structstudent{intnum;charname[20];charsex;intage;};

第7章

结构体、共用体和枚举第30页/共58页32voidprint(student&);studentstu[3]={{1,"lilin",'M',18},{2,"sum",'M',19},{3,"zhao",'M',20}};voidmain(void){inti;for(i=0;i<3;i++)print(stu[i]);}voidprint(student&s){cout<<s.num<<"\t"<<<<"\t"<<s.sex<<"\t"<<s.age<<"\t"<<endl;}

第7章

结构体、共用体和枚举第31页/共58页33返回结构体类型的函数1.返回结构类型值的函数的定义其定义格式如下:结构体名称函数名(形参及类型说明){

函数体}【例】定义一个返回结构体类型的函数,求所有同学中年龄最大的同学。

第7章

结构体、共用体和枚举第32页/共58页34#include"iostream"usingnamespacestd;structstudent{intnum;charname[20];charsex;intage;};studentmax(student*,int);studentstu[3]={{1,"lilin",'M',18},{2,"sum",'M',19},{3,"zhao",'M',20}};voidmain(void){studentmaxold=max(stu,3);cout<<maxold.num<<"\t"<<<<"\t“<<maxold.age<<endl;}

第7章

结构体、共用体和枚举第33页/共58页35studentmax(student*s,intn){inti,age1,index;age1=s->age;index=0;for(i=0;i<n;i++)if(age1<(s+i)->age){index=i;age1=(s+i)->age;}return(*(s+index));}

第7章

结构体、共用体和枚举第34页/共58页36返回结构的引用的函数与返回其它类型引用的函数的定义方法和原理一致,但注意不要返回一个局部变量的引用就可。

第7章

结构体、共用体和枚举第35页/共58页37结构的嵌套

C++语言中,允许定义一个结构体类型,该结构类型中可以包含另外一种结构类型的成员。如下例中定义了一个birthday结构体类型,它含有year、month、day三个成员;又定义了第二个结构体类型student,它含有num、sex和birth三个成员,其中birth成员是birthday结构体类型。structbirthday{intyear;intmonth;intday;};structstudent{intnum;charsex;birthdaybirth;};

第7章

结构体、共用体和枚举第36页/共58页38studentstu;//定义student结构体类型的变量stu

此时要访问stu的birth成员的值时,要注意使用多个“.”操作符。如:stu.birth.year=1980;注意:C++语言中,不能定义一个结构体类型,该结构类型中包含自身结构类型的成员。但可包含指向自身结构类型的指针。如可定义:structstudent{intnum;charname[20];floatscore;student*next;};

不可定义:structstudent{intnum;charname[20];floatscore;studentnext;};

第7章

结构体、共用体和枚举第37页/共58页39Demos:

单链表的定义及运算例.cpp单链表的交集.C单链表操作中指针作为函数参数的典型错误.cpp

第7章

结构体、共用体和枚举第38页/共58页40内容提要结构体类型及其使用共用体类型及其使用枚举类型及其使用类型定义typedef的使用

第7章

结构体、共用体和枚举第39页/共58页41共用体(联合体)类型1.共用体概念

有时需要使几中不同类型的变量放到同一段内存单元中,如:把一个int型变量,char型变量,float型变量放于同一地址开始的内存单元中,这三个变量在内存中占的字节数不同,但都从同一地址开始存放,也就是使用覆盖技术,几个变量相互覆盖,这种使几个不同的变量共一段内存的结构称为共用体类型的结构也叫联合。

第7章

结构体、共用体和枚举第40页/共58页422.共用体类型的定义其定义格式为:union共用体名{成员表}变量表;如:unionData{ inti;charch;floatf;}a,b,c;这表示定义了共用体类型Data,并同时定义了属于该种数据类型的变量a,b,c。

第7章

结构体、共用体和枚举第41页/共58页43

由此可见:其定义方式与结构的定义方式类似,但二者的含义不同,结构体变量所占内存空间的大小,是各成员所占的内存之和,每个成员分别占有自己的内存单元,而共用体变量所占的内存空间大小于等于占用内存空间最大的成员的长度,如上面定义的a,b,c三个共用体变量分别占4个字节。

第7章

结构体、共用体和枚举第42页/共58页44

3.共用体变量的定义(1)方法1:在定义共用体类型的同时定义该种类型的变量,如上例中的变量a、b、c就是在定义unionData类型的同时定义的共用体变量。(2)方法2:可以用已定义过的共用体数据类型,定义共用体变量。格式是:union共用体名称变量名表;如:unionDatamydata;

第7章

结构体、共用体和枚举第43页/共58页45

4.共用体变量的引用共用体变量的使用方法基本同结构体变量的使用方法,并同时注意以下原则:(1)不能直接使用共用体变量,而只能使用共用体变量的成员,共用体变量取成员的运算符同结构体变量取成员的运算符,即用“.”。如:对于上例定义的共用体变量a来说,可用以下方法引用其中的成员:a.i引用共用体变量a中的整型变量ia.ch引用共用体变量a中的字符变量cha.f引用共用体变量a中的浮点型变量f

第7章

结构体、共用体和枚举第44页/共58页46

(2)共用体类型的特点:共用体类型可以使用覆盖技术使几个不同类型的变量(成员)共同占用和使用一块内存空间,所以,在每一瞬时只有一个成员起作用,其他的成员不起作用。如:a.i=1;a.c=‘a’;a.f=2.1;之后,只有a.f是有效的,可以cout<<a.f;但不能cout<<a.c;

第7章

结构体、共用体和枚举第45页/共58页47

(3)不能对共用体变量名赋值,也不能定义时进行初始化。(4)不能把共用体变量作为函数参数,也不能使函数返回共用体变量,但可以使用指向共用体的指针。(5)共用体变量的地址和各成员的地址都是同一地址。如:&a&a.i,&a.f同一地址值。(6)允许定义共用体数组。

第7章

结构体、共用体和枚举第46页/共58页48

(6)共用体也可以没有名称,称为无名共用体。无名共用体没有标记名,只是声明一个成员项的集合,这些成员项具有相同的内存地址,可以由成员项的名字直接访问。如:union{inti;floatf;};在程序中可以这样使用:i=10;f=2.2;无名共用体通常作结构体的内嵌成员。Demo:共用体例1.cpp共用体例2.cpp

第7章

结构体、共用体和枚举第47页/共58页49内容提要结构体类型及其使用共用体类型及其使用枚举类型及其使用类型定义typedef的使用

第7章

结构体、共用体和枚举第48页/共58页50枚举类型1.枚举类型及其定义方法如果一个变量只有几种可能的取值时,就可以把它定义为枚举类型,所谓枚举就是指将某一变量所有可能的取值一一列举出来。枚举类型的定义格式是:

enum

枚举类型名{枚举元素表}枚举变量名;

第7章

结构体、共用体和枚举第49页/共58页51如:

enumweekday{sun,mon,tue,wed,thu,fri,sat}Workday;这表示定义了枚举类型Weekday,并同时定义了属于该种类型的变量workday,该变量的取值范围为sun~sat。其中sun~sat称为枚举元素,是Weekday枚举类型变量的所有可能取值。

第7章

结构体、共用体和枚举第50页/共58页522.枚举变量的定义(1)方法1:在定义枚举类型的同时定义该种类型的变量,如上例中的变量workday就是在定义enumWeekday类型的同时定义的枚举变量。(2)方法2:可以用已定义过的枚举数据类型,定义枚举变量。格式是:

enum

枚举名称变量名表;如:可以利用已有的枚举类型Weekday定义变量enumWeekdaymyworkday;

第7章

结构体、共用体和枚举第51页/共58页533.枚举变量的使用方法

(1)由于枚举类型中列出了该种类型变量的所有可能取值,所以可以将某一枚举元素赋给该种类型的变量,如:Workday=mon;是可以的。(2)在c++中,对枚举元素作常量处理,所以枚举元素不是变量,不能对它们赋值,如:sun=0;mon=1;不对。(3)枚举元素作为常量,它们是有值的,C++语言编译系统按定义时的顺序使它们的值为0,1,2……。如:enumWeekday{sun,mon,tue,wen,thu,fri,sat}workday;中,枚举元素sun的值为0,mon元素的值为1,……。如果有赋值语句workday=thu;则说明变量workday的值为4。

第7章

结构体、共用体和枚举第52页/共58页54(4)当需要改变枚举元素的默认值时,可以在定义枚举类型的同时在枚举元素的

温馨提示

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

评论

0/150

提交评论