C++程序设计第5章_第1页
C++程序设计第5章_第2页
C++程序设计第5章_第3页
C++程序设计第5章_第4页
C++程序设计第5章_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

1、第第5章章 数组数组 5.1 数组的概念数组的概念 5.2 一维数组的定义和引用一维数组的定义和引用 5.3 二维数组的定义和引用二维数组的定义和引用 5.4 用数组名作函数参数用数组名作函数参数 5.5 字符数组字符数组 *5.6 C+处理字符串的方法处理字符串的方法字符串类与字符串类与字符串变量字符串变量概括地说:概括地说: 数组是有序数据的集合数组是有序数据的集合。要寻找一个。要寻找一个数组中的某一个元素必须给出两个要素,即数组名数组中的某一个元素必须给出两个要素,即数组名和下标。数组名和下标惟一地标识一个数组中的一和下标。数组名和下标惟一地标识一个数组中的一个元素。个元素。数组是有类型

2、属性的。同一数组中的每一个元素都数组是有类型属性的。同一数组中的每一个元素都必须属于同一数据类型。一个数组在内存中占一片必须属于同一数据类型。一个数组在内存中占一片连续的存储单元。如果有一个整型数组连续的存储单元。如果有一个整型数组a,假设数假设数组的起始地址为组的起始地址为2000,则该数组在内存中的存储情,则该数组在内存中的存储情况如图况如图5.1所示。所示。5.1 数组的概念数组的概念 图图5.1引入数组就不需要在程序中定义大量的变量,大大引入数组就不需要在程序中定义大量的变量,大大减少程序中变量的数量,使程序精炼,而且数组含减少程序中变量的数量,使程序精炼,而且数组含义清楚,使用方便,

3、明确地反映了数据间的联系。义清楚,使用方便,明确地反映了数据间的联系。许多好的算法都与数组有关。熟练地利用数组,可许多好的算法都与数组有关。熟练地利用数组,可以大大地提高编程和解题的效率,加强了程序的可以大大地提高编程和解题的效率,加强了程序的可读性。读性。C+用方括号来表示下标,如用用方括号来表示下标,如用s1,s2,s3 分别代表分别代表s1,s2,s3。定义一维数组的一般格式为定义一维数组的一般格式为类型标识符类型标识符 数组名常量表达式;数组名常量表达式;例如例如int a10;它表示数组名为它表示数组名为a,此数组为整型,有此数组为整型,有10个元素。个元素。说明:说明:(1) 数组

4、名定名规则和变量名相同,遵循标识符定名规则。数组名定名规则和变量名相同,遵循标识符定名规则。(2) 用方括号括起用方括号括起来的常量表达式表示下标值来的常量表达式表示下标值,如下面的写法是合法的:,如下面的写法是合法的: int a10;int a2*5;int an*2; /假设前面已定义了假设前面已定义了n为常变量为常变量 (3) 常量表达式的值表示元素的个数,即数组长度。常量表达式的值表示元素的个数,即数组长度。例如,在例如,在“int a10;”中,中,10表示表示a数组有数组有10个元素个元素,下标从下标从0开始开始,这这10个元素是:个元素是: a0,a1,a2,a3,a4,a5,

5、a6,a7, a8,a9。注意注意最后一个最后一个元素是元素是a9而不是而不是a10。5.2 一维数组的定义和引用一维数组的定义和引用(4) 常量表达式中可以包括常量、常变量和符号常常量表达式中可以包括常量、常变量和符号常量,但不能包含变量。也就是说,量,但不能包含变量。也就是说,C+不允许对数不允许对数组的大小作动态定义,即数组的大小不依赖于程序组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。运行过程中变量的值。例如,下面这样定义数组是例如,下面这样定义数组是不行的:不行的:int n;cinn; /输入输入a数组的长度数组的长度int an; /企图根据企图根据n的值决定数

6、组的长度的值决定数组的长度 如果把第如果把第1,2行改为下面一行就合法了行改为下面一行就合法了:const int n=5;数组必须先定义,然后使用。只能逐个引用数组元数组必须先定义,然后使用。只能逐个引用数组元素的值而不能一次引用整个数组中的全部元素的值。素的值而不能一次引用整个数组中的全部元素的值。数组元素的表示形式为数组元素的表示形式为数组名下标数组名下标下标可以是整型常量或整型表达式。例如下标可以是整型常量或整型表达式。例如a0= a5+ a7- a2*35.2.2 引用一维数组的元素引用一维数组的元素例例5.1 数组元素的引用。数组元素的引用。#include using names

