C++数组和字符串_第1页
C++数组和字符串_第2页
C++数组和字符串_第3页
C++数组和字符串_第4页
C++数组和字符串_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

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

文档简介

1、chap4 理解数组的定义和使用,掌握数组的理解数组的定义和使用,掌握数组的常用操作和字符串的处理。常用操作和字符串的处理。数组的应用,字符串的处理方法。数组的应用,字符串的处理方法。 讲授与上机相结合。讲授与上机相结合。chap4 数组的概念;数组的概念;数组的应用;数组的应用;数组的定义;数组的定义; 字符串字符串本章授课内容本章授课内容 常见错误常见错误chap44-1 数组数组的概念的概念 数组是一组有序数据的集合;数组中的每一个元素数组是一组有序数据的集合;数组中的每一个元素都属于同一个数据类型。用一个统一的数组名和下标都属于同一个数据类型。用一个统一的数组名和下标来唯一的确定数组中

2、的元素。来唯一的确定数组中的元素。 在科学计算和数据处理中,要用到成批数据,这些在科学计算和数据处理中,要用到成批数据,这些数据类型相同,且彼此间存在一定的顺序关系,为了数据类型相同,且彼此间存在一定的顺序关系,为了便于处理,引入了数组类型。便于处理,引入了数组类型。一维数组一维数组a0a1a2a3a4a5数列数列583296chap4例例4.1.1:4.1.1:某班有某班有8080名学生名学生, ,求该班成绩的平均分求该班成绩的平均分 #include void main( ) int j , sum , s ; float ave ; sum=0; for ( j=1; js; sum=s

3、um+s; ave=sum/80.0; cout “ave=”ave;假设现在要求保存每个学生的成绩假设现在要求保存每个学生的成绩, ,那就不能只使用一个变量那就不能只使用一个变量scorescore了了, ,而需要而需要4040个变量个变量, ,但这样一来输入、但这样一来输入、输出、计算都会变得繁琐输出、计算都会变得繁琐. . 在这种在这种情况下情况下, ,我们可以使用数组类型我们可以使用数组类型, ,说说明一个含有明一个含有4040个元素的数组个元素的数组, ,每个每个数组元素存放一个成绩数组元素存放一个成绩, ,成绩的输成绩的输入、输出、计算都可通过循环来实入、输出、计算都可通过循环来实

4、现现一、数组的引入一、数组的引入chap4#include void main( ) int j , sum , s80 ; float ave ; sum=0; for ( j=0; jsj; sum=sum+sj; ave=sum/80.0; cout “ave=”n;int an;._ 常量表达式中不能有变量常量表达式中不能有变量 常量表达式的值不能是实数常量表达式的值不能是实数_ 下标从下标从0开始开始, a0 , a1 a9,没有,没有a10;_ 常量表达式的值为元素的个数常量表达式的值为元素的个数错误错误chap4二、一维数组的存储结构二、一维数组的存储结构a_ 一个数组的所有元素

5、都是连续存储的一个数组的所有元素都是连续存储的_ 数组元素为数组元素为: a0,a1,a2.a9int a10;_ 所占空间为所占空间为: 类型长度类型长度*元素个数元素个数 84 : 66 80 95101010141018 :1046a0a1a2 :a9chap4三、数组元素的引用形式三、数组元素的引用形式_ 数组元素的引用数组元素的引用: 数组名数组名下标下标a0 = a2+a4*2240int a10;a0=2;下标下标 说明说明(1) 下标可以是整型常量或整型表达式下标可以是整型常量或整型表达式 如如: a1 , a2*3(2) 数组定义为数组定义为 int a5 , 数组长度为数组

6、长度为5 而下标在而下标在0 - 4之内之内, 即即a0 - a4注意注意: 如果出现如果出现 a5 = 72 ; 编译时不会指出错误编译时不会指出错误, 系统会系统会将将a4后下一个存储单元后下一个存储单元 赋值为赋值为72, 但这样可能会破坏数但这样可能会破坏数组以外其他变量的值。组以外其他变量的值。chap4四、一维数组的初始化四、一维数组的初始化概念概念 : 在定义一维数组时对各元素指定初始在定义一维数组时对各元素指定初始 值称为数组的初始化值称为数组的初始化如如: int a5 = 1 , 3 , 5 , 7 , 9 ;2. 说明说明 初值用初值用 括起来括起来, 数据之间用逗号分开

