C 语言程序设计(第2版)第七章_第1页
C 语言程序设计(第2版)第七章_第2页
C 语言程序设计(第2版)第七章_第3页
C 语言程序设计(第2版)第七章_第4页
C 语言程序设计(第2版)第七章_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

第七章结构体、共用体和枚举

第一节一个典型的实际问题

第二节结构体数组与函数

第三节共用体数据类型

第四节枚举数据类型第五节进阶部分知识

陈孟建邹玉金熊传光编著电子工业出版社出版第一节一个典型的实际问题一、学生档案数据类型1.结构体数据类型假设某一个班级的学生档案如表7-1所示。从表7-1中可知,学生成绩档案表数据是由以下几种类型组成的:姓名(Name):字符数组类型name[20];性别(Sex):字符型数据类型char;学号(No):数值型数据类型int;年龄(Age):数值型数据类型int;成绩(score):数值型数据类型float;地址(Addr):字符数组类型sddr[30]。陈孟建邹玉金熊传光编著电子工业出版社出版表中的任何一行表示某学生的一条完整的信息资料,它是由姓名、性别、学号、年龄、总分成绩和地址构成的。在C语言中表示这样的一组信息资料时,可以采用结构体(Structure)数据类型来描述它,它相当于其他高级语言中的“记录”概念。记录是由若干个数据项构成的,每条记录包含着一个完整的信息资源。数据项中可以由不同的数据类型构成,记录在整张表格中是唯一的,它可以任意调换位置,但不可以有重复的记录出现。陈孟建邹玉金熊传光编著电子工业出版社出版使用C语言来定义一个结构体数据类型,如下所示:

structstudent{charname[20];charsex;

intNo;

intage;floatscore;charaddr[30];};其中:(1)struct是关键字;(2)student是用户自己定义的结构体类型变量名;(3)name[20]、sex、No、age、score、addr[30]是结构体类型中的数据项,具有不同类型的数据。陈孟建邹玉金熊传光编著电子工业出版社出版2.结构体数据模式定义格式定义一个结构体数据模式的一般格式为:struct<结构体名>{<数据项列表(或成员说明列表)>};在花括号内是该结构体中的各个数据项的具体内容,要求对该结构的所有的数据项的类型进行说明,结构数据项类型包含C语言中所有允许的变量类型,例如,int型、float型、char型、数组、指针等等,所有的数据项组成了一个结构体。陈孟建邹玉金熊传光编著电子工业出版社出版二、定义结构体类型变量的方法在C语言中,可以采用以下几种方法来定义一个结构体类型变量:1.先定义结构再定义变量名上面已定义了一个学生成绩档案结构体数据类型structstudent,可以用它来定义变量。例如:

structstudentstu1,stu2;

定义了stu1和stu2为structstudent类型的变量,即它们具有structstudent类型相同的结构,如图7-1所示。陈孟建邹玉金熊传光编著电子工业出版社出版变量stu1和stu2与标准类型变量定义的不同之处在于:变量stu1和stu2不仅要求指定变量为结构体类型,而且要求指定为某一个特定的结构体类型,不能只指定为“struct”型而不指定结构体名。而在定义变量为整型时,只需指定为int型即可。为了方便,在C语言中可以使用一个符号常来代表一个结构体类型。即在程序的开头,用以下语句:

#defineSTUDENTstructstudent这样在程序中,STUDENT与structstudent完全等效。即

STUDENT{charname[20];charsex;

intNo;

intage;floatscore;charaddr[30];};以后,可以直接使用STUDENT定义变量,例如:

STUDENTstu1,stu2;定义的结果与以前定义的相同。陈孟建邹玉金熊传光编著电子工业出版社出版2.在定义类型的同时定义变量在定义结构体数据类型时的同时来定义变量,其格式如下所示:

struct<结构体名>{<数据项列表>}

变量名列表;例如:

