版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第5章章 构造数据类型构造数据类型C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型第第5章构造数据类型章构造数据类型1. 掌握枚举类型的使用;2. 深入理解数组的概念, 掌握数组应用的一般方法;3. 深入理解指针的概念,掌握指针的使用;4. 注意指针与数组的区别,会使用多重指针以及指针与数组的多种混合体,会分配动态数组;5. 理解字符串的概念,会使用字符串;6. 理解引用的概念,掌握引用型函数参数的用法;7. 掌握结构类型的使用。学习目标 C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型5.1 枚举类型枚举类型 1. 枚举类型的定义:枚举类型的
2、定义: “枚举是指将变量所有可能的取值一一列举出来,变枚举是指将变量所有可能的取值一一列举出来,变量的取值只限于列举出来的常量。量的取值只限于列举出来的常量。 枚举类型的声明的一般形式如下枚举类型的声明的一般形式如下 :枚举类型名以及枚举常量为标识符,遵循标识符的取名规则枚举类型名以及枚举常量为标识符,遵循标识符的取名规则。在定义一个枚举类型时,定义了多个常量,供枚举类型变量在定义一个枚举类型时,定义了多个常量,供枚举类型变量取值,称此常量为枚举常量。当没给各枚举常量指定值时取值,称此常量为枚举常量。当没给各枚举常量指定值时,其值依次默认为,其值依次默认为0、1、2、;在定义枚举类型时,也;在
3、定义枚举类型时,也可使用赋值号另行指定枚举常量的值。可使用赋值号另行指定枚举常量的值。 enum 枚举类型名 枚举常量1, 枚举常量2, 枚举常量n;枚举!枚举!C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型枚举类型的定义:枚举类型的定义:例例1: enum weekday SUN, MON, TUE, WED, THU, FRI, SAT ; 定义了定义了7个枚举常量以及枚举类型个枚举常量以及枚举类型weekday。枚举。枚举常量具有默认的整数与之对应:常量具有默认的整数与之对应:SUN的值为的值为0、MON的值为的值为1、TUE为为2、SAT为为6。例例2: en
4、um city Beijing,Shanghai,Tianjin=5,Chongqing; 枚举常量枚举常量Beijing的值为的值为0,Shanghai的值为的值为1,Tianjin的值指定为的值指定为5。对于指定值后面的没有指定。对于指定值后面的没有指定值的枚举常量,编译器会将前一个常量值加值的枚举常量,编译器会将前一个常量值加1(下一下一个整数个整数)赋给它,所以赋给它,所以Chongqing的值为的值为6。C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型枚举类型的定义说明枚举类型的定义说明:枚举类型定义了以后就可以使用枚举常量、枚举类型枚举类型定义了以后就可以使
5、用枚举常量、枚举类型来定义变量,定义枚举变量的方法与定义其它变量来定义变量,定义枚举变量的方法与定义其它变量的方法一样。的方法一样。 enum city city1, city2; city city1, city2; 用两种方法定义了用两种方法定义了city1、city2两个枚举类型的变两个枚举类型的变量名。量名。枚举类型变量也可以在定义枚举类型的同时定义枚举类型变量也可以在定义枚举类型的同时定义 enum city Beijing,Shanghai,Tianjin=5,Chongqing city1, city2; 在定义枚举类型的同时定义枚举类型变量可以省略枚在定义枚举类型的同时定义枚举
6、类型变量可以省略枚举类型名举类型名 enum Beijing,Shanghai,Tianjin=5,Chongqing city1, city2; 在定义变量时,可以顺便给出初值,若不给初值,在定义变量时,可以顺便给出初值,若不给初值,默认初值为随机的无意义的数。默认初值为随机的无意义的数。 C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型枚举类型的使用:枚举类型的使用:用枚举类型建立枚举变量后就可以对枚举变量实施用枚举类型建立枚举变量后就可以对枚举变量实施赋值以及进行其它运算了,对枚举变量进行赋值赋值以及进行其它运算了,对枚举变量进行赋值,其值要求为同一枚举类型。否则
7、,在编译时出,其值要求为同一枚举类型。否则,在编译时出错。错。 weekday d1,d2,d3,d4; d1=SUN; d2=6; /错误错误 d3=Shanghai; /错误错误 其中对其中对d2所赋之值是整数所赋之值是整数6,不是枚举常量;可,不是枚举常量;可以采用将一个整型值强制转换成同类型的枚举常以采用将一个整型值强制转换成同类型的枚举常量赋给枚举变量:量赋给枚举变量: d2=(weekday)6;枚举常量、枚举类型的变量可进行算术运算、关系枚举常量、枚举类型的变量可进行算术运算、关系运算。运算。 对枚举类型实施算术、关系运算时,枚举值对枚举类型实施算术、关系运算时,枚举值转换成整型
8、值参加运算,结果为整型值。所以,转换成整型值参加运算,结果为整型值。所以,如果要将结果赋给枚举变量,还要将结果转换成如果要将结果赋给枚举变量,还要将结果转换成枚举值。枚举值。 d1=d1+2; /是错误的,因为结果为是错误的,因为结果为int型。型。 需要将它强制转换成枚举型:需要将它强制转换成枚举型: d1=(weekday)(d1+2);C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型/* 程序名:p5_1.cpp * 功能: 枚举类型的使用,输入城市代号,输出城市名称 */#includeusing namespace std;enum city Beijing,
9、Shanghai,Tianjin=6,Chongqing;void main() int n; coutInput a city number (Beijing-1 to exit):n;123456789101112C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型【例【例5-1】输入城市代号,输出城市名称。】输入城市代号,输出城市名称。 while(n=Beijing) switch(n) case Beijing: coutBeijingendl; break; case Shanghai: coutShanghaiendl;break; case Tianjin:
10、 coutTianjinendl; break; case Chongqing: coutChongqingendl; break; default: coutInvalid city number! n; 1314151617181920212223C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型5.2 数组数组 数组:数组: 数组是一组在内存中依次连续存放的、具有数组是一组在内存中依次连续存放的、具有同一类型的数据变量所组成的集合体。其中的每同一类型的数据变量所组成的集合体。其中的每个变量称为数组元素,它们属于同一种数据类型个变量称为数组元素,它们属于同一种数据类型
11、,数组元素用数组名与带方括号的数组下标一起,数组元素用数组名与带方括号的数组下标一起标识。数组可以是一维的,也可以是多维的。标识。数组可以是一维的,也可以是多维的。特点:特点: 若干个同类型的数据元素,并且各个数据元若干个同类型的数据元素,并且各个数据元素之间存在某种次序关系。素之间存在某种次序关系。C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型5.2.1 一维数组定义与使用一维数组定义与使用 一维数组定义的一般形式为:一维数组定义的一般形式为: 说明:说明: 数组元素的类型可以是数组元素的类型可以是void型以外的任何一种基本数据类型型以外的任何一种基本数据类型,也
12、可以是已经定义过的构造数据类型;,也可以是已经定义过的构造数据类型;数组名是用户自定义的标识符,用来表示数组的名称,代表数组名是用户自定义的标识符,用来表示数组的名称,代表数组元素在内存中的起始地址,是一个地址常量。数组元素在内存中的起始地址,是一个地址常量。常量表达式必须是常量表达式必须是unsigned int类型的正整数。表示数组的类型的正整数。表示数组的大小或长度,也就是数组所包含数据元素的个数。大小或长度,也就是数组所包含数据元素的个数。 是数组下标运算符,在数组定义时用来限定数组元素的个是数组下标运算符,在数组定义时用来限定数组元素的个数。数。数据类型 数组名常量表达式;C+语语言
13、言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型F注意注意: :F 数组属于构造数据类型,在使用之前必须先进行类型定义。数组属于构造数据类型,在使用之前必须先进行类型定义。5.2.1 一维数组定义与使用一维数组定义与使用下面定义了2个不同类型的数组: int a5; /定义了一个5个元素的整型数组a weekday b10; /定义了一个10个元素的枚举数组b,weekday 为已定义的枚举型。数据类型相同的多个数组可以在同一条语句中予以定义。例如: int a110, a220; /同时定义了两个整型数组 数据类型相同的的简单变量和数组也可以在一个语句中定义。例如: int x
14、, a20; /同时定义了一个整型变量和一个整型数组 C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型5.2.1 一维数组定义与使用一维数组定义与使用 数组定义之后,系统会将从内存中为其分配一块连续的存储空间,从第1个数据元素开始依次存放各个数组元素。 例如: int a5; /定义了一个5个元素的整型数组a C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型 假设地址 内容 符号地址 103410A0 103410A4 103410A8 103410AC 103410B0 a a+1 a+2 a+3 a+4 5*sizeof(int) a0 a1
15、 a2 a3 a4 一维数组初始化:一维数组初始化: 是指在定义数组的同时给数组中的元素赋值。是指在定义数组的同时给数组中的元素赋值。其一般语法形式为:其一般语法形式为: 初值初值1,初值初值2, 初值初值n称为初值表,初值之间用逗号,分隔称为初值表,初值之间用逗号,分隔, 所有初值用所有初值用 括起来。括起来。初值可以是一个变量表达式,初值与数组元素的对应关系是:初值可以是一个变量表达式,初值与数组元素的对应关系是:初值初值i给数组第给数组第i个元素;所以,初值个数个元素;所以,初值个数n不能超过数组的大不能超过数组的大小。小。若初值表中初值个数若初值表中初值个数(项数项数)小于数组的大小,
16、则未指定值的数小于数组的大小,则未指定值的数组元素被赋值为组元素被赋值为0;但初值表中项数不能为;但初值表中项数不能为0。例如:。例如: weekday b10=MON,WED,FRI;当对全部数组元素赋初值时,可以省略数组的大小,此时数组当对全部数组元素赋初值时,可以省略数组的大小,此时数组的实际大小就是初值列表中初值的个数。例如:的实际大小就是初值列表中初值的个数。例如: char str = a, b, c, d, e ; /数组数组str的实际大小为的实际大小为5。数据类型 数组名 常量表达式 =初值1, 初值2, 初值n;C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据
17、据类类型型 对一维数组实施的存取操作有两类:存取数组元素与读取数组元素的地址。数组元素是通过数组名及下标来标识的,这种带下标的数组元素也称为下标变量,下标变量可以象简单变量一样参与各种运算。 存取一维数组元素的一般语法形式为: 说明: 下标表达式可以是变量表达式,用来标识数组元素。当定义了一个长度为n的一维数组a,C+规定数组的下标从0开始,依次为0、1、2、3、n-1。对应的数组元素分别是a0、a1、an-1,因此下标表达式的值要在0,n-1范围内。 a1+2=100; / 将数组a的第4个元素赋值100。 数组名 下标表达式; C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据
18、据类类型型【例【例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比较,比
19、较,选出较大者存于选出较大者存于ai中。中。C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型#includeusing namespace std;void main() const int MaxN=5; int n,aMaxN,i,j; for (n=0;nan; /输入数组元素 if (an0) break; for (i=0;in;i+) coutai,t; coutnnendl;1234567891011121314C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型 /对数组元素逐趟进行选择排序 for (i=0;in-1;i+) for
20、 (j=i+1;jn;j+) /从待排序序列中选择一个最大的数组元素 if (aiaj) int t; t=ai; /交换数组元素 ai=aj; aj=t; for (i=0;in;i+)coutai,t; /显示排序结果 19202122232425262728293031C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型 4. 数组的地址 数组元素的地址通过数组名来读取,其格式如下: 由于其地址不是实际的地址值,称这个地址表达式为符号地址表达式。例如: 一维数组元素a5的符号地址表达式为a+5。 若a是一个int型数组,数组的符号地址表达式a+n所表达的地址是第n+1
21、个元素an的地址,代表的实际地址值为:a+n*sizeof(int) 而不是:a+n。 C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型数组名+整型表达式;C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型F使用数组要注意使用数组要注意: :F在使用数组时最常犯的错误是下标越界,所谓的在使用数组时最常犯的错误是下标越界,所谓的下标越界就是下标表达式的值超出了数组定义时给下标越界就是下标表达式的值超出了数组定义时给定的元素个数,对于这种错误,编译器无法知道,定的元素个数,对于这种错误,编译器无法知道,往往在运行时出错。因此在程序设计时应格外注意。往往
22、在运行时出错。因此在程序设计时应格外注意。F F数组名是一个地址常量,不能作为左值数组名是一个地址常量,不能作为左值( (赋值的目赋值的目标标) )。因而,不能将一个数组整体拷贝给另外一个数。因而,不能将一个数组整体拷贝给另外一个数组。组。F 例如:例如:F int a5,c5,i; int a5,c5,i;F a=c; a=c;/错误错误! !F 正确的方法是将对应的元素进行拷贝,见下列正确的方法是将对应的元素进行拷贝,见下列程序段:程序段:F for(i=0;i5;i+) for(i=0;i5;i+)F ai=ci; / ai=ci; /将数组将数组c c中元素的值拷贝到中元素的值拷贝到数
23、组数组c c的对应元素中的对应元素中F在函数中,可以将一个一维数组作为函数的形式在函数中,可以将一个一维数组作为函数的形式参数,用来接受一个一维数组传递过来的地址。参数,用来接受一个一维数组传递过来的地址。 5.2.2 二维数组的定义与使用二维数组的定义与使用 二维数组的定义的一般形式为: 常量表达式1为第1维的元素的个数,常量表达式2为第2维元素的个数。二维数组amn是以长度为n的一维数组为元素的数组,因而,等价于如下定义方式:例如: int M23; 定义了一个整型二维数组M,数组M也可以用下列方式定义: typedef int M13; / 定义了一个一维整型数组M1; M1 M2; /
24、 以M1为类型定义数组M数据类型 数组名常量表达式2常量表达式1; C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型typedef 数据类型 一维数组名常量表达式1;一维数组名 二维数组名常量表达式2;如果一维数组描述排列成一行的数据,那么,二维数组则描述若干行这样的数据。因而,二维数组可以看作是数学上的一个矩阵。第1维元素个数为矩阵的列数,第2维元素个数为矩阵的行数。 二维数组的定义格式可以写成: 定义一个二维数组后,系统为它分配一块连续的内存空间。 二维数组amn占内存空间的计算公式为: 数据类型 数组名行数列数; C+语语言言程程序序设设计计教教程程 第第5章章构
25、构造造数数据据类类型型sizeof(数组名);或 m*sizeof(a0); 或 m*n*sizeof(数据类型) int M23的排列顺序为:先将3个int元素排列组成2个一维数组M0, M1。 M0:M00,M01,M02 M1:M10,M11,M12 再将2个一维数组排成一个二维数组。 M: M0, M1 C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型 实际地址 内容 符号地址 103B2000 M00 M, M0 103B2004 M01 M0+1 103B2008 M02 M0+2 103B200C M10 M1 103B2010 M11 M1+1 103B
26、2014 M12 M1+2 二维数组的初始化二维数组的初始化 :其中初值表具有两种形式:嵌套的初值表,线性初值表。其中初值表具有两种形式:嵌套的初值表,线性初值表。 (1) 嵌套初值表嵌套初值表以二维数组以二维数组Mmn为例,嵌套初值表的格式为:为例,嵌套初值表的格式为: 嵌套初值表由一维初值表嵌套构成,各层构成规则与一维数组的初嵌套初值表由一维初值表嵌套构成,各层构成规则与一维数组的初值表相同。值表相同。 int M34=1,2,3,4,3,4,5,6,5,6,7,8; /M数组元素被全部初始数组元素被全部初始化化 int a23=1,0,0,1; /初始化了部分数组元素初始化了部分数组元素
27、 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;(2线形初值表线形初值表 线形初值表与一维数组的初值表相同,初值表的项数不线形初值表与一维数组的初值表相同,初值表的项数不超过各维元素个数的乘积超过
28、各维元素个数的乘积(总元素个数总元素个数)。 数组元素按内存排列顺序依次从初值表中取值,下列各数组元素按内存排列顺序依次从初值表中取值,下列各数组使用了线形初值表,结果与使用嵌套初值表相同。数组使用了线形初值表,结果与使用嵌套初值表相同。 例如:例如: 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; /初始化了全部数组元素初始化了全部数组元素, 省略省略了高维元素个数了高维元素个数 当使用线形初值表而省略
29、高维元素个数时,高维元素个数为当使用线形初值表而省略高维元素个数时,高维元素个数为: 例如:例如: int b 3=1,0,0,0;高维元素个数为;高维元素个数为2C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型 向上取整数线形初值表项数向上取整数线形初值表项数/低维元素个数)低维元素个数) (3二维数组的存取二维数组的存取 存取维数组元素的格式为:存取维数组元素的格式为: 说明:说明:行下标表达式与列下标表达式的值同样从行下标表达式与列下标表达式的值同样从0开始,开始,aij表示表示数组的第数组的第i+1行、第行、第j+1列的元素。由于数组元素是变量,列的元素。由于数
30、组元素是变量,可以对其进行各种各种操作。可以对其进行各种各种操作。数组元素如果定义数组数组元素如果定义数组amn, 即数组第即数组第1维大小为维大小为n, 第第2维维大小为大小为m。aij的排列位置与在内存中的地址计算公式如的排列位置与在内存中的地址计算公式如下:下: a, a0: 为数组为数组a的起始地址的起始地址, 即即a00的地址;的地址; ai+j: 为数组的第为数组的第i+1行的第行的第j+1元素的地址,即元素的地址,即aij的地址的地址; C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型数组名 行下标表达式 列下标表达式aij的排列位置=第1维大小n*i+j
31、+1;aij的地址=a的起始地址+(第1维大小n*i+j)*sizeof(数据类型)#includeusing namespace std;void main() const int MaxN=100,CourseN=5; int n,scoreMaxNCourseN+1=0; float averCourseN+1=0; for (n=0;nMaxN;n+) /输入学生成绩 for(int j=0;jscorenj; if (scoren00) break; /输入-1,结束输入 for (int i=0;in;i+) /计算每个学生的总分 for(int j=0;jCourseN;j+)
32、scoreiCourseN=scoreiCourseN+scoreij; 12345678910111213141516C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型 for (int j=0;jCourseN+1;j+) /计算每门课程的平均分 for (int i=0; in; i+) averj=averj+scoreij; averj=averj/n; for (i=0;in;i+) /输出每个人的成绩与总分 for(int j=0;jCourseN+1;j+) coutscoreijt; coutendl; cout-endl; for (i=0;iCour
33、seN+1;i+) /输出每门功课的平均分 coutaverit; coutendl; 2122232425262728293031323334363637C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型5.2.3 多维数组多维数组 (1 1三维以及高于三维的数组称为多维数组三维以及高于三维的数组称为多维数组 多维数组的定义与二维数组类似,可以一次定义,也可以逐步由低维数组定多维数组的定义与二维数组类似,可以一次定义,也可以逐步由低维数组定义。义。 例如:例如: int b234; / int b234; /定义了一个三维数组定义了一个三维数组 也可用下列方式步定义:也
34、可用下列方式步定义: typedef int B134; typedef int B134; B1 b2; B1 b2; 多维数组在内存的排列方式同样是先排低维数组,由低向高依次排列。多维数组在内存的排列方式同样是先排低维数组,由低向高依次排列。如:如:b234b234的排列顺序为:的排列顺序为: b00 b00:b000b000,b001b001,b002b002,b003b003 b0 b01 b0 b01:b010b010,b011b011,b012b012,b013b013b b02b b02:b020b020,b021b021,b022b022,b023b023 b10 b10:b1
35、00b100,b101b101,b102b102,b103b103 b1 b11 b1 b11:b110b110,b111b111,b112b112,b113b113 b12 b12:b120b120,b121b121,b122b122,b123b123C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型5.2.4 数组与函数数组与函数 数组名是一个地址,不能当作一个左值,但是可以作为函数的形参,接受实参传送来的地址。当形参接受实参传送来的地址后,形参数组与实参共享内存中的一块空间。函数体通过形参对数组内容的改变会直接作用到实参上。数组名作为形参是数组应用的一个重要方面。
36、注意: (1)使用数组名传递地址时,虽然传递是地址,但形参与实参的地址 (数组)类型应一致。 (2)形式参数中数组元素个数没有给定,因而,在函数体中,对数组存取的下标可以为任意值而不会出现编译错误。但是,当这个下标超过了实在参数数组的个数范围时,存取的就不是实在参数数组中的内容了。C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型#includeusing namespace std;const col=5;enum dir Asc,Des;void sort(int acol, int n, int Cn, dir D) /排序 int tcol; /用于暂存一行数据
37、for (int i=0;in-1;i+) for (int j=i+1;jn;j+) /从待排序序列中选择一个最大(小)的数组元素 if (aiCnajCn&D=Asc) memcpy(t,ai,sizeof(t); /交换数组行 memcpy(ai,aj,sizeof(t); memcpy(aj,t,sizeof(t); 12345678910111213141516C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型void main() const CourseN=5; int n,scoreCourseN=20190101, 1, 82, 86, 0, 2
38、0190203, 2, 80, 80, 0, 20190204, 2, 86, 90, 0, 20190205, 2, 90, 83, 0, 20190102, 1, 75, 86, 0; n=sizeof(score)/sizeof(score0); for (int i=0;in;i+) /计算每个学生的总分计算每个学生的总分 for(int j=2;jCourseN-1;j+) scoreiCourseN-1=scoreiCourseN-1+scoreij; sort(score,n,4,Des); /按总分降序排序按总分降序排序 sort(score,n,1,Asc); /按班号的升序
39、排序按班号的升序排序 for (i=0;in;i+) /输出每个人的成绩与总分输出每个人的成绩与总分 for(int j=0;jCourseN;j+) coutscoreijt; coutendl; 222324252627282930313233343536373839404142 C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型5.2.5 字符数组与字符串字符数组与字符串 存放字符型数据的数组称为字符数组。字符数组也分为一维数组和多维数组。前述的数组的定义及初始化同样适用于字符数组,除此以外,C+对字符数组的初始化还可以使用字符串形式。 1.用字符进行初始化 例如:
40、 char s1 =C,h,i,n,a; char s2 4=H,o,w,a,r,e,y,o,u; 2.用字符串进行初始化 例如: char s3 =China; char s4 4=how, are, you; C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型比较两个字符串的大小,即按从左到右的顺序逐个比较对应字符的ASCII码值。若s1大于s2,返回1;若s1小于s2,返回-1;若s1等于s2,返回0。串s1、s2可以是字符串常量strcmp(串s1, 串s2)将字符串中的所有字符转换成大写字符strupr(字符串)将字符串中的所有字符转换成小写字符strlwr(字
41、符串)将字符数组中的所有字符都设为指定字符C, 并以0结尾strset(字符数组, 字符C) Cstring 返回字符串的长度(不包括0)strlen(字符串)函数的用法函数的用法函数的用法函数的用法函数的用法函数的用法C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型 常用字符与字符串处理函数Cstdlib Cstring 将字符串s2拷贝到s1所指的存储空间中,然后返回s1。 其中, 串s2可以是字符串常量 strcpy(串s1, 串s2) atof(字符串)将数字字符串转换成长整型数atol(字符串)将数字字符串转换成整型数atoi(字符串)将大写字符转换成小写字符
42、tolower(字符)将小写字符转换成大写字符toupper(字符) Ctype 将字符串s2连接到s1所指的字符串之后的存储空间中,并返回s1的值strcat(串s1, 串s2)函数的用法函数的用法函数的用法函数的用法函数的用法函数的用法C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型将数字字符串转换成浮点数将无符号长整型数转换成指定的进制数并以字符串的形式存放到字符数组中ultoa(无符号长整数,字符数组,进制)#includeusing namespace std;const NameLen=20;void order(char nameNameLen,int n
43、) /字符串排序 char tempNameLen; for(int i=0;in-1;i+)/选择排序 for(int j=i+1;j0)/比较两个字符串的大小 strcpy(temp,namei); /字符串交换 strcpy(namei,namej); strcpy(namej,temp); 123456789101112131415C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型int find(char nameNameLen,int n,char anameNameLen) for(int i=0;i0) /未找完,但找不到,返回未找完,但找不到,返回0re
44、turn 0; return 0; /找完,找不到,返回找完,找不到,返回void main() charNameTabNameLen=GongJing,LiuNa,HuangPin,AnZijun, LianXiaolei,ChenHailing,CuiPeng,LiuPing; char anameNameLen; int n=sizeof(NameTab)/NameLen; order(NameTab,n); for(int i=0;in;i+) /输出排序后的各姓名输出排序后的各姓名 couti+1tNameTabiendl; coutaname; if(n=find(NameTab,
45、n,aname)coutPosition:nendl; elsecoutNot found!endl; 2021222324252627282930313233343536373839404142C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型5.3 指针指针 指针是C+语言最重要特性之一,也是C+的主要难点。 指针提供了一种较为直观的地址操作的手段,正确地使用指针,可以方便、灵活而有效地组织和表示复杂的数据。 指针在C+程序中扮演着非常重要的角色,从某种程度上而言,如果不能深刻的理解指针的概念,正确而有效的掌握指针,就不可能真正学好C+,但是指针也是我们最容易产生困惑
46、并导致程序出错的原因之一。 C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型1. 地址与指针地址与指针地址:地址: 当定义一个变量后,内存中将会划出一块由若干个当定义一个变量后,内存中将会划出一块由若干个存储单元组成的区域,用于保存该变量的数据。在内存存储单元组成的区域,用于保存该变量的数据。在内存里每个存储单元都有各自的编号,称为地址。里每个存储单元都有各自的编号,称为地址。指针:指针: 在在C+中,提供了指针类型,它是一种用于存放内中,提供了指针类型,它是一种用于存放内存单元地址的变量类型,地址就存储在这种指针类型的存单元地址的变量类型,地址就存储在这种指针类型的变
47、量中。正因为指针变量存储的是地址,用它来指明内变量中。正因为指针变量存储的是地址,用它来指明内存单元,所以形象地称这种地址变量为指针。存单元,所以形象地称这种地址变量为指针。 C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型2. 指针变量的定义指针变量的定义 每存储一个地址,就要定义一个指针变量。定义指针变每存储一个地址,就要定义一个指针变量。定义指针变量的格式如下:量的格式如下: 数据类型是指针变量所指向对象的数据类型,它可以是基本数据类型是指针变量所指向对象的数据类型,它可以是基本数据类型,也可以是构造数据类型以及数据类型,也可以是构造数据类型以及void 类型。类
48、型。 变量名是用户自定义的标识符。变量名是用户自定义的标识符。 *表示声明的变量是一个指针变量,而不是普通变量。表示声明的变量是一个指针变量,而不是普通变量。 int *ip; /定义了一个定义了一个int型的指针变量型的指针变量ip float *fp; /定义了一个定义了一个float型指针变量型指针变量fp typedef int A10; A *ap; / 定义了一个定义了一个A类型的指针变量类型的指针变量ap sizeof(ip)=sizeof(fp)=sizeof(ap)=4; 数据类型 * 变量名; C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型 3指针
49、的初始化与赋值指针的初始化与赋值 定义了一个指针,只是得到了一个用于存储地址的指针变量定义了一个指针,只是得到了一个用于存储地址的指针变量。若指针变量既没有初始化,也没有赋值,其地址值是一个。若指针变量既没有初始化,也没有赋值,其地址值是一个随机的数。随机的数。 (1不要将一个非地址常量、变量以及无意义的实际地址赋给不要将一个非地址常量、变量以及无意义的实际地址赋给指针变量。如:指针变量。如: int *p=100; /错误,错误,100是一个是一个int型常量,不是一个型常量,不是一个地址常量。地址常量。 int *p=(char *)100; /危险!危险!100是一个无意义的实际地址是一
50、个无意义的实际地址, 可能指向危险区域。可能指向危险区域。(2可以使用一个已初始化的指针去给另一个指针赋值,但类可以使用一个已初始化的指针去给另一个指针赋值,但类型必须一致如果不一致,可进行强制类型转换。型必须一致如果不一致,可进行强制类型转换。 char *p=NULL; int *ip=(int *)p+100; /将将char型指针强制转化成型指针强制转化成int型指型指针。针。(3对于基本数据类型的变量、数组元素我们可以使用取地址对于基本数据类型的变量、数组元素我们可以使用取地址运算符运算符&来获得它们的地址,但是也只有类型一致才能赋值来获得它们的地址,但是也只有类型一致才能赋
51、值。 int a10; /定义定义int型数组型数组 int *i_pointer=a; /定义并初始化定义并初始化int型指针型指针 (4有一种特殊的有一种特殊的void类型指针,可以存储任何的类型地址类型指针,可以存储任何的类型地址;但将一个;但将一个void类型的地址赋值给非类型的地址赋值给非void类型的指针变量,类型的指针变量,要使用类型强制转换。要使用类型强制转换。 void v; /错误,不能定义错误,不能定义void类型的变量类型的变量 void *vp; /定义定义void类型的指针类型的指针 数据类型 *指针变量名=初始地址表达式; C+语语言言程程序序设设计计教教程程 第
52、第5章章构构造造数数据据类类型型4指针运算指针运算 指针变量存放的是地址,因此指针的运算实际上就是指针变量存放的是地址,因此指针的运算实际上就是地址的运算,但正是由于指针的这一特殊性,使指针所能地址的运算,但正是由于指针的这一特殊性,使指针所能进行的运算受到了一定的限制。指针通常进行下列几种运进行的运算受到了一定的限制。指针通常进行下列几种运算:赋值运算、取值运算、算术运算、相减运算、比较运算:赋值运算、取值运算、算术运算、相减运算、比较运算。算。 (1)* 和和&运算运算 *称为指针运算符。出现在数据定义语句中时,称为指针运算符。出现在数据定义语句中时,* 在数据在数据类型与变量之间
53、,用来定义指针变量;出现指针变量表达类型与变量之间,用来定义指针变量;出现指针变量表达式左边时,表示访问指针所指对象的内容。式左边时,表示访问指针所指对象的内容。 int a4=1,2,3; int *ip=&a2; cout*ip; / 输出输出ip指向单元的内容,内容为整型数指向单元的内容,内容为整型数3 *ip=100; / 将将100赋给赋给a2; 0013A000 a0=1 0013A004 a1=2 *ip 0013A008 a2=3 0013A00C a3=0 ip 0013A014 ip=0013A008 C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据
54、类类型型(2指针与整数的加减运算指针与整数的加减运算 指针的加减运算与普遍变量的加减运算不同,由于指针存储的是指针的加减运算与普遍变量的加减运算不同,由于指针存储的是变量的内存地址,指针加上或减去一个整数变量的内存地址,指针加上或减去一个整数n,表示指针从当前位置向,表示指针从当前位置向后或向前移动后或向前移动n个个sizeof数据类型长度的存储单元。因此对于不同数据类型长度的存储单元。因此对于不同的数据类型,的数据类型,n的实际大小就不同。的实际大小就不同。 int b234; typedef char A10; int *p1=b10; int *p2=(int *)b1; int *p3
55、=(int *)(b+1); double *pd=(double *)p3; A *pa=(A *)p3; coutp1,p2,p3,pd,paendl; coutp1+1,p2+1,p3+1,pd+1,pa+1endl; C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型(3指针自增、自减运算指针自增、自减运算 指针的自增、自减运算是指针加减运算的特例。指指针的自增、自减运算是指针加减运算的特例。指针的自增或自减表示指针从当前位置向后或向前移动针的自增或自减表示指针从当前位置向后或向前移动sizeof数据类型长度的存储单元。数据类型长度的存储单元。 int *p, *
56、q, a=5; p=&a; p+; /指针指针p后移后移4个字节个字节 *p+; /先读取先读取p指向的变量指向的变量a的值的值5,然后使指针,然后使指针p后移后移4个字节个字节 (*p)+; /读取读取p指向的变量指向的变量a的值,然后使的值,然后使p指向的变指向的变量量a自增自增1 *+p; /先使指针先使指针p后移后移4个字节,然后读取个字节,然后读取p指向的指向的变量的值变量的值 +*p; /将将p指向的变量指向的变量a自增自增1 *q+=*p+; /这是一种常用的表达式,依次执行这是一种常用的表达式,依次执行:*q=*p, q+, p+(4两指针相减两指针相减 当两个指针指向
57、同一数组时,两个指针的相减才有意当两个指针指向同一数组时,两个指针的相减才有意义。两个指针相减的结果为一整数,表示两个指针之间数义。两个指针相减的结果为一整数,表示两个指针之间数组元素的个数。组元素的个数。 C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型(5两个指针的比较运算两个指针的比较运算 两个指针的比较一般用于下列两种情况:一是比较两个指针所指向两个指针的比较一般用于下列两种情况:一是比较两个指针所指向的对象在内存中的位置关系;二是判断指针是否为空指针。的对象在内存中的位置关系;二是判断指针是否为空指针。 5 void类型指针类型指针 指向指向void类型的指针
58、是一种不确定类型的指针,它可以指向任何类类型的指针是一种不确定类型的指针,它可以指向任何类型的变量。实际使用型的变量。实际使用void型指针时,只有通过强制类型转换才能使型指针时,只有通过强制类型转换才能使void型指针得到具体变量的值。在没有转换前型指针得到具体变量的值。在没有转换前void型指针不能进行指针的算型指针不能进行指针的算术运算。术运算。 例如:例如: void *vp; /定义了一个定义了一个void型指针型指针vp int i=6, *ip; vp=&i; / vp指向整型变量指向整型变量i cout“i=”*vpendl; / 错误错误 couti=*(int *)
59、vpendl; ip=(int *)vp; /ip指向指向vp指向的变量指向的变量i couti=*ipendl; C+语语言言程程序序设设计计教教程程 第第5章章构构造造数数据据类类型型5.3.2 指针与字符串指针与字符串 字符型指针:字符型指针: 用于存放字符型变量的地址,而字符串的本质是以用于存放字符型变量的地址,而字符串的本质是以0结结尾的字符数组,一个字符型指针存储了字符数组的第一个元尾的字符数组,一个字符型指针存储了字符数组的第一个元素的地址,也就存储了字符串的地址,这个指针就指向了字素的地址,也就存储了字符串的地址,这个指针就指向了字符串。符串。 在定义一个字符数组时,可以将一个
60、字符串常量作为初值,在定义一个字符数组时,可以将一个字符串常量作为初值,但将字符串常量作为初值赋给字符数组和将字符串常量作为但将字符串常量作为初值赋给字符数组和将字符串常量作为初值赋给字符指针变量,二者的含义是不同的。初值赋给字符指针变量,二者的含义是不同的。 char str5=abcd; char *p_str=abcd; 字符数组字符数组str5被赋值为被赋值为“abcd”,因而,数组,因而,数组str的五个数的五个数组元素的值分别为字符组元素的值分别为字符a、b、c、d和和0。字符指针。字符指针p_str被赋值为被赋值为“abcd”,则意味着指针,则意味着指针p_str的值为字符串常量的值为字符串常量“abcd的第一个字符的第一个字符a在内在
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学习成效与习惯塑造承诺书范文4篇
- 财务系统数据损坏修复流程供财务部预案
- 教育机构可信度保证承诺书5篇范文
- 健康医疗数据应用承诺书7篇范文
- 供应链合作服务水平承诺书(3篇)
- 智慧教育直播教育方案设计手册
- 运用QC方法提高外墙抹灰质量
- 农村地区饮用水源卫生监管办法
- 2026年生物地理试题及答案
- 护理质量持续改进:PDCA循环解析
- 2025年东北大学强基笔试试题及答案
- 2024年淮阴师范学院辅导员考试笔试真题汇编附答案
- 中华人民共和国危险化学品安全法解读
- DB32∕T 5111-2025 普通国省道基础设施三维数字化采集技术规范
- 石材幕墙干挂维修工程方案
- 水库工程施工进度计划管理模板
- GLP-1RA患者围术期多学科管理共识解读课件
- 妇女盆底功能障碍性疾病防治方案
- 2026年兰考三农职业学院单招职业技能测试必刷测试卷附答案
- 智能玩具小车设计
- 2025年健康服务与管理专升本健康管理试卷(含答案)
评论
0/150
提交评论