第5章构造数据类型2.ppt
《第5章构造数据类型2.ppt》由会员分享,可在线阅读,更多相关《第5章构造数据类型2.ppt(98页珍藏版)》请在三一办公上搜索。
1、C+语言程序设计教程第11章C+输入输出流,第5章 构造数据类型,主讲:尚明生 电子科技大学计算机学院,第5章构造数据类型,1.掌握枚举类型的使用;2.深入理解数组的概念,掌握数组应用的一般方法;3.深入理解指针的概念,掌握指针的使用;4.注意指针与数组的区别,掌握多重指针以及指针与 数组的混合使用,合理应用动态数组;5.理解字符串的概念,能够灵活使用字符串;6.理解引用的概念,掌握引用型函数参数的用法;7.掌握结构与联合类型的使用,并注意二者的区别。,学习目标,C+语言程序设计教程 第5章构造数据类型,5.1 枚举类型,1.枚举类型的定义:“枚举”是指将变量所有可能的取值一一列举出来,变量的
2、取值只限于列举出来的常量。枚举类型的声明的一般形式如下:枚举类型名以及枚举常量为标识符,遵循标识符的取名规则。在定义一个枚举类型时,定义了多个常量,供枚举类型变量取值,称此常量为枚举常量。当没给各枚举常量指定值时,其值依次默认为0、1、2、;在定义枚举类型时,也可使用赋值另行指定枚举常量的值。,enum 枚举类型名 枚举常量1,枚举常量2,枚举常量n;,枚举!,C+语言程序设计教程 第5章构造数据类型,5.1 枚举类型,枚举类型的定义:例1:enum weekday SUN,MON,TUE,WED,THU,FRI,SAT;定义了7个枚举常量以及枚举类型weekday。枚举常量具有默认的整数与之
3、对应:SUN的值为0、MON的值为1、TUE为2、SAT为6。例2:enum city Beijing,Shanghai,Tianjin=5,Chongqing;枚举常量Beijing的值为0,Shanghai的值为1,Tianjin的值指定为5。对于指定值后面的没有指定值的枚举常量,编译器会将前一个常量值加1(下一个整数)赋给它,所以Chongqing的值为6。,C+语言程序设计教程 第5章构造数据类型,5.1 枚举类型,枚举类型的定义说明:枚举类型定义了以后就可以使用枚举常量、使用用枚举类型来定义变量,定义枚举变量的方法与定义其它变量的方法一样。例如:enum city city1,cit
4、y2;city city1,city2;用两种不同方法定义了city1、city2两个枚举类型的变量名。枚举类型变量也可以在定义枚举类型的同时定义 例如:enum city Beijing,Shanghai,Tianjin=5,Chongqing city1,city2;在定义枚举类型的同时定义枚举类型变量可以省略枚举类型名 例如:enum Beijing,Shanghai,Tianjin=5,Chongqing city1,city2;在定义变量时,可以顺便给出初值,若不给初值,默认初值为随机的无意义的数。,C+语言程序设计教程 第5章构造数据类型,5.1 枚举类型,枚举类型的使用:用枚举类
5、型建立枚举变量后就可以对枚举变量实施赋值以及进行其它运算了,对枚举变量进行赋值,其值要求为同一枚举类型。否则,在编译时出错。例如:weekday d1,d2,d3,d4;d1=SUN;d2=6;/错误 d3=Shanghai;/错误 其中对d2所赋之值是整数6,不是枚举常量;可以采用将一个整型值强制转换成同类型的枚举常量赋给枚举变量。枚举常量、枚举类型的变量可进行算术运算、关系运算。对枚举类型实施算术、关系运算时,枚举值转换成整型值参加运算,结果为整型值。所以,如果要将结果赋给枚举变量,还要将结果转换成枚举值。例如:d1=d1+2;/是错误的,因为结果为int型。需要将它强制转换成枚举型:d1
6、=(weekday)(d1+2);,C+语言程序设计教程 第5章构造数据类型,5.1 枚举类型,枚举类型的使用:枚举常量、枚举类型的变量可直接进行各种形式的关系运算。例如:if(city1=3);if(city2=Beijing);if(Shanghai=1);if(city1SUN);枚举类型变量不能直接进行输入 例如:cind1;/错误,C+语言程序设计教程 第4章函数,注意:枚举常量是常量,不是变量,所以不能对枚举常量进行赋值。例如:在上例中不能进行赋值 Shanghai=Beijing;枚举常量的值不是列举的字符串,其值为整数。编译器对赋给枚举变量的对象(数)进行类型检查,如类型不相符
7、则发出警告。当类型相 同,而值超出此类枚举类型枚举常量范围时,也是正常的。,枚举类型定义,C+语言程序设计教程 第5章构造数据类型,【例5-1】输入城市代号,输出城市名称。,5.1 枚举类型,运行结果:Input a city number(-1 to exit):1Shanghai8Invalid city number!-1,C+语言程序设计教程 第5章构造数据类型,枚举类型的使用,5.1 枚举类型,5.2 数组,数组:数组是一组在内存中依次连续存放的、具有同一类型的数据变量所组成的集合体。其中的每个变量称为数组元素,它们属于同一种数据类型,数组元素用数组名与带方括号的数组下标一起标识。数
8、组可以是一维的,也可以是多维的。特点:若干个同类型的数据元素,并且各个数据元素之间存在某种次序关系。这类数据有一个共同的特点:它们有若干个同类型的数据元素,并且各个数据元素之间存在某种次序关系。,C+语言程序设计教程 第5章构造数据类型,5.2.1 一维数组定义与使用,一维数组定义的一般形式为:说明:数组元素的类型可以是void型以外的任何一种基本数据类型,也可以是已经定义过的构造数据类型;数组名是用户自定义的标识符,用来表示数组的名称,代表数组元素在内存中的起始地址,是一个地址常量。常量表达式必须是unsigned int类型的正整数。表示数组的大小或长度,也就是数组所包含数据元素的个数。是
9、数组下标运算符,在数组定义时用来限定数组元素的个数。,数据类型 数组名常量表达式;,C+语言程序设计教程 第5章构造数据类型,注意:数组属于构造数据类型,在使用之前必须先进行类型定义。,5.2.1 一维数组定义与使用,数组元素的类型可以是void型以外的任何一种基本数据类型,也可以是已经定义过的构造数据类型;例如:下面定义了2个不同类型的数组:int a5;/定义了一个5个元素的整型数组a weekday b10;/定义了一个10个元素的枚举数组b,weekday 为已定义的枚举型。数据类型相同的多个数组可以在同一条语句中予以定义。例如:int a110,a220;/同时定义了两个整型数组 数
10、据类型相同的的简单变量和数组也可以在一个语句中定义。例如:int x,a20;/同时定义了一个整型变量和一个整型数组,C+语言程序设计教程 第5章构造数据类型,5.2.1 一维数组定义与使用,数组定义之后,系统会将从内存中为其分配一块连续的存储空间,从第1个数据元素开始依次存放各个数组元素。例如,定义的数组a其内存排列(分配)示意图如图5-1所示。例如:int a5;/定义了一个5个元素的整型数组a,C+语言程序设计教程 第5章构造数据类型,5.2.1 一维数组定义与使用,一维数组初始化:是指在定义数组的同时给数组中的元素赋值。其一般语法形式为:初值1,初值2,初值n称为初值表,初值之间用逗号
11、,分隔,所有初值用 括起来。初值可以是一个变量表达式,初值与数组元素的对应关系是:初值i给数组第i个元素;所以,初值个数n不能超过数组的大小。若初值表中初值个数(项数)小于数组的大小,则未指定值的数组元素被赋值为0;但初值表中项数不能为0。例如:weekday b10=MON,WED,FRI;当对全部数组元素赋初值时,可以省略数组的大小,此时数组的实际大小就是初值列表中初值的个数。例如:char str=a,b,c,d,e;/数组str的实际大小为5。在函数中定义数组时,如果没有给出初值表,数组不被初始化,其数组元素的值为随机值;在函数外定义数组如果没有初始化,其数组元素的值为0。数组初值表的
12、可以用一个逗号结尾,其效果与没有逗号一样。,数据类型 数组名 常量表达式=初值1,初值2,初值n;,C+语言程序设计教程 第5章构造数据类型,5.2.1 一维数组定义与使用,对一维数组实施的存取操作有两类:存取数组元素与读取数组元素的地址。数组元素是通过数组名及下标来标识的,这种带下标的数组元素也称为下标变量,下标变量可以象简单变量一样参与各种运算。存取一维数组元素的一般语法形式为:说明:下标表达式可以是变量表达式,用来标识数组元素;不同于数组定义时用来确定数组长度的常量表达式。当定义了一个长度为n的一维数组a,C+规定数组的下标从0开始,依次为0、1、2、3、n-1。对应的数组元素分别是a0
13、、a1、an-1,因此下标表达式的值要在0,n-1范围内。例如:a1+2=100;/将数组a的第4个元素赋值100。,数组名 下标表达式;,C+语言程序设计教程 第5章构造数据类型,5.2.1 一维数组定义与使用,【例5-2】学生成绩排序。分析:学生成绩由键盘输入,当输入一个负数时,输入完毕。采用直观的“选择排序法”进行排序,基本步骤如下:将a0依次与a1an-1比较,选出大者与a0交换;最后a0为 a0an-1中最大者;将a1依次与a2an-1比较,选出大者与a1交换;最后a1为 a1an-1中最大者;同理,从i=2到i=n-1,将ai依次与ai+1an-1比较,选出较大 者存于ai中。,C
14、+语言程序设计教程 第5章构造数据类型,数组定义,数组使用,C+语言程序设计教程 第5章构造数据类型,运行结果:80 90 95 70-195 90 80 70,C+语言程序设计教程 第5章构造数据类型,5.2.1 一维数组定义与使用,4.数组的地址 数组元素的地址通过数组名来读取,其格式如下:由于其地址不是实际的地址值,称这个地址表达式为符号地址表达式。例如:一维数组元素a5的符号地址表达式为a+5。若a是一个int型数组,数组的符号地址表达式a+n所表达的地址是第n+1个元素an的地址,代表的实际地址值为:a+n*sizeof(int)而不是:a+n。,C+语言程序设计教程 第5章构造数据
15、类型,数组名+整型表达式;,5.2.1 一维数组定义与使用,C+语言程序设计教程 第5章构造数据类型,使用数组要注意:在使用数组时最常犯的错误是数组元素越界,包括上标越界和下标越界。上标越界是指数组元素的访问地址值超过了数组的起始地址;下标越界是指数组元素的访问地址越过了数组中最后一个数组元素的地址。对于这种错误,编译器无法知道,往往在运行时出错。因此在程序设计时应格外注意。数组名是一个地址常量,不能作为左值(赋值的目标)。因此,不能将一个数组整体拷贝给另外一个数组。例如:int a5,c5,i;a=c;/错误!正确的方法是将对应的元素进行拷贝,见下列程序段:for(i=0;i5;i+)ai=
16、ci;/将数组c中元素的值拷贝到数组c的对应元素中在函数中,可以将一个一维数组作为函数的形式参数,用来接受一个一维数组传递过来的地址。,5.2.2 二维数组的定义与使用,二维数组的定义的一般形式为:其中:常量表达式1为第1维的元素的个数,常量表达式2为第2维元素的个数。二维数组amn是以长度为n的一维数组为元素的数组,因此,等价于如下定义方式:例如:int M23;定义了一个整型二维数组M,数组M也可以用下列方式定义:typedef int M13;/定义了一个一维整型数组M1;M1 M2;/以M1为类型定义数组M,数据类型 数组名常量表达式2常量表达式1;,C+语言程序设计教程 第5章构造数
17、据类型,typedef 数据类型 一维数组名常量表达式1;一维数组名 二维数组名常量表达式2;,5.2.2 二维数组的定义与使用,如果一维数组描述排列成一行的数据,那么,二维数组则描述若干行这样的数据。因此,二维数组可以看作是数学上的一个矩阵。第1维元素个数为矩阵的列数,第2维元素个数为矩阵的行数。二维数组的定义格式可以写成:定义一个二维数组后,系统为它分配一块连续的内存空间。二维数组amn占内存空间的计算公式为:,数据类型 数组名行数列数;,C+语言程序设计教程 第5章构造数据类型,sizeof(数组名);或 m*sizeof(a0);或 m*n*sizeof(数据类型),5.2.2 二维数
18、组的定义与使用,既然一个二维数组是由若干个一维数组排列构成,二维数组在内存中的排列顺序为:先顺序排列每个一维元素,构成一维数组;再将各个一维数组顺序排列,构成二维数组。int M23的排列顺序为:先将3个int元素排列组成2个一维数组M0,M1。M0:M00,M01,M02 M1:M10,M11,M12 再将2个一维数组排成一个二维数组。M:M0,M1 数组M在内存中的排列图如图所示。,C+语言程序设计教程 第5章构造数据类型,5.2.2 二维数组的定义与使用,二维数组的初始化:其中初值表具有两种形式:嵌套的初值表,线性初值表。(1)嵌套初值表以二维数组Mmn为例,嵌套初值表的格式为:嵌套初值
19、表由一维初值表嵌套构成,各层构成规则与一维数组的初值表相同。例如:int M34=1,2,3,4,3,4,5,6,5,6,7,8;/M数组元素被全部初始化 int a23=1,0,0,1;/初始化了部分数组元素 int b3=1,2,3,;/初始化了全部数组元素 int d3=1,3,5,5,7,9;/初始化了全部数组元素,省略了高维元素个数,数据类型 数组名 常量表达式2常量表达式1=初值表;,C+语言程序设计教程 第5章构造数据类型,M的初值表=M0初值表,M1初值表,Mm-1初值表Mi初值表=Mi0初值表,Mi1初值表,Min-1初值表;i从0到m-1;,5.2.2 二维数组的定义与使用
20、,(2)线形初值表 线形初值表与一维数组的初值表相同,初值表的项数不超过各维元素个数的乘积(总元素个数)。数组元素按内存排列顺序依次从初值表中取值,下列各数组使用了线形初值表,结果与使用嵌套初值表相同。例如:int M34=1,2,3,4,3,4,5,6,5,6,7,8;/M数组元素被全部初始化 int a23=1,0,0,0,1,1;/初始化了全部数组元素,一部分元素未给初值 int b 3=1,0,0,0,0,0;/初始化了全部数组元素,省略了高维元素个数 当使用线形初值表而省略高维元素个数时,高维元素个数为:例如:int b 3=1,0,0,0;/高维元素个数为2,C+语言程序设计教程
21、第5章构造数据类型,向上取整数(线形初值表项数/低维元素个数),5.2.2 二维数组的定义与使用,(3)二维数组的存取 存取维数组元素的格式为:说明:行下标表达式与列下标表达式的值同样从0开始,aij表示数组的第i+1行、第j+1列的元素。由于数组元素是变量,可以对其进行各种各种操作。数组元素如果定义数组amn,即数组第1维大小为n,第2维大小为m。aij的排列位置与在内存中的地址计算公式如下:例如:a,a0:为数组a的起始地址,即a00的地址;ai+j:为数组的第i+1行的第j+1元素的地址,即aij的地址;,C+语言程序设计教程 第5章构造数据类型,数组名 行下标表达式 列下标表达式,ai
22、j的排列位置=第1维大小n*i+j+1;aij的地址=a的起始地址+(第1维大小n*i+j)*sizeof(数据类型),二维数组定义并初始化,二维数组使用,C+语言程序设计教程 第5章构造数据类型,运行结果:70 71 72 73 7482 83 84 85 8692 93 94 95 96-1 0 0 0 070 71 72 73 74 36082 83 84 85 86 42092 93 94 95 96 470-81.3333 82.3333 83.3333 84.3333 85.3333 416.667,C+语言程序设计教程 第5章构造数据类型,5.2.3 多维数组,(1)三维以及高于
23、三维的数组称为多维数组 多维数组的定义与二维数组类似,可以一次定义,也可以逐步由低维数组定义。例如:int b234;/定义了一个三维数组 也可用下列方式步定义:typedef int B134;B1 b2;多维数组在内存的排列方式同样是先排低维数组,由低向高依次排列。如:b234的排列顺序为:b00:b000,b001,b002,b003 b0 b01:b010,b011,b012,b013b b02:b020,b021,b022,b023 b10:b100,b101,b102,b103 b1 b11:b110,b111,b112,b113 b12:b120,b121,b122,b123,C
24、+语言程序设计教程 第5章构造数据类型,5.2.3 多维数组,(2)多维数组的初始化与存取多维数组的初始化形式与二维数组类似:有嵌套初值表、线性初值表两种形式。使用线性初值表初始化时,数组元素按内存排列顺序依次从初值表中取值。对多维数组进行存取包括对数组元素的存取和对数组元素的地址的读取,当一个多维数组的下标数与维数相同时,为对数组元素的存取。当下标个数小于维数时表示的是一个地址,表示地址时,下标也不能越界。如:下列都是b234的地址表达式。b1;/b100的地址;b2;/错误,下标越界;b0+1;/与b01相同,b010的地址。b12;/b120的地址 b12+4;/b124的地址,但数组b
25、中没有b124这个元素,故指向了其它地方。,C+语言程序设计教程 第5章构造数据类型,C+语言程序设计教程 第5章构造数据类型,运行结果:Add of b:&b=0012FEF0 b=0012FEF0&b000=0012FEF0Add of bk:&bk=0012FF40 bk=0012FF40 b+k=0012FF40&b0+k=0012FF40&bk00=0012FF40Add of bkm:&bkm=0012FF5E bkm=0012FF5E bk+m=0012FF5E&b00+k*M+m=0012FF5E&bkm0=0012FF5E&b00+(k*sizeof(b0)/sizeof(b
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 构造 数据类型
链接地址:https://www.31ppt.com/p-5954100.html