structstudent{charname[20];charsex;intNo;intage;floatscore;charaddr[30];}stu1,stu2;以上同样定义了两个structstudent类型的变量stu1和stu2,这样stu1和stu2变量的类型就是结构体类型了,它可以用来赋一组数据的值,即赋一条记录的数据。要注意的是,变量名列表中的变量,须用逗号进行分隔。陈孟建邹玉金熊传光编著电子工业出版社出版3.注意事项(1)结构体类型与结构体变量是不同的概念,不要混同。对结构体变量来说,在定义时一般先定义一个结构体类型,再定义结构体变量。(2)结构体变量可以用来进行运算、赋值,而结构体类型则不能进行运算,也不能对其进行赋值操作。(3)以结构体中的数据项,可以单独使用,它的作用与地位相当于普通变量。(4)数据项本身也可以是一个结构体变量。例如:(5)数据项名可以与程序中的变量名相同,二者不代表同一对象。例如,程序中可以另定义一个变量age,它与structstudent中的age虽然是相同的名字,但意义却是不同的。(6)结构体类型并非只能有一种,而可以有千千万万种,这是与基本类型所不同的。因此,结构体类型是由用户根据需要自己设计定义的。(7)定义一个结构体类型,并不意味着系统分配一段内存单元来存放数据项成员,只有定义了变量后才有可能分配内存单元。系统没有预先定义结构体类型,凡需使用结构体类型数据的,都必须在程序中自己定义。陈孟建邹玉金熊传光编著电子工业出版社出版三、结构体变量的初始化结构体变量定义后,需要将其具体的数据赋值并进行初始化工作,在编译时就将它们赋给变量中相应的数据项成员,其格式如下:结构体变量名={表达式列表};四、结构体变量的引用1.引用结构体变量中的一个成员我们知道一个结构体变量是一个整体,要访问它其中的一个数据项成员,必须先找到这个结构体变量,然后,再从中找出它其中的一个数据项成员。例如,要访问stu1变量中的age,应写成如下的形式:

stu1.age其中stu1为结构体变量名,“.”为数据项成员运算符,整个表达式表示要找查结构变量stu1中的age数据项成员的值。假设,stu1.age=18,则表示将18赋值给stu1结构体变量中的age数据项成员。陈孟建邹玉金熊传光编著电子工业出版社出版2.引用结构体变量中的全部成员可以将一个结构体变量作为一个整体赋给另一个具有相同类型的结构体变量。两个结构体数据具有相同类型,即它们被同一个结构类型标识符说明或在同一个说明语句中定义。C语言允许两个同类型的结构体变量之间进行相互赋值。在执行了“stu2=stu1”语句后,系统将stu1变量中各个数据项成员逐个赋给stu2中相应的各个数据项成员。显然,这两个结构体变量的类型必须相一致才行。也可以把一个结构体变量中的内嵌结构体类型数据项成员赋给另一个结构体变量的相应部分。陈孟建邹玉金熊传光编著电子工业出版社出版第二节结构体数组与函数一、结构体数组定义从以上几个例子可以看出,一个结构体变量只能存放一个对象(例如,一个学生、一个职工等)的一组数据,即只能存放一条记录的数据。在实际问题上,经常需要存放若干个组的数据,例如,一个班级有若干个学生,一个单位有若干个职工等。要解决这样的问题,可以使用以下介绍的结构体数组。定义一个结构体数组可以有以下几种方法:1.先定义结构再定义数组我们仍以学生成绩为例:

structstudent{charname[9];

intNo;

intage;

intscore;};structstudentstu1[30]

以上定义了一个结构体数组stu1,它有30个元素,每一个元素都是structstudent类型的,这个数组在内存中占连续的一段存储单元。如图7-2所示。陈孟建邹玉金熊传光编著电子工业出版社出版2.在定义类型的同时定义数组在定义结构体数据类型时的同时来定义数组,其格式如下所示:

struct<结构体名>{<数据项列表>}