7、数据之间用逗号分开. 对数组的全体元素指定初值,可以不指明数组对数组的全体元素指定初值,可以不指明数组的长度的长度, 系统会根据系统会根据 内数据的个数确定数组内数据的个数确定数组的长度。的长度。 如如 : int a = 1 , 3 , 5 , 7 , 9 ;chap4(3) 对数组中部分元素指定初值对数组中部分元素指定初值 ( 这时不能这时不能 省略数组长度省略数组长度 ) 如如 : int a5 = 1 , 3 , 5 ; (4) 使数组中的全部元素初始值都为使数组中的全部元素初始值都为 0 如如: int a5 = 0 , 0 , 0 , 0 , 0 ;更简单的写法:更简单的写法: i

8、nt a5= 0 ;chap4例例4.2.1: 输入输入n个成绩个成绩,求平均分求平均分#includevoid main( )int s,n,i;float aver=0.0;cinn;for ( i=0; is; aver+=s;aver/=n;coutsi; aver+=si; aver/=n;for ( i=0 ; iaver) coutai;输入整个数组元素输入整个数组元素:for (i=0;iai;输出方法:输出方法:输出第输出第i个数组元素:个数组元素:coutai;输出整个数组元素:输出整个数组元素:for (i=0;i10;i+) coutai;chap4_例例4.2.2:用

9、一维数组求用一维数组求Fibonacci 数列数列#includevoid main() int i; int f 20 = 1,1; for ( i=2; i20; i+ ) f i = f i-2 +f i-1; for ( i=0; i20; i+) if ( i%5 = 0) coutn; cout“t”f i ; 六、一维数组程序设计举例六、一维数组程序设计举例 1 1 0 0 0 0 : 0f0f1f2f3f4f5 :f19i=2f2=f0+f1i=3f3=f1+f2i=4f4=f2+f323586765chap4例例4.2.3: 输入一个数据,在已知数组中查找是否有该数据输入一个

10、数据,在已知数组中查找是否有该数据 5 8 0 1 9 2 6 3 7 49a0a1a2a3a4a5a6a7a8a9#include void main() int i , x ; int a10= 5, 8, 0, 1, 9, 2, 6, 3, 7, 4 ; cinx; for ( i=0 ; i10 ; i+) if ( x=ai ) cout“find!”endl; break; if ( i=10 ) cout “no find!” endl; chap4课堂练习:课堂练习:有一个数列有一个数列,它的第一项为它的第一项为0,第二项为第二项为1,以后以后每一项都是它的前两项之和每一项都是

11、它的前两项之和, 试生成此数列试生成此数列的前的前20项项,并按逆序显示出来并按逆序显示出来.chap4练习答案:练习答案:#include Void main( ) int f20=0,1, j; for(j=2;j=0; j- -) / 逆序显示逆序显示 coutfj; coutaij;输入整个数组的元素:输入整个数组的元素:for ( i=0; i2; i+ ) for ( j=0; jaij;输出方法:输出方法:输出第输出第i行第行第j列元素:列元素:coutaij;输出整个数组的元素:输出整个数组的元素:for ( i=0; i2; i+) for ( j=0; j3; j+) co

12、utaij;chap4六、二维数组程序设计举例六、二维数组程序设计举例例例4.2.4: 有一个有一个3*4的矩阵的矩阵, 编编程求出其中的最大值及其所在程求出其中的最大值及其所在的行号和列号。的行号和列号。chap452093712610418maxrowcol1212#include void main( ) int i , j, row=0, col=0 , max ; int a34= 5, 2, 0, 9, 3, 7, 12, 6,10, 4, 1, 8 ; max=a00; for ( i=0 ; i3 ; i+ ) for ( j=0 ; jmax ) max=aij ; row=

13、i ; col=j ; cout“max=” max; cout“max=a”row col;输出输出:max=12max=a12chap4例例4.2.5: 将一个矩阵进行转置将一个矩阵进行转置(即原来的行变为列即原来的行变为列)5209371261041840#includevoid main( ) int a34, b43 , i , j ; for ( i=0 ; i3 ; i+ ) for ( j=0 ; jaij ; for ( i=0 ; i3 ; i+ ) for (j=0 ; j4 ; j+) bji=aij; for ( i=0 ; i4 ; i+ ) for ( j=0 ;

14、 j3 ; j+ ) cout bij ; cout endl; 输入数组输入数组a进行矩阵转置进行矩阵转置输出数组输出数组ba02b20a21b12chap4课堂练习:课堂练习:1. 数组元素数组元素ai是该数组中的第是该数组中的第个元素个元素.2 . 元素类型为元素类型为int的数组的数组a10共占用共占用字节的存储字节的存储空间,其中元素空间,其中元素a5的字节地址为的字节地址为.3 .元素类型为元素类型为double的数组的数组a46共占用共占用字节的字节的存储空间,其中元素存储空间,其中元素a25的字节地址为的字节地址为.4.元素类型为元素类型为char的数组的数组a1030共占用共