7、pace std;int main( ) int i,a10; for (i=0;i=0;i-)coutai ; coutendl; return 0;运行结果如下:运行结果如下: 9 8 7 6 5 4 3 2 1 0程序使程序使a0a9的值为的值为09,然后按逆序输出。,然后按逆序输出。(1) 在定义数组时分别对数组元素赋予初值。例如在定义数组时分别对数组元素赋予初值。例如int a10=0,1,2,3,4,5,6,7,8,9;(2) 可以只给一部分元素赋值。例如可以只给一部分元素赋值。例如int a10=0,1,2,3,4; (3) 如果想使一个数组中全部元素值为如果想使一个数组中全部元

8、素值为1,可以写成,可以写成int a10=1,1,1,1,1,1,1,1,1,1;不能写成不能写成 int a10=1*10;不能给数组整体赋初值。不能给数组整体赋初值。(4) 在对全部数组元素赋初值时,可以不指定数组在对全部数组元素赋初值时,可以不指定数组长度。例如长度。例如int a5=1,2,3,4,5;可以写成可以写成 int a=1,2,3,4,5;5.2.3 一维数组的初始化一维数组的初始化例例5.2 用数组来处理求用数组来处理求Fibonacci数列问题。数列问题。可以用可以用20个元素代表数列中的个元素代表数列中的20个数,从第个数,从第3个数开始,可以直接用表达式个数开始,

9、可以直接用表达式fi=fi-2+fi-1求出各数。求出各数。程序如下:程序如下:#include #include using namespace std;int main( ) int i; int f20=1,1; /f0=1,f1=1 for(i=2;i20;i+) fi=fi-2+fi-1; /在在i的值为的值为2时,时,f2=f0+f1,依此类推依此类推 for(i=0;i20;i+) /此循环的作用是输出此循环的作用是输出20个数个数 if(i%5=0) coutendl; /控制换行,每行输出控制换行,每行输出5个数据个数据 coutsetw(8)fi; /每个数据输出时占每个数

10、据输出时占8列宽度列宽度 coutendl; /最后执行一次换行最后执行一次换行 return 0;运行结果如下:运行结果如下:1 1 2 3 5 8 13 21 34 55 89 144 233 377 610987 1597 2584 4181 6765例例5.3 编写程序,编写程序,用起泡法对用起泡法对10个数排序个数排序(按由小到按由小到大顺序大顺序)。起泡法的思路是:起泡法的思路是:将相邻两个数比较,将小的调到将相邻两个数比较,将小的调到前头。前头。见图见图5.2。然后进行第然后进行第2趟比较,对余下的前面趟比较,对余下的前面5个数按上法进个数按上法进行比较,见图行比较,见图5.3。

11、 图图5.2 图图5.3冒泡排序冒泡排序请请 5 位同学上台,在老师的指导下,位同学上台,在老师的指导下,按照冒泡排序的算法按身高从低到高排序按照冒泡排序的算法按身高从低到高排序冒泡排序冒泡排序 冒泡排序:冒泡排序:每次比较相邻两数每次比较相邻两数小的交换到前面小的交换到前面每轮结束后最大的数交换到最后每轮结束后最大的数交换到最后16259902316259239092523第一轮:比较了第一轮:比较了4次次第二轮:比较了第二轮:比较了3次次第三轮:比较了第三轮:比较了2次次第四轮:比较了第四轮:比较了1次次用二重循环实现冒泡排序用二重循环实现冒泡排序i = 0i = 1i = 2i = 3第

12、一轮:比较了第一轮:比较了4次次第二轮:比较了第二轮:比较了3次次第三轮:比较了第三轮:比较了2次次第四轮:比较了第四轮:比较了1次次外层循环外层循环 如何用二重循环将如何用二重循环将5 5个数字排序?个数字排序?N = 5N = 55 5个数字存放在一维数组中个数字存放在一维数组中外层循环控制比较多少轮,循环变量外层循环控制比较多少轮,循环变量 i i内层循环控制每轮比较多少次,循环变量内层循环控制每轮比较多少次,循环变量 j j内层循环内层循环循环循环4次次:j 4循环循环3次次:j 3循环循环2次次:j 2循环循环1次次:j 1i 4i N-1j ?j 4-ij N-1-i用二重循环实现

13、冒泡排序用二重循环实现冒泡排序 代码框架:代码框架: 演示示例演示示例7:将将5个学员成绩排序个学员成绩排序,使用断点跟踪,使用断点跟踪for (i = 0; i N-1 ; i+) for (j = 0; j N-1-i ; j+) / 比较比较 j 和和 j+1 位置的元素位置的元素 / 如果前大后小就交换如果前大后小就交换 冒泡排序速记口诀冒泡排序速记口诀(升序):(升序):N 个数字来排队个数字来排队两两相比小靠前两两相比小靠前外层循环外层循环 N-1内层循环内层循环 N-1-i冒泡排序冒泡排序 关键代码分析:关键代码分析:for (i = 0; i N -1 ; i+) for (j

14、 = 0; j scoresj + 1) / 交换元素交换元素 temp = scoresj; scoresj = scoresj + 1; scoresj + 1 = temp; 经过一轮比较交换,经过一轮比较交换,最大的元素换到了最后最大的元素换到了最后面面外层循环终止条件:数组长度外层循环终止条件:数组长度-1内层循环终止条件:内层循环终止条件:数组长度数组长度 1 - i7源代码源代码可以推知,可以推知,如果有如果有n个数,则要进行个数,则要进行n-1趟比较趟比较(和交换和交换)。在第。在第1趟中要进行趟中要进行n-1次两两比较,在第次两两比较,在第j趟中要进行趟中要进行n-j次两两比