数组变量名列表;例如:

structstudent{charname[20];charsex;intNo;intage;floatscore;charaddr[30];}stu1[30],stu2[28];以上同样定义了两个structstudent类型的数组变量stu1和stu2,这样stu1和stu2数组变量的类型就是结构体类型了,它可以用来赋若干个一组数据的值,即赋多条记录的数据。要注意的是,数组变量名列表中的变量,须用逗号进行分隔。陈孟建邹玉金熊传光编著电子工业出版社出版二、结构体数组的初始化结构体数组变量定义后,需要将其具体的数据赋值并进行初始化工作,在编译时就将它们赋给数组变量中相应的数据项成员,其格式如下:结构体数组变量名={表达式列表};三、结构体数组的引用1.引用结构体数组变量中的一个成员我们知道一个结构体数组变量是一个整体,要访问它其中的一个数据项成员,必须先找到这个结构体变量,然后,再从中找出它其中的一个数据项成员。例如,要访问stu1[i]数组变量中的score,应写成如下的形式:

stu1[i].score其中stu1[i]为结构体数组变量名,当i的值为2时,即stu1[2].score的值是98。也就是结构体数组stu1中的第二个元素的score数据项值。陈孟建邹玉金熊传光编著电子工业出版社出版2.结构体数组元素赋值可以将一个结构体数组元素赋值给同一个结构体类型的数组中另一个元素,或赋给同一类型的变量。例如:

structstudent{charname[15];

intNo;

intage;

intscore[5];

inttot;}stu1[5],temp;以上程序定义了一个结构体数组stu1,它有5个元素,同时又定义了另一个结构体变量temp,则以下的几个语句是合法的。temp=stu1[1];stu1[1]=stu1[2];stu1[1]=temp;陈孟建邹玉金熊传光编著电子工业出版社出版3.结构体数组元素输入或输出不能把结构体数组元素作为一个整体直接进行输入或输出操作。例如:

scanf("%d",&stu1[i]);printf(“%d”,stu1[i]);若需要输入或输出结构体数组元素,则须使用以下的语句:

scanf("%s%d%d",&stu1[i].name,&stu1[i].No,&stu1[i].age);

printf("%s%d%d",stu1[i].name,stu1[i].No,stu1[i].age);陈孟建邹玉金熊传光编著电子工业出版社出版归结如下:(1)数组作为结构体成员,以上例子中name[3]数组便是一个成员。(2)静态的结构体数组可以赋初值,从初值表中可以清楚地看出,给数组的12个元素赋值,每个数组元素都是一个结构体变量,实际上是对12个结构体变量赋值,每个结构体变量中有两个成员,其中有一个成员是char型数组name[3],又用初始表给这个结构体成员数组的各个元素赋值,从而看出了结构体数组的元素与结构体成员的数组元素间的关系,它们是包含的关系。(3)结构体变量的成员作为函数的参数,在printf()函数中,其中4个参数都是以结构体变量的成员的形式出现的。(4)本例中结构体成员name[3]是字符数组,从赋值后知,它不是字符串,因此,在输出它的内容时,没有采用字符串的格式输出,而是用输出字符的格式逐一输出。陈孟建邹玉金熊传光编著电子工业出版社出版四、结构体变量作函数参数结构体类型的变量可以作为函数的形参,调用时C语言直接将实参结构体变量的各个数据成员的值全部复制给形参的结构体变量,C语言要求实参结构体变量的类型与形参结构体变量的类型完全一致。陈孟建邹玉金熊传光编著电子工业出版社出版第三节共用体数据类型共用体数据类型与结构体数据类型一样也是一种构造型的数据类型。共用体数据类型在定义上与结构体十分相似,但在实际应用上没有结构体那样普遍。在学习过程中与结构体进行类比,只要注意其区别就可以了。一、共用体的定义共用体数据类型是指将不同的数据项存放在同一段内存单元的一种构造型的数据类型,它与结构体相似,先有共用体模式,再定义具有某种模式的共用体变量,具体的格式如下所示:union<共用体名>{<共用体成员列表说明>;};陈孟建邹玉金熊传光编著电子工业出版社出版其中:(1)“union”是定义共用体的关键字;(2)“共用体名”是共用体的名称,其规则与结构体名一样;(3)“共用体成员列表说明”是指将共用体中的所有成员的数据类型逐一说明。例如:unionexam{inta;floatb;charc;}x;以上程序定义了一个共用体数据类型unionexam,一个共用体变量x。共用体定义的形式和结构体的形式很相似,但它们二者的概念是不同的。共用体变量中的各个成员共占内存中同一段空间如图7-4所示。陈孟建邹玉金熊传光编著电子工业出版社出版二、共用体变量的定义共用体变量的定义与结构体变量的定义相似,即:1.先定义共用体再定义变量名union<共用体名>{<共用体成员列表说明>;};

