C++数组和字符串课件

上传人:艳*** 文档编号:242949049 上传时间:2024-09-12 格式:PPT 页数:77 大小:642KB
返回 下载 相关 举报
C++数组和字符串课件_第1页
第1页 / 共77页
C++数组和字符串课件_第2页
第2页 / 共77页
C++数组和字符串课件_第3页
第3页 / 共77页
点击查看更多>>
资源描述
,上一页,下一页,chap4,数组和字符串,第四章,【教学目的与要求】,理解数组的定义和使用,掌握数组的常用操作和字符串的处理。,【教学重点与难点】,数组的应用,字符串的处理方法。,【教学方法】,讲授与上机相结合。,数组的概念;,数组的应用;,数组的定义;,字符串,本章授课内容,常见错误,4-1 数组,的概念,数组是一组有序数据的集合;数组中的每一个元素都属于同一个数据类型。用一个统一的数组名和下标来唯一的确定数组中的元素。,在科学计算和数据处理中,要用到成批数据,这些数据类型相同,且彼此间存在一定的顺序关系,为了便于处理,引入了数组类型。,一维数组,a0,a1,a2,a3,a4,a5,数列,5,8,3,2,9,6,例4.1.1:某班有80名学生,求该班成绩的平均分,#include ,void main( ), int j , sum , s ;,float ave ;,sum=0;,for ( j=1; js;,sum=sum+s;,ave=sum/80.0;,cout “ave=”ave;,假设现在要求保存每个学生的成绩,那就不能只使用一个变量score了,而需要40个变量,但这样一来输入、输出、计算都会变得繁琐. 在这种情况下,我们可以使用数组类型,说明一个含有40个元素的数组,每个数组元素存放一个成绩,成绩的输入、输出、计算都可通过循环来实现,一、数组的引入,#include ,void main( ), int j , sum ,s80 ;,float ave ;,sum=0;,for ( j=0; j,sj,;,sum=sum+,sj,;,ave=sum/80.0;,cout “ave=”n;,int an;,.,常量表达式中不能有变量,常量表达式的值不能是实数,下标从,0,开始,a0 , a1 a9,,,没有,a10;,常量表达式的值为元素的个数,错误,返 回,二、一维数组的存储结构,a,一个数组的所有元素都是连续存储的,数组元素为:,a0,a1,a2.a9,int a10;,所占空间为:,类型长度*元素个数,84,:,66,80,95,1010,1014,1018,:,1046,a0,a1,a2,:,a9,返 回,数组首地址,三、数组元素的引用形式,数组元素的引用,:,数组名,下标,a0 = a2+a4*2,2,4,0,int a10;,a0=2;,下标,说明,(1),下标可以是整型常量或整型表达式,如,: a1 , a2*3,(2) 数组定义为,int a5, 数组长度为5,而下标在0 - 4之内, 即,a0 - a4,注意: 如果出现 a5 = 72 ; 编译时不会指出错误, 系统会将a4后下一个存储单元 赋值为72, 但这样可能会破坏数组以外其他变量的值。,返 回,四、一维数组的初始化,概念,:,在定义一维数组时对各元素指定初始,值称为数组的初始化,如: int a5 = 1 , 3 , 5 , 7 , 9 ;,2. 说明,初值用, ,括起来,数据之间用逗号分开,.,对数组的全体元素指定初值,可以不指明数组的长度,系统会根据, ,内数据的个数确定数组的长度。,如,:,int,a, ,= 1 , 3 , 5 , 7 , 9 ;,(3) 对数组中部分元素指定初值 ( 这时不能,省略数组长度 ),如 : int a,5,= 1 , 3 , 5 ;,(4) 使数组中的全部元素初始值都为 0,如: int a5 = 0 , 0 , 0 , 0 , 0 ;,更简单的写法: int a5= 0 ;,例4.2.1: 输入n个成绩,求平均分,#include,void 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;,返 回,例,4.2.2:,用一维数组求,Fibonacci,数列,#include,void main(), int i;,int,f 20 = 1,1,;,for ( i=,2,; i,20,; i+ ),f i = f i-2 +f i-1;,for ( i=0; i20; i+), if ( i%5 = 0) coutn;,cout“t”x;,for ( i=0 ; i10 ; i+),if ( x,=,ai ), cout“find!”endl;,break;,if ( i=10 ),cout “no find!” endl;,课堂练习:,有一个数列,它的第一项为0,第二项为1,以后每一项都是它的前两项之和, 试生成此数列,的前20项,并按逆序显示出来.,练习答案:,#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+),coutaij;,返回,六、二维数组程序设计举例,例4.2.4: 有一个3*4的矩阵, 编程求出其中的最大值及其所在的行号和列号。,5,2,0,9,3,7,12,6,10,4,1,8,max,row,col,12,1,2,#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 ; j,max,),max=aij,;,row=i ; col=j ; ,cout“max=” max;,cout“max=a”row,col;,输出:,max=12,max=a12,例4.2.5: 将一个矩阵进行转置(即原来的行变为列),5,2,0,9,3,7,12,6,10,4,1,8,4,0,#include,void 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+),b,j,i,=a,i,j,;,for ( i=0 ; i,4,; i+ ),for ( j=0 ; j,3,; j+ ),cout bij ;,cout endl;,输入数组a,进行矩阵转置,输出数组b,a02,b20,a21,b12,返回,课堂练习:,1. 数组元素ai是该数组中的第个元素.,2 . 元素类型为int的数组a10共占用字节的存储空间,其中元素a5的字节地址为.,3 .元素类型为double的数组a46共占用字节的存储空间,其中元素a25的字节地址为.,4.元素类型为char的数组a1030共占用字节的存储空间,其中元素a34的字节地址为.,答案: 1. i+1,2. 40 a+20,3. 192 a+136,4. 300 a+94,第一方面:利用数组进行数值计算:,书中给出了三个例子,一个是计算个人所得税,二是进行矩阵求和,三是按月进行公司产值计算,都具有代表性,P103(2),4-3 数组的应用,第二方面:利用数组进行统计,:,书中给出了两个例子,一是统计每个候选人的选票,,二是统计每个用电区间的居民户数,:P105(1),第三方面:数据排序:,/,数据结构,书中介绍了两种方法:选择排序和插入排序,(,见后,),第四方面:查找数据:,/,数据结构,书中介绍了两种方法:顺序查找(不要求数组元素有序,排列)和二分查找(要求数组元素有序排列),P109(1),基本算法举例,1.排序,(1)冒泡法排序,例:输入5个数,进行由小到大排序:,9 8 5 4 2,算法:两两比较,大数向后移,找到最大数放在最后,再在剩余的的4个数中进行两两比较,找到最大数,以此类推.最后,小数排在开始,相当于浮起,故称之为:,冒泡法,8,5,4,2,9,5,4,2,8,4,2,5,2,4,比较4次,第一轮,比较3次,第二轮,比较2次,第三轮,比较1次,第四轮,9,8,5,4,2,8,9,5,4,2,8,5,9,4,2,8,5,4,9,2,8,5,4,2,5,8,4,2,5,4,8,2,5,4,2,4,2,4,5,2,对,n,个数,则要进行,n-1,趟扫描,在第,i,趟扫描中要进行,n-i,次比较。,可以推知:,/*排序*/,for (i=0; iN-1; i+),for ( j=0;jaj+1),t =aj;,aj=aj+1;,aj+1=t;,#include,#define N 10,void 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 ;,源程序:,例,(2)选择法排序,特点:比较后不立即互换元素,而是记下其位置并在每一轮比较完毕后和()互换,首先,比较的元素不同,以降序为例,是当前元素与上次比较後的最大元素进行比较,因此,在进行比较之前,要有一个初始化最大元素的过程,其次,确定完毕的元素的互换是在每一轮完成后进行的,而不是在比较后进行的,再次,互换元素的不同,为(i)和(iMax),举例,原始数据: 3,5,7,9,4 要求:降序,第一轮比较,初始化设最大元素下标为,k0,3,579,k=0,3,5,79,k=1,35,7,9,k=2,357,9,k=3,k=3,A(0) 与 A(k)交换,的结果:,9,573,#include ,const int N=10;,void main( ), int aN , i , j , k , t;,for ( i=0 ; iai;,for ( i=,0,; i,N-1,; i+),k=i ;,for ( j=,i+1,; jak,),k=j ;,if (,k!=i,), t=ai ;,ai=,ak,;,ak,=t ;,源程序:,例,for ( i=0 ; iN ; i+),coutai;,A,0,A,1,A,2 ,A,n-1,A,0,A,1,A,2 ,A,n-1,A,0 ,A,i-1,A,i,. .,A,n-1,A,0,A,1 . .,A,n-2,A,n-1,2.在有序数组中插入一个数后使原数组仍然有序。,例如:,3 5 7 12 18(m=5), 将b=10插入,步骤:,(1)要找到b在数组中的位置,(2)给b让位置,(3)将b放到该位置上,(4)数组元素的个数 m 加 1,b=10,3,5,7,12,18,(2),3,5,7,12,12,18,(3),for(i=0;ib),break;,for(j=m-1;j=i;j-),aj+1=aj;,ai=b;,12,18,10,(1),3,5,7,12,18,a0,a1,a2,a3,a4,a5,程序见例,m=m+1;,(4),3 5 7 10 12 18 (m=6), 将b=10删除,步骤:,(1) 要找到b在数组中的位置,(2) 后面的数组元素依次前移,覆盖该位置,上的数组元素即可实现删除,(3) 数组元素的个数 m 减 1,3.在有序数组中删除一个数,例如:,3,5,7,10,12,18,(1),3,5,7,10,12,18,(2),3,5,7,12,12,18,for(i=0;im;i+),if (ai=b),break;,10,12,18,for(j=i;jc0c1c2 ;,for ( i=0 ; i,ci,;,2. 整个数组的输入输出,即按数组名输入输出,(,仅用于字符数组,),因数组名本身代表数组的,首地址,四、字符数组的输入和输出,返回,注意 :,(1) 输入、输出字符串时不包括“ ”,(2) cin输入时系统一直读取字符,直到遇到,“空白,符”,为止。,例如:输入数据 hello world,C数组中内容为hello,cout,c,;,cinsetw(20),c,;,返回,补充,get( ),函数,(,包含在“,iostream.h,”),如想输入含空格的字符串,如“,hello world”,只能使用,get( ),函数,,使用格式如下:,cin.get,(,字符数组名,字符串长度,规定的结束符,),其中,规定的结束符省略时,默认为回车键。,如:,char,str,20;,cin.get,(str,20),五、字符串处理函数,字符串函数的原型保存在,中,字符串连接函数,:,strcat,(s1,s2);,char,*strcat,( char *s1, const char *s2 );,连接,s1,和,s2,两个字符串赋给,s1,,,返回,s1,的值,字符串拷贝函数,:,strcpy,(s1,s2);,char,*strcpy,( char *s1, const char *s2 );,将,s2,中的字符串赋给,s1,,,返回,s1,的值,字符串比较函数,:,strcmp,(s1,s2),求字符串长度函数,:,strlen,(s),函数值为整数,(,返回字符个数,),(参数为字符数组名),六、字符数组程序应用,字符串的长度,逆序,字符串函数,返回,例,:求字符串长度,扫描数组,只要不是0,计数器就加1,源程序:,#include,void main(), int i;,char s50;,cins;,for (i=0;i50 ,cout“Lengh of “s“is”i ;,a,c,d,0,b,i,for (i=0; is1s2;,for( i=0; i40 ,for( j=0; j20 j+),s1i+=s2 j;,s1i=0; /*s1i=s2j;*/,coutp2;,for (i=0;p2i!=0;i+),p1i=p2i;,p1i=0;,cout“p1=“p1“np2=“p2“n”;,例 (综合举例) 某班有50个学生,期终考试8门课程。求每个学生总成绩、平均成绩,并按总成绩高分到低分输出。,( 上机作业 ),skip,char name5112;,/*采用外部数组实现数据传递*/,float cj519; float tacj513; ,#include,void input( ); /*函数声明*/,void count( ); void sort( ); void output( );,void main( ), input( ); /*调用输入函数*/,count( ); /*调用计算函数*/,sort( ); /*调用排序函数*/,output( ); /*调用输出函数*/,void input( ) /*输入函数*/, int i, j; ,for(i=1; i=50; i+),cout“请输入第”inamei; ,for(j=1; jcjij; ,void count( ) /*计算函数*/, int i, j; ,for(i=1; i=50; i+), tacji1=0; ,for(j=1; j=8; j+),tacji1+= cjij; ,tacji2= tacji1/ 8; ,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); /交换姓名,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 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); ,void output( ) /*输出函数*/, int i; ,cout50个学生成绩处理结果如下: n; ,cout 姓名 课程1 课程2 课程3 课程4 课程5 课程6,课程7 课程8 总成绩 平均成绩 名次n; ,for(i=1; i=50; i+), coutnamei; ,for(j=1; j=8; j+),coutcjij; ,couttacji1 tacji2 i; ,coutn; ,常见错误,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超出范围。,for (,i=0; i=9;,i+),cout ai;,2、数组整体赋值。,int a10;,int b10=1, 2, 3, 4, 5, 6;,a=b;,+不允许对数组进行整体操作,如果把数组 a 赋值给数组 b ,需要用循环语句来实现。,for (i=0; i10; i+),ai=bi;,3、误以为数组名代表数组中全部元素。,main( ),int a4=1, 2, 3, 4;,cout a;,企图用数组名代表全部元素。,+中,数组名代表数组首地址,不能通过数组名输出4个整数。,cout a0 a1 a2 a3);,或:,for (i=0; i=3; i+),cout ai;,4、引用数组元素时使用圆括号。,cout,a(5),;,5、向一个字符数组赋字符串。,char str20;,str=I am a boy.;,这种错误和第二种错误为一种错误,即不支持对数组的整体操作。,strcpy(str, I am a bpy.);,6、构造字符串时忘记在末尾应加0。,i=0;,while (ch=getchar( )!=n),stri+=ch;,cout str;,由于构造的字符串没有加结束标志,当用cout函数输出str时,从str的起始地址开始一个个的输出,输出完读入的字符后,没有遇到0,继续输出,这时的内容已不再是字符串中的字符。因此, 在自己构造一个字符串时,一定不要忘记在末尾加上0。,返 回,i=0;,while (ch=getchar( )!=0),stri+=ch;,stri=0;,coutstr;,返 回,第三章作业答案:,3. #include ,void main(), int i, p=1; int s=1; for(i=1;i=10;i+), p*=3; s+=p; coutsendl;,第三章作业答案:,4. #include ,void main(), int i=0,s=0;,do,i+=2;,s+=i*i; while(s1000);,cout“n=“i-2x;,max=x;,for(i=0;ix;,if(xmax),max=x;,cout“最大值为:”maxendl;,9. #include ,void main(), int i, j ;,for(i=1;i=6;i+), for(j=1;j=11;j+),if(j12-i),cout ;,else,cout*;,cout=1;i- -), for(j=1;j=11;j+),if(j=6+i),cout ;,else,cout*;,coutendl;,第四章作业答案:,2.,#include ,void main(), char str30;,int i,count=0;,coutstr;,for(i=0;stri; i+),if(stri=0&stri=9),count+;,cout“十进制数字字符的个为:”countendl;,3. #include,void main( ), double a44 , p=1 ;,int i , j;,cout输入一个4*4的数值矩阵:;,for ( i=0 ; i4 ; i+ ),for ( j=0 ; jaij ;,for(i=0;i4;i+),p*=aii;,cout “p=”ps;for( i=0; si; i+),if(si=A & si=a & si=z), x=si-a; bx+; ,for(i=0;i26;i+),coutchar(a+i):bi, ;,if(i+1)%4= =0),coutendl; ,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!