15、较。次两两比较。根据以上思路写出程序,今设根据以上思路写出程序,今设n=10,本例定义数组长度为本例定义数组长度为11,a0不用,只不用,只用用a1a10,以符合人们的习惯。从前面的叙述可知,应该进行以符合人们的习惯。从前面的叙述可知,应该进行9趟比趟比较和交换。较和交换。#include using namespace std;int main( ) int a11; int i,j,t; coutinput 10 numbers :endl; for (i=1;iai; coutendl; for (j=1;j=9;j+) /共进行共进行9趟比较趟比较 for(i=1;iai+1) /如果

16、前面的数大于后面的数如果前面的数大于后面的数 t=ai;ai=ai+1;ai+1=t; /交换两个数的位置,使小数上浮交换两个数的位置,使小数上浮 coutthe sorted numbers :endl; for(i=1;i11;i+) /输出输出10个数个数 coutai ; coutendl; return 0;具有两个下标的数组称为二维数组。有些数据要依具有两个下标的数组称为二维数组。有些数据要依赖于两个因素才能惟一地确定,例如有赖于两个因素才能惟一地确定,例如有3个学生,个学生,每个学生有每个学生有4门课的成绩,显然,成绩数据是一个门课的成绩,显然,成绩数据是一个二维表,如书中表二维

17、表,如书中表5.1所示。所示。想表示第想表示第3个学生第个学生第4门课的成绩,就需要指出学生门课的成绩,就需要指出学生的序号和课程的序号两个因素,在数学上以的序号和课程的序号两个因素,在数学上以S3,4表表示。在示。在C+中以中以s34表示,它代表数据表示,它代表数据73。5.3 二维数组的定义和引用二维数组的定义和引用定义二维数组的一般形式为定义二维数组的一般形式为类型标识符类型标识符 数组名常量表达式常量表达式数组名常量表达式常量表达式例如例如 float a34,b510;定义定义a为为34(3行行4列列)的单精度数组,的单精度数组,b为为510(5行行10列列)的单精度数组。的单精度数

18、组。注意不能写成注意不能写成“float a3,4,b5,10;”。使我们可以把二维数组使我们可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。例如,可看作是一种特殊的一维数组:它的元素又是一个一维数组。例如,可以把以把a看作是一个一维数组,它有看作是一个一维数组,它有3个元素:个元素:a0,a1,a2,每每个元素又是一个包含个元素又是一个包含4个元素的一维数组,见图个元素的一维数组,见图5.4。a0,a1,a2是是3个一维数组的名字。个一维数组的名字。5.3.1 定义二维数组定义二维数组C+中,二维数组中元素排列的顺序是:中,二维数组中元素排列的顺序是:按行存放,按行存放,即

19、在内存中先顺序存放第一行的元素,再存放第二即在内存中先顺序存放第一行的元素,再存放第二行的元素。行的元素。图图5.5表示对表示对a34数组存放的顺数组存放的顺序。序。图图5.5C+允许使用多维数组。有了二维数组的基础,再允许使用多维数组。有了二维数组的基础,再掌握多维数组是不困难的。例如,定义三维数组的掌握多维数组是不困难的。例如,定义三维数组的方法是方法是可以用下面的方法对二维数组初始化:可以用下面的方法对二维数组初始化:(1) 分行给二维数组赋初值分行给二维数组赋初值。如。如int a34=1,2,3,4,5,6,7,8,9,10,11,12; 这种赋初值方法比较直观,把第这种赋初值方法比

20、较直观,把第1个花括号内的数据赋给第个花括号内的数据赋给第1行的元素,第行的元素,第2个花括号内的个花括号内的数据赋给第数据赋给第2行的元素行的元素即按行赋初值。即按行赋初值。(2) 可以将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。如可以将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。如int a34=1,2,3,4,5,6,7,8,9,10,11,12;(3) 可以对部分元素赋初值可以对部分元素赋初值。如。如int a34=1,5,9 ;它的作用是只对各行第它的作用是只对各行第1列的元素赋初值,其余元素值自动置为列的元素赋初值,其余元素值自动置为0。赋初值后数组各