union<共用体名><共用体变量名表>;例如:unionexam{inta;floatb;charc;};unionexamx,y;上面定义了x,y两个共用体变量,它们具有inta、floatb、charc三个成员,分别为整型a、实型b和字符型c。陈孟建邹玉金熊传光编著电子工业出版社出版2.在定义类型的同时定义变量在定义共用体数据类型时的同时来定义变量,其格式如下所示:

union<共用体名>{<共用体成员列表说明>;

}

共用体变量名列表;例如:unionexam{inta;floatb;charc;}x,y;以上同样定义了x,y两个共用体数据类型的变量,这样x和y变量的类型就是共用体类型了,它可以用来赋一组数据的值,即赋一条记录的数据。要注意的是,变量名列表中的变量,须用逗号进行分隔。陈孟建邹玉金熊传光编著电子工业出版社出版3.不定义类型名而直接定义变量在定义共用体变量中,可以不定义类型名而直接定义变量名,其格式如下:

union{<共用体成员列表说明>;

}

共用体变量名列表;例如:union{inta;floatb;charc;}x,y;以上同样也可定义x,y两个共用体数据类型的变量。它们的功能和使用范围与前相同。陈孟建邹玉金熊传光编著电子工业出版社出版三、共用体变量的引用共用体变量的成员表示方法与结构体变量成员的表示方法相同,即用“.”表示。例如:x.a,y.b,x.c等都是合法的引用方法。但要注意的是,一个共用体变量不是同时存放多个成员的值,而只能存放其中的一个值,不能用多个值赋给多个成员,这一点与结构体不同,这是因为共占内存的原因。例如:unionexam{inta;floatb;charc;}x,y;

x.a=3;

x.b=4.5;

x.c=’A';}陈孟建邹玉金熊传光编著电子工业出版社出版四、共用体变量的应用使用共用体数据类型变量可以有以下两方面的作用:(1)在数据处理问题中,常用一个数据域存放不同的对象。例如,在一个学校的人员数据管理应用程序中,对“教师”则应登记“单位”,对“学生”则应登记“班级”,它们都是在同一栏目中。(2)便于不同类型间的转换。例如,将一段内存空间中的内容拆分成几部分使用。陈孟建邹玉金熊传光编著电子工业出版社出版第四节枚举数据类型枚举数据类型与结构体数据类型一样也是一种构造型的数据类型。枚举数据类型在形式上与结构体有相似之处,但在实质上却完全不同。所谓“枚举”数据类型,指的是这种类型的变量的值是指定的若干个名字之一。一、枚举的定义枚举是一个有名字的整型常量的有序集合,具有枚举类型的变量的值只能取相应集合中的某一个值。枚举定义的格式如下:enum<枚举名>{<枚举表>};其中:(1)“enum”是定义枚举的关键字;(2)“枚举名”是枚举的名称,其规则与结构体名一样;(3)“枚举表”是由若干个称为枚举符的元素组成的,枚举符之间由逗号分隔。枚举表中内容由程序设计者自己指定的,命名规则与标识符相同。陈孟建邹玉金熊传光编著电子工业出版社出版例如:enumweekday{sun,mon,tue,wed,thu,fri,sat};以上程序定义了一个枚举数据类型enumweekday,在该枚举数据类型中有以下枚举表:sun表示星期日、mon表示星期一、tue表示星期二、wed表示星期三、thu表示星期四、fri表示星期五、sat星期六。如果我们定义一个变量为该枚举类型,则该变量的值只能取以上数据中的某一个,即取某一星期中的某一天。陈孟建邹玉金熊传光编著电子工业出版社出版二、枚举变量的定义枚举变量的定义与结构体变量的定义相似,即:1.先定义枚举再定义变量名enum<枚举名>{<枚举表>};