15、占用字节的字节的存储空间,其中元素存储空间,其中元素a34的字节地址为的字节地址为.答案答案: 1. i+1 2. 40 a+20 3. 192 a+136 4. 300 a+94 chap4 第一方面:利用数组进行数值计算第一方面:利用数组进行数值计算: :书中给出了三个例子,一个是计算个人所得税,二是进行书中给出了三个例子,一个是计算个人所得税,二是进行矩阵求和,三是按月进行公司产值计算,都具有代表性矩阵求和,三是按月进行公司产值计算,都具有代表性 P103(2)P103(2)4-3 数组的应用数组的应用 第二方面:利用数组进行统计第二方面:利用数组进行统计: : 书中给出了两个例子,一是

16、统计每个候选人的选票,书中给出了两个例子,一是统计每个候选人的选票, 二是统计每个用电区间的居民户数二是统计每个用电区间的居民户数:P105(1):P105(1) 第三方面:数据排序:第三方面:数据排序:/数据结构数据结构 书中介绍了两种方法:选择排序和插入排序书中介绍了两种方法:选择排序和插入排序( (见后见后) ) 第四方面:查找数据:第四方面:查找数据:/数据结构数据结构 书中介绍了两种方法:顺序查找(不要求数组元素有序书中介绍了两种方法:顺序查找(不要求数组元素有序 排列)和二分查找(要求数组元素有序排列)排列)和二分查找(要求数组元素有序排列)P109(1)P109(1)chap4基

17、本算法举例基本算法举例1.排序排序(1)冒泡法排序冒泡法排序例例4.3.1:输入:输入5个数个数,进行由小到大排序进行由小到大排序: 9 8 5 4 2算法:两两比较,大数向后移,找到最大数放在最后,再在剩余的的4个数中进行两两比较,找到最大数,以此类推.最后,小数排在开始,相当于浮起,故称之为:冒泡法冒泡法chap485429542842524比较4次第一轮比较3次第二轮比较2次第三轮比较1次第四轮9854289542859428549285425842548254242452对 个数,则要进行趟扫描,在第 趟扫描中要进行 次比较。可以推知:chap4/*排序排序*/ for (i=0; i

18、N-1; i+) for ( j=0;jaj+1) t =aj; aj=aj+1; aj+1=t;chap4#include#define N 10void main() int i, j, aN, t; for(i=0;iai; for(i=0;iN;i+)/输出输出 coutai ;/*排序排序*/for (i=0;iN-1;i+) for(j=0;jaj+1) t=aj; aj=aj+1; aj+1=t;for(i=0;iN;i+) /输出输出 coutai ;源程序源程序: 例例4.3.1 chap4(2)选择法排序选择法排序特点:比较后不立即互换元素,而是记下其位置并在每一轮比较完毕

19、后和()互换首先,比较的元素不同,以降序为例,是当前元素与上次比较後的最大元素进行比较,因此,在进行比较之前,要有一个初始化最大元素的过程其次,确定完毕的元素的互换是在每一轮完成后进行的,而不是在比较后进行的再次,互换元素的不同,为(i)和(iMax)举例原始数据: 3,5,7,9,4 要求:降序chap4第一轮比较,初始化设最大元素下标为第一轮比较,初始化设最大元素下标为 k03579k=0 3579 k=13579 k=23579k=3k=3A(0) 与与 A(k)交换交换的结果的结果:9573chap4#include const int N=10;void main( ) int aN

20、 , i , j , k , t; for ( i=0 ; iai; for ( i=0 ; iN-1 ; i+) k=i ; for ( j=i+1 ; jak ) k=j ; if ( k!=i ) t=ai ; ai=ak ; ak=t ; 源程序源程序:例例4.3.2for ( i=0 ; iN ; i+) coutai;A0 A1 A2 A n-1 A0 A1 A2 A n-1 A0 A i-1 A i . . A n-1 A0 A1 . . A n-2 A n-1 chap42.在有序数组中插入一个数后使原数组仍在有序数组中插入一个数后使原数组仍然有序。然有序。例如:例如: 3 5

21、 7 12 18(m=5),), 将将b=10插入插入步骤:步骤:(1)要找到要找到b在数组中的位置在数组中的位置(2)给给b让位置让位置(3)将将b放到该位置上放到该位置上(4)数组元素的个数数组元素的个数 m 加加 1chap43571218(2)357121218(3)for(i=0;ib)break;for(j=m-1;j=i;j-) aj+1=aj;ai=b;121810(1)3571218a0a1a2a3a4a5程序见例程序见例4.3.3m=m+1;(4)chap43 5 7 10 12 18 (m=6), 将将b=10删除删除步骤:步骤:(1) 要找到要找到b在数组中的位置在数组