21、元素。赋初值后数组各元素为为1 0 0 05 0 0 09 0 0 0 也可以对各行中的某一元素赋初值:也可以对各行中的某一元素赋初值:int a34=1,0,6,0,0,11; 初始化后的数组元素如下:初始化后的数组元素如下:1 0 0 00 6 0 00 0 11 05.3.3 二维数组的初始化二维数组的初始化例例5.4 将一个二维数组行和列元素互换,存到另一将一个二维数组行和列元素互换,存到另一个二维数组中个二维数组中。例如。例如a=123 b=14456 2536程序如下:程序如下:#include using namespace std;int main( ) int a23=1,2

22、,3,4,5,6; int b32,i,j;5.3.4 二维数组程序举例二维数组程序举例 coutarray a:endl; for (i=0;i=1;i+) for (j=0;j=2;j+) coutaij ; bji=aij; coutendl; coutarray b:endl; for (i=0;i=2;i+) for(j=0;j=1;j+) coutbij ; coutendl; return 0;例例5.5 有一个有一个34的矩阵,要求编程序求出其中值最大的那个元素的值,以及其的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。所在的行号和列号。 开始时把开始时

23、把a00的值赋给变量的值赋给变量max,然后让下一个元素与它比较,将二者然后让下一个元素与它比较,将二者中值大者保存在中值大者保存在max中,然后再让下一个元素与新的中,然后再让下一个元素与新的max比,直到最后一个元比,直到最后一个元素比完为止。素比完为止。max最后的值就是数组所有元素中的最大值。最后的值就是数组所有元素中的最大值。程序如下:程序如下: #include using namespace std;int main(int argc, char* argv)int i,j,row=0,colum=0,max;int a34=5,12,23,56,19,28,37,46,-12,

24、-34,6,8;max=a00; /使使max开始时取开始时取a00的值的值for (i=0;i=2;i+) /从第从第0行行第第2行行 for (j=0;jmax) /如果某元素大于如果某元素大于max max=aij; /max将取该元素的值将取该元素的值row=i; /记下该元素的行号记下该元素的行号icolum=j; /记下该元素的列号记下该元素的列号j coutmax=max,row=row,colum=columendl;return 0;输出结果为输出结果为 max=56,row=0,colum=3常量和变量可以用作函数实参,同样数组元素也常量和变量可以用作函数实参,同样数组元素

25、也可以作函数实参,其用法与变量相同。数组名也可以作函数实参,其用法与变量相同。数组名也可以作实参和形参,传递的是数组的起始地址。可以作实参和形参,传递的是数组的起始地址。1. 用数组元素作函数实参用数组元素作函数实参由于实参可以是表达式,而数组元素可以是表达由于实参可以是表达式,而数组元素可以是表达式的组成部分,因此数组元素当然可以作为函数式的组成部分,因此数组元素当然可以作为函数的实参,与用变量作实参一样,将数组元素的值的实参,与用变量作实参一样,将数组元素的值传送给形参变量。传送给形参变量。5.4 用数组名作函数参数用数组名作函数参数2. 用数组名作函数参数用数组名作函数参数可以用数组名作

26、函数参数,此时实参与形参都用数可以用数组名作函数参数,此时实参与形参都用数组名(也可以用指针变量,见第组名(也可以用指针变量,见第6章)。章)。例例5.7 用选择法对数组中用选择法对数组中10个整数按由小到大排序。个整数按由小到大排序。所谓所谓选择法就是先将选择法就是先将10个数中最小的数与个数中最小的数与a0对对换换;再将再将a1到到a9中最小的数与中最小的数与a1对对换换每比较一轮每比较一轮,找出一个未经排序的数中最小找出一个未经排序的数中最小的一个。共比较的一个。共比较9轮。轮。根据此思路编写程序如下:根据此思路编写程序如下:#include using namespace std;in