enum<枚举名><枚举变量名表>;例如:enumweekday{sun,mon,tue,wed,thu,fri,sat};enumweekdayd1,d2;上面定义了d1,d2两个枚举变量,它们具有sun,mon,tue,wed,thu,fri,sat

七个成员,在使用时只能取以上七个成员中的任意一个。陈孟建邹玉金熊传光编著电子工业出版社出版2.在定义类型的同时定义变量在定义枚举数据类型时的同时来定义变量,其格式如下所示:

enum<枚举名>{<枚举表>}<枚举变量名列表>;例如:enum

monthday

{january,february,march,april,may,june,july,august,september,october,november,december}moth1,moth2;以上同样定义了moth1,moth2两个枚举数据类型的变量,这样moth1和moth2变量的类型就是共用体类型了,它可以用来赋一个数据的值。陈孟建邹玉金熊传光编著电子工业出版社出版3.不定义类型名而直接定义变量在定义枚举变量中,可以不定义类型名而直接定义变量名,其格式如下:

enum

{<枚举表>};枚举变量名列表;例如:enum

{red,yellow,blue,white,black}color1,color2;以上同样也可定义color1和color2两个枚举数据类型的变量。它们的功能和使用范围与前相同。陈孟建邹玉金熊传光编著电子工业出版社出版三、枚举变量的引用枚举变量定义后又可以直接引用了,例如:enum

monthday

{january=1,february,march,april,may,june,july,august,september,october,november=11,december}moth1,moth2;moth1=june;moth2=july;以上程序定义了枚举变量moth1和moth2,并分别赋给它们june和july两个值。这两个值是以上枚举列表中的一个值。陈孟建邹玉金熊传光编著电子工业出版社出版在使用时应注意以下几点:(1)在定义枚举数据类型时,枚举表中的标识符并无固定的含义,只是一个符号。程序设计者仅仅是为了使程序可读性提高才使用这些标识符的。这些标识符不是变量,不能改变其值。例如,以上程序中的january、february、march……不是变量,不能使用以下语句:january=13;scanf(“%s”,january);(2)它的值是一些整数,从花括号中第一个名字开始,各名字分别代表1,2,3,4,5,6,7,8,9,10,11,12。这是系统自动赋给的,例如:printf(“%d”,may);输出的值是5。但是在定义枚举数据类型时不能写成:enum

monthday{1,2,3,4,5,6,7,8,9,10,11,12};必须使用符号january,february,march……,或其它的标识符。这些符号称为枚举常量,或称枚举元素。陈孟建邹玉金熊传光编著电子工业出版社出版(3)可以在定义枚举数据类型时对枚举常量进行初始化,例如:

enum

monthday{january=1,february,march,april,may,june,july,august,september,october,november=11,december};定义january=1,以后顺序加1,november=11,december=12。也就是相当于定义了:january=1,february=2,march=3,april=4,may=5,june=6,july=7,august=8,september=9,october=10,november=11,december=12。(4)枚举常量可以用来进

温馨提示

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

评论

0/150

提交评论