22、中的位置(2) 后面的数组元素依次前移后面的数组元素依次前移,覆盖该位置覆盖该位置 上的数组元素即可实现删除上的数组元素即可实现删除(3) 数组元素的个数数组元素的个数 m 减减 13.在有序数组中删除一个数在有序数组中删除一个数,例如例如:chap4357101218(1)357101218(2)357121218for(i=0;im;i+) if (ai=b)break;101218for(j=i;jc0c1c2 ; for ( i=0 ; i ci ;2. 整个数组的输入输出,即按数组名输入输出整个数组的输入输出,即按数组名输入输出 (仅用于字符数组仅用于字符数组),因数组名本身代表数组

23、的,因数组名本身代表数组的 首地址首地址四、字符数组的输入和输出四、字符数组的输入和输出chap4注意注意 : (1) 输入、输出字符串时不包括输入、输出字符串时不包括“ ”(2) cin输入时系统一直读取字符,直到遇到输入时系统一直读取字符,直到遇到“空白空白 符符”为止。为止。例如:输入数据例如:输入数据 hello world C数组中内容为数组中内容为hellocoutc;cinsetw(20)c;chap4补充补充get( )函数函数(包含在包含在“iostream.h”) 如想输入含空格的字符串,如如想输入含空格的字符串,如“hello world”hello world” 只能使

24、用只能使用get( )get( )函数函数,使用格式如下:,使用格式如下: cin.getcin.get( (字符数组名,字符串长度,规定的结束符字符数组名,字符串长度,规定的结束符) ) 其中,规定的结束符省略时,默认为回车键。其中,规定的结束符省略时,默认为回车键。 如:如: char str20;char str20; cin.getcin.get(str,20)(str,20)chap4五、字符串处理函数五、字符串处理函数字符串函数的原型保存在字符串函数的原型保存在中中v 字符串连接函数字符串连接函数: strcat(s1,s2); char *strcat ( char *s1, c

25、onst char *s2 ); 连接连接s1和和s2两个字符串赋给两个字符串赋给s1,返回,返回s1的值的值v 字符串拷贝函数字符串拷贝函数: strcpy(s1,s2); char *strcpy ( char *s1, const char *s2 ); 将将s2中的字符串赋给中的字符串赋给s1,返回,返回s1的值的值v 字符串比较函数字符串比较函数: strcmp(s1,s2)v 求字符串长度函数:求字符串长度函数:strlen(s) 函数值为整数函数值为整数(返回字符个数返回字符个数)(参数为字符数组名)(参数为字符数组名)chap4六、字符数组程序应用六、字符数组程序应用v 字符串

26、的长度字符串的长度v 逆序逆序v 字符串函数字符串函数chap4_例例4.4.1:求字符串长度:求字符串长度扫描数组扫描数组,只要不是只要不是0,计数器就加计数器就加1源程序源程序:#includevoid main() int i; char s50; cins; for (i=0;i50 & si!= 0; i+) ; cout“Lengh of “s“is”i ;ac d0bifor (i=0; i50& si+ != 0 ;) ;ii=0chap4_字符串函数字符串函数/*例例4.4.2: STRCAT*/#includevoid main() int i , j; c

27、har s140, s220; cins1s2; for( i=0; i40 & s1i!=0;i+) ; for( j=0; j20 & s2j!=0;j+)s1i+=s2 j; s1i=0; /*s1i=s2j;*/ couts1;s1s2acd0beg0facdebfg0s1/ i=strlen(s1);chap4/*例例4.4.3: STRCPY*/#include void main() char p180,p280; int i; cinp2; for (i=0;p2i!=0;i+) p1i=p2i; p1i=0; cout“p1=“p1“np2=“p2“n”;ch

28、ap4 例例 4.4.4(综合举例)(综合举例) 某班有某班有50个个学生,期终考试学生,期终考试8门课程。求每个学门课程。求每个学生总成绩、平均成绩,并按总成绩高生总成绩、平均成绩,并按总成绩高分到低分输出。分到低分输出。( 上机作业上机作业 ) skipchap4char name5112; /*采用外部数组实现数据传递采用外部数组实现数据传递*/float cj519; float tacj513; #includevoid input( ); /*函数声明函数声明*/void count( ); void sort( ); void output( );void main( ) inp

29、ut( ); /*调用输入函数调用输入函数*/ count( ); /*调用计算函数调用计算函数*/ sort( ); /*调用排序函数调用排序函数*/ output( ); /*调用输出函数调用输出函数*/ chap4void input( ) /*输入函数输入函数*/ int i, j; for(i=1; i=50; i+) cout“请输入第请输入第”inamei; for(j=1; jcjij; chap4void count( ) /*计算函数计算函数*/ int i, j; for(i=1; i=50; i+) tacji1=0; for(j=1; j=8; j+) tacji1+

30、= cjij; tacji2= tacji1/ 8; chap4 void sort( ) /*排序函数排序函数*/ int i , flag; char ts12; float tc; do flag=0; for(i=1; itacji1) strcpy(ts, namei);); strcpy(namei,namei+1);); strcpy(namei+1,ts);); /交换姓名交换姓名 chap4 for(j=1; j=8; j+)/*交换交换8门课程成绩门课程成绩*/ t=cj i j; cj i j=cj i+1 j; cj i+1 j=t; t= tacj i 1; tacj