27、t main( )void select_sort( int array,int n); /函数声明函数声明 int a10,i; coutenter the originl array:endl;for(i=0;iai; coutendl; select_sort(a,10); /函数调用,数组名作实参函数调用,数组名作实参 coutthe sorted array:endl; for(i=0;i10;i+) /输出输出10个已排好序的数个已排好序的数 coutai ; coutendl; return 0;void select_sort(int array,int n) /形参形参arr

28、ay是数组名是数组名 int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(arrayjarrayk) k=j; t=arrayk;arrayk=arrayi;arrayi=t; 关于用数组名作函数参数有两点要说明:关于用数组名作函数参数有两点要说明:(1) 如果函数实参是数组名,形参也应为数组名如果函数实参是数组名,形参也应为数组名(或或指针变量指针变量,关于指针见第,关于指针见第5章章),形参不能声明形参不能声明为普通变量为普通变量(如如int array;)。实参数组与形参数实参数组与形参数组类型应一致(现都为组类型应一致(现都为i

29、nt型),如不一致,结型),如不一致,结果将出错。果将出错。(2) 需要特别说明的是:需要特别说明的是: 数组名代表数组首元素的数组名代表数组首元素的地址,并不代表数组中的全部元素地址,并不代表数组中的全部元素。因此用数。因此用数组名作函数实参时组名作函数实参时,不是把实参数组的值传递给不是把实参数组的值传递给形参,而形参,而只是将实参数组首元素的地址传递给只是将实参数组首元素的地址传递给形参。形参。形参可以是数组名,也可以是指针变量,它们形参可以是数组名,也可以是指针变量,它们用来接收实参传来的地址。用来接收实参传来的地址。如果形参是数组名,它如果形参是数组名,它代表的是形参数组首元素的地址

30、。在调用函数时,代表的是形参数组首元素的地址。在调用函数时,将实参数组首元素的地址传递给形参数组名。将实参数组首元素的地址传递给形参数组名。这样,这样,实参数组和形参数组就共占同一段内存单元。见图实参数组和形参数组就共占同一段内存单元。见图5.6。如果用二维数组名作为实参和形参,在对形参数组声如果用二维数组名作为实参和形参,在对形参数组声明时,必须指定第二维明时,必须指定第二维(即列即列)的大小,且应与实参的第的大小,且应与实参的第二维的大小相同。二维的大小相同。第一维的大小可以指定,也可以不指定。如第一维的大小可以指定,也可以不指定。如int array310; /形参数组的两个维都指定形参

31、数组的两个维都指定或或 int array10; /第一维大小省略第一维大小省略二者都合法而且等价。但是不能把第二维的大小省略。二者都合法而且等价。但是不能把第二维的大小省略。下面的形参数组写法不合法:下面的形参数组写法不合法:int array; /不能确定数组每一行有多少列元不能确定数组每一行有多少列元素素int array3; /不指定列数就无法确定数组的结不指定列数就无法确定数组的结构构在第二维大小相同的前提下,形参数组的第一维可在第二维大小相同的前提下,形参数组的第一维可以与实参数组不同以与实参数组不同。例如,实参数组定义为。例如,实参数组定义为int score510;而形参数组可

32、以声明为而形参数组可以声明为int array310; /列数与实参数组相同,行列数与实参数组相同,行数不同数不同int array810;这时形参二维数组与实参二维数组都是由相同类型这时形参二维数组与实参二维数组都是由相同类型和大小的一维数组组成的,实参数组名和大小的一维数组组成的,实参数组名score代表代表其首元素其首元素(即第一行即第一行)的起始地址,系统不检查第一的起始地址,系统不检查第一维的大小。维的大小。例例5.8 有一个的矩阵,求矩阵中所有元素中有一个的矩阵,求矩阵中所有元素中的最大值。要求用函数处理。的最大值。要求用函数处理。解此题的算法已在例解此题的算法已在例5.5中介绍。

33、中介绍。#include using namespace std;int main( )int max_value(int array4); int a34=11,32,45,67,22,44,66,88,15,72,43,37; coutmax value is max_value(a)endl; return 0;int max_value(int array4)int i,j,max;max=array00; for( i=0;i3;i+) for(j=0;jmax) max=arrayij; return max;用来存放字符数据的数组是字符数组,字符数组中用来存放字符数据的数组是字符

34、数组,字符数组中的一个元素存放一个字符。字符数组具有数组的共的一个元素存放一个字符。字符数组具有数组的共同属性。由于字符串应用广泛,同属性。由于字符串应用广泛,C和和C+专门为它专门为它提供了许多方便的用法和函数。提供了许多方便的用法和函数。 5.5 字符数组字符数组定义字符数组的方法与前面介绍的类似。例如定义字符数组的方法与前面介绍的类似。例如char c10;c0=I;c1= ;c2=a;c3=m;c4= ;c5=h;c6=a;c7=p;c8=p; c9=y;上面定义了上面定义了c为字符数组,包含为字符数组,包含10个元素。在赋值个元素。在赋值以后数组的状态如图以后数组的状态如图5.7所示

35、。所示。图图5.75.5.1 字符数组的定义和初始化字符数组的定义和初始化用一个字符数组可以存放一个字符串中的用一个字符数组可以存放一个字符串中的字符。如字符。如char str12=I, ,a,m,h,a,p,p,y;用一维字符数组用一维字符数组str来存放一个字符串来存放一个字符串I am happy中的字符。中的字符。字符串的实际长度字符串的实际长度(10)与数组长度与数组长度(12)不相等,在存放上面不相等,在存放上面10个字个字符之外,系统对字符数组最后两元素自动符之外,系统对字符数组最后两元素自动填补空字符填补空字符0。5.5.3 字符串和字符串结束标志字符串和字符串结束标志为了测

36、定字符串的实际长度,为了测定字符串的实际长度,C+规定了规定了一个一个“字符串结束标志字符串结束标志”,以字符,以字符0代代表。在上面的数组中,第表。在上面的数组中,第11个字符为个字符为0,就表明字符串的有效字符为其前面的就表明字符串的有效字符为其前面的10个个字符。也就是说,字符。也就是说,遇到字符遇到字符0就表示字就表示字符串到此结束符串到此结束,由它前面的字符组成字符,由它前面的字符组成字符串。串。例如例如字符串字符串I am happy共有共有10个字符,个字符,但在内存中它共占但在内存中它共占11个字节,最后一个字个字节,最后一个字节节0是由系统自动加上的。是由系统自动加上的。5.

37、5.3 字符串和字符串结束标志字符串和字符串结束标志在程序中往往依靠检测在程序中往往依靠检测0的位置来判定的位置来判定字符串是否结束,而不是根据数组的长度字符串是否结束,而不是根据数组的长度来决定字符串长度来决定字符串长度char str=I am happy;也可以省略花括号,直接写成也可以省略花括号,直接写成char str=I am happy;5.5.3 字符串和字符串结束标志字符串和字符串结束标志字符数组的输入输出可以有两种方法:字符数组的输入输出可以有两种方法:(1) 逐个字符输入输出,如。逐个字符输入输出,如。(2) 将整个字符串一次输入或输出。例如有以下程序段:将整个字符串一次

38、输入或输出。例如有以下程序段:char str20;cinstr; /用字符数组名输入字符串用字符数组名输入字符串coutstr; /用字符数组名输出字符串用字符数组名输出字符串在运行时输入一个字符串,如在运行时输入一个字符串,如 China 在内存中,数组在内存中,数组str的状态如图,在的状态如图,在5个字符的后面自个字符的后面自动加了一个结束符动加了一个结束符0。输出时,逐个输出字符直到遇结束符输出时,逐个输出字符直到遇结束符0,就停止输,就停止输出。输出结果为出。输出结果为 China5.5.4 字符数组的输入输出字符数组的输入输出 如前所述,字符数组名如前所述,字符数组名str代表字

39、符数组第一个元素代表字符数组第一个元素的地址,执行的地址,执行“coutstr;”的过程是从的过程是从str所指向的所指向的数组第一个元素开始逐个输出字符,直到遇到数组第一个元素开始逐个输出字符,直到遇到0为止。为止。请注意:请注意:(1)输出的字符不包括结束符输出的字符不包括结束符0。(2) 输出字符串时,输出字符串时,cout流中用字符数组名,而不是数流中用字符数组名,而不是数组元素名组元素名。 (3) 如果数组长度大于字符串实际长度,也只输出到遇如果数组长度大于字符串实际长度,也只输出到遇0结束。结束。(4) 如果一个字符数组中包含一个以上如果一个字符数组中包含一个以上0,则遇第一,则遇

40、第一个个0时输出就结束。时输出就结束。(5) 用用cin从键盘向计算机输入一个字符串时,从键盘从键盘向计算机输入一个字符串时,从键盘输入的字符串应短于已定义的字符数组的长度,否输入的字符串应短于已定义的字符数组的长度,否则会出现问题。则会出现问题。5.5.4 字符数组的输入输出字符数组的输入输出5.5.5 字符串处理函数字符串处理函数1. 字符串连接函数字符串连接函数 strcat其函数原型为其函数原型为strcat(char,const char);strcat是是string catenate(字符串连接)的缩写。该字符串连接)的缩写。该函数有两个字符数组的参数,函数的作用是:将第函数有两

41、个字符数组的参数,函数的作用是:将第二个字符数组中的字符串连接到前面字符数组的字二个字符数组中的字符串连接到前面字符数组的字符串的后面。第二个字符数组被指定为符串的后面。第二个字符数组被指定为const,以以保证该数组中的内容不会在函数调用期间修改。连保证该数组中的内容不会在函数调用期间修改。连接后的字符串放在第一个字符数组中,函数调用后接后的字符串放在第一个字符数组中,函数调用后得到的函数值,就是第一个字符数组的地址。例如得到的函数值,就是第一个字符数组的地址。例如char str130=Peoples Republic of ;char str2=China;cout字符串字符串2,函数值

42、为一正整数。,函数值为一正整数。(3) 如果字符串如果字符串1str2) cout0) coutyes;4. 字符串长度函数字符串长度函数strlen函数原型为函数原型为strlen(const char);strlen是是string length(字符串长度)的缩写。它是字符串长度)的缩写。它是测试字符串长度的函数。其函数的值为字符串中的测试字符串长度的函数。其函数的值为字符串中的实际长度,不包括实际长度,不包括0在内。如在内。如char str10=China;coutstrlen(str);输出结果不是输出结果不是10,也不是,也不是6,而是,而是5。以上是几种常用的字符串处理函数,除