31、 i 1= tacj i+1 1; tacj i+1 1 =t; /*交换总成绩交换总成绩*/ t= tacj i 2; tacj i 2 = tacj i+1 2; tacj i+1 2 = t; /*交换平均成绩交换平均成绩*/ flag=1; while(flag=1);); chap4void output( ) /*输出函数输出函数*/ int i; cout50个学生成绩处理结果如下:个学生成绩处理结果如下: n; cout 姓名姓名 课程课程1 课程课程2 课程课程3 课程课程4 课程课程5 课程课程6 课程课程7 课程课程8 总成绩总成绩 平均成绩平均成绩 名次名次n; for

32、(i=1; i=50; i+) coutnamei; for(j=1; j=8; j+) coutcjij; couttacji1 tacji2 i; coutn; chap4常见错误常见错误1、数组下标越界。、数组下标越界。如:如: int a10=1, 2, 3, 4, 5, 6, 7, 8, 9, 10;for (i=1; i=10; i+) cout ai;C+规定定义时用规定定义时用a10,表示数组有,表示数组有10 个元素,个元素,而不是可以用的最大下标值为而不是可以用的最大下标值为10。数组只包括。数组只包括a0到到a910 个元素,因此用个元素,因此用a10超出范围。超出范围。

33、for (i=0; i=9; i+) cout ai;chap42、数组整体赋值。、数组整体赋值。int a10;int b10=1, 2, 3, 4, 5, 6;a=b;+不允许对数组进行整体操作,如果把数不允许对数组进行整体操作,如果把数组组 a 赋值给数组赋值给数组 b ,需要用循环语句来实现。,需要用循环语句来实现。for (i=0; i10; i+) ai=bi;chap43、误以为数组名代表数组中全部元素。、误以为数组名代表数组中全部元素。main( ) int a4=1, 2, 3, 4; cout a;企图用数组名代表全部元素。企图用数组名代表全部元素。+中,数组名代表数组首地

34、址,不能通过中,数组名代表数组首地址,不能通过数组名输出数组名输出4个整数。个整数。cout a0 a1 a2 a3);或:或:for (i=0; i=3; i+) cout ai;chap44、引用数组元素时使用圆括号。、引用数组元素时使用圆括号。cout a(5);5、向一个字符数组赋字符串。、向一个字符数组赋字符串。char str20;str=I am a boy.;这种错误和第二种错误为一种错误,即不支这种错误和第二种错误为一种错误,即不支持对数组的整体操作。持对数组的整体操作。strcpy(str, I am a bpy.);chap46、构造字符串时忘记在末尾应加、构造字符串时忘记在末尾应加0。i=0;while (ch=getchar( )!=n) stri+=ch;cout str;由于构造的字符串没有加结束标志,当用由于构造的字符串没有加结束标志,当用cout函函数输出数输出str时,从时,从str的起始地址开始一个个的输出,的起始地址开始一个个的输出,输出完读入的字符后,没有遇到输出完读入的字符后,没有遇到0,继续输出,这,继续输出,这时的内容已不再是字符串中的字符。因此,时的内容已不再是字符串中的字符。因此, 在自己

温馨提示

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

评论

0/150

提交评论