43、此之外还有以上是几种常用的字符串处理函数,除此之外还有其他一些函数。其他一些函数。例例5.10 有有3个字符串个字符串,要求找出其中最大者。要求用函数调要求找出其中最大者。要求用函数调用。用。程序如下:程序如下:#include #include using namespace std;int main( ) void max_string(char str30,int i); /函数声明函数声明 int i; char country_name330; for(i=0;icountry_namei; /输入输入3个国家名个国家名 max_string(country_name,3); /调用

44、调用max_string函数函数 return 0;5.5.6 字符数组应用举例字符数组应用举例void max_string(char str30,int n) int i; char string30; strcpy(string,str0); /使使string的值为的值为str0的值的值 for(i=0;i0) /如果如果stristring strcpy(string,stri); /将将stri中的字符串复制到中的字符串复制到string coutendlthe largest string is: stringendl;5.5.6 字符数组应用举例字符数组应用举例用字符数组来存放

45、字符串并不是最理想和最安全的用字符数组来存放字符串并不是最理想和最安全的方法。方法。C+提供了一种新的数据类型提供了一种新的数据类型字符串类型字符串类型(string类型类型),在使用方法上,它和,在使用方法上,它和char、int类型类型一样,可以用来定义变量,这就是字符串变量一样,可以用来定义变量,这就是字符串变量用一个名字代表一个字符序列。用一个名字代表一个字符序列。实际上,实际上,string并不是并不是C+语言本身具有的基本类语言本身具有的基本类型,它是在型,它是在C+标准库中声明的一个字符串类,用标准库中声明的一个字符串类,用这种类可以定义对象。每一个字符串变量都是这种类可以定义对

46、象。每一个字符串变量都是string类的一个对象。类的一个对象。*5.6 C+处理字符串的方法处理字符串的方法字符串类与字符串变量字符串类与字符串变量1. 定义字符串变量定义字符串变量和其他类型变量一样,字符串变量必须先定义后使和其他类型变量一样,字符串变量必须先定义后使用,定义字符串变量要用类名用,定义字符串变量要用类名string。如如string string1; /定义定义string1为字符串变量为字符串变量string string2=China; /定义定义string2同时对其初始同时对其初始化化应当注意:应当注意: 要使用要使用string类的功能时,必须在本文类的功能时,必

47、须在本文件的开头将件的开头将C+标准库中的标准库中的string头文件包含进来,头文件包含进来,即应加上即应加上#include /注意头文件名不是注意头文件名不是string.h5.6.1 字符串变量的定义和引用字符串变量的定义和引用2. 对字符串变量的赋值对字符串变量的赋值在定义了字符串变量后,可以用赋值语句对它赋予一个字符在定义了字符串变量后,可以用赋值语句对它赋予一个字符串常量,如串常量,如string1=Canada;既可以用字符串常量给字符串变量赋值,也可以用一个字符既可以用字符串常量给字符串变量赋值,也可以用一个字符串变量给另一个字符串变量赋值。如串变量给另一个字符串变量赋值。如

48、 string2=string1; /假设假设string2和和string1均已定义为均已定义为字符串变量字符串变量不要求不要求string2和和string1长度相同,假如长度相同,假如string2原来是原来是China,string1原来是原来是Canada,赋值后赋值后string2也变成也变成Canada。在定义字符串变量时不需指定长度,长度随其在定义字符串变量时不需指定长度,长度随其中的字符串长度而改变。中的字符串长度而改变。可以对字符串变量中某一字符进行操作,如可以对字符串变量中某一字符进行操作,如 string word=Then; /定义并初始化字符串变量定义并初始化字符串

49、变量wordword2=a; /修改序号为修改序号为2的字符,修改后的字符,修改后word的值为的值为Than5.6.1 字符串变量的定义和引用字符串变量的定义和引用3. 字符串变量的输入输出字符串变量的输入输出可以在输入输出语句中用字符串变量名,输入输出可以在输入输出语句中用字符串变量名,输入输出字符串,如字符串,如cin string1; /从键盘输入一个字符串给从键盘输入一个字符串给字符串变量字符串变量string1cout string1; /从键盘输入一个字符串给字符串从键盘输入一个字符串给字符串变量变量string1cout(大于大于)、=(大于或等大于或等于于)、=(小于或等于小

50、于或等于)等关系运算符来进行字符串的比较。等关系运算符来进行字符串的比较。使用这些运算符比使用使用这些运算符比使用5.5.5节中介绍的字符串函数直观而方便。节中介绍的字符串函数直观而方便。5.6.2 字符串变量的运算字符串变量的运算不仅可以用不仅可以用string定义字符串变量,也可以用定义字符串变量,也可以用string定义字符串数组。如定义字符串数组。如string name5; /定义一个字符串数组,它包含定义一个字符串数组,它包含5个字符串元素个字符串元素string name5=Zhang,Li,Fun,Wang,Tan; /定义一个字符串数组并初始化定义一个字符串数组并初始化此时此

51、时name数组的状况如图数组的状况如图5.11所示。所示。图图5.115.6.3 字符串数组字符串数组可以看到:可以看到: (1) 在一个字符串数组中包含若干个在一个字符串数组中包含若干个(现为现为5个个)元素,每个元素,每个元素相当于一个字符串变量。元素相当于一个字符串变量。(2) 并不要求每个字符串元素具有相同的长度,即使对同一并不要求每个字符串元素具有相同的长度,即使对同一个元素而言,它的长度也是可以变化的,当向某一个个元素而言,它的长度也是可以变化的,当向某一个元素重新赋值,其长度就可能发生变化。元素重新赋值,其长度就可能发生变化。(3) 在字符串数组的每一个元素中存放一个字符串,而不

52、是在字符串数组的每一个元素中存放一个字符串,而不是一个字符,这是字符串数组与字符数组的区别。如果一个字符,这是字符串数组与字符数组的区别。如果用字符数组存放字符串,一个元素只能存放一个字符,用字符数组存放字符串,一个元素只能存放一个字符,用一个一维字符数组存放一个字符串。用一个一维字符数组存放一个字符串。(4) 每一个字符串元素中只包含字符串本身的字符而不包括每一个字符串元素中只包含字符串本身的字符而不包括0。可见用字符串数组存放字符串以及对字符串进行处理是很可见用字符串数组存放字符串以及对字符串进行处理是很方便的。方便的。在定义字符串数组时怎样给数组分配存储空间呢?在定义字符串数组时怎样给数

53、组分配存储空间呢?实际上,实际上,编译系统为每一个字符串变量分配编译系统为每一个字符串变量分配4个字节,在这个存储单个字节,在这个存储单元中,并不是直接存放字符串本身,而是存放字符串的地元中,并不是直接存放字符串本身,而是存放字符串的地址。在本例中,就是把字符串址。在本例中,就是把字符串Zhang的地址存放在的地址存放在name0,把字符串把字符串Li 的地址存放在的地址存放在name1,把字符把字符串串Fun的地址存放在的地址存放在name2图图5.11只是一个示意只是一个示意图。在字符串变量中存放的是字符串的指针图。在字符串变量中存放的是字符串的指针(字符串的地字符串的地址址)。例例5.1

54、1 输入输入3个字符串,要求将字母按由小到大的顺序输出。个字符串,要求将字母按由小到大的顺序输出。#include #include using namespace std;int main( )string string1,string2,string3,temp; coutstring1string2string3; /输入输入3个字符串个字符串 if(string2string3) temp=string2;string2=string3;string3=temp; /使串使串2串串3 if(string1=string2) coutstring1 string2 string3endl

55、; /如果串如果串1串串2,则串,则串1串串2串串3else if(string1=string3) coutstring2 string1 string3endl; /如果串如果串1串串2,且串,且串1串串3,则串,则串2串串1串串3 else coutstring2 string3 string1endl; /如果串如果串1串串2,且串,且串1串串3,则串,则串2串串3串串1运行情况如下:运行情况如下: please input three strings: China U.S.A. Germany China Germany U.S.A.5.6.4 字符串运算举例字符串运算举例void

56、selectsort(string a,int n)/ int i,j,k,count=0;bool flag=true;for(i=0;in-1;i+)k=i;for(j=i+1;jaj)k=j;if(i!=k) string temp;count+;temp=ak;ak=ai;ai=temp; for( i=0;in;i+) coutaiendl;#include stdafx.h#include #include #include using namespace std;int main(int argc, char* argv) string counts4=xxz,aaab,aaaa

57、af,1123;selectsort(counts,4); return 0;例例5.12 一个班有一个班有n个学生,需要把每个学生个学生,需要把每个学生的简单材料的简单材料(姓名和学号姓名和学号)输入计算机保存。输入计算机保存。然后可以通过输入某一学生的姓名查找其有然后可以通过输入某一学生的姓名查找其有关资料。当输入一个姓名后,程序就查找该关资料。当输入一个姓名后,程序就查找该班中有无此学生,如果有,则输出他的姓名班中有无此学生,如果有,则输出他的姓名和学号,如果查不到,则输出和学号,如果查不到,则输出“本班无此本班无此人人”。为解此问题,可以分别编写两个函数,函数为解此问题,可以分别编写两个函数,函数input_data用来用来输入输入n个学生的姓名和学号,函数个学生的姓名和学号,函数search用来查找要找的学用来查找要找的学生是否在本班。生是否在本班。程序可编写如下:程序可编写如下: #include #include using namespace std;string name50,num50; /定义两个

温馨提示

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

评论

0/150

提交评论