C数组和字符串.ppt
- 文档编号:18715761
- 上传时间:2023-10-17
- 格式:PPT
- 页数:77
- 大小:2.10MB
C数组和字符串.ppt
《C数组和字符串.ppt》由会员分享,可在线阅读,更多相关《C数组和字符串.ppt(77页珍藏版)》请在冰点文库上搜索。
数组和字符串,第四章,【教学目的与要求】理解数组的定义和使用,掌握数组的常用操作和字符串的处理。
【教学重点与难点】数组的应用,字符串的处理方法。
【教学方法】讲授与上机相结合。
数组的概念;,数组的应用;,数组的定义;,字符串,本章授课内容,常见错误,4-1数组的概念,数组是一组有序数据的集合;数组中的每一个元素都属于同一个数据类型。
用一个统一的数组名和下标来唯一的确定数组中的元素。
在科学计算和数据处理中,要用到成批数据,这些数据类型相同,且彼此间存在一定的顺序关系,为了便于处理,引入了数组类型。
假设现在要求保存每个学生的成绩,那就不能只使用一个变量score了,而需要40个变量,但这样一来输入、输出、计算都会变得繁琐.在这种情况下,我们可以使用数组类型,说明一个含有40个元素的数组,每个数组元素存放一个成绩,成绩的输入、输出、计算都可通过循环来实现,一、数组的引入,#includevoidmain()intj,sum,s80;floatave;sum=0;for(j=0;jsj;sum=sum+sj;ave=sum/80.0;cout“ave=”ave;,1.数组:
由具有相同类型的固定数量的元素组成的结构,2.数组元素:
每一个数组元素都是一个变量,为了与一般的变量相区别,我们称数组元素为下标变量,3.下标变量在数组中的位置序号称下标下标变量的数据类型称为下标类型(或元素类型),二、数组的概念,返回,4-2-1一维数组,一、一维数组的定义,二、一维数组的存储结构,三、数组元素的引用形式,四、一维数组的初始化,六、一维数组程序设计举例(算法),五、一维数组的输入和输出,下一节,数组:
是一组具有相同数据类型的变量的有序集合。
例如:
inta10;,数组名,常量表达式,类型说明,一、一维数组的定义,格式:
类型标识符数组名常量表达式;,inta10;,数组名:
用户定义的标识符数组名表示了一个存储区的首地址(即第一个数组元素的地址),intn;cinn;intan;.,常量表达式中不能有变量常量表达式的值不能是实数,下标从0开始,a0,a1a9,没有a10;,常量表达式的值为元素的个数,返回,二、一维数组的存储结构,a,一个数组的所有元素都是连续存储的,数组元素为:
a0,a1,a2.a9,inta10;,所占空间为:
类型长度*元素个数,返回,数组首地址,三、数组元素的引用形式,数组元素的引用:
数组名下标,a0=a2+a4*2,2,4,0,inta10;a0=2;,说明
(1)下标可以是整型常量或整型表达式如:
a1,a2*3,
(2)数组定义为inta5,数组长度为5而下标在0-4之内,即a0-a4,注意:
如果出现a5=72;编译时不会指出错误,系统会将a4后下一个存储单元赋值为72,但这样可能会破坏数组以外其他变量的值。
返回,四、一维数组的初始化,概念:
在定义一维数组时对各元素指定初始值称为数组的初始化,如:
inta5=1,3,5,7,9;,2.说明初值用括起来,数据之间用逗号分开.对数组的全体元素指定初值,可以不指明数组的长度,系统会根据内数据的个数确定数组的长度。
如:
inta=1,3,5,7,9;,(3)对数组中部分元素指定初值(这时不能省略数组长度)如:
inta5=1,3,5;,(4)使数组中的全部元素初始值都为0如:
inta5=0,0,0,0,0;,更简单的写法:
inta5=0;,例4.2.1:
输入n个成绩,求平均分,#includevoidmain()ints,n,i;floataver=0.0;cinn;for(i=0;is;aver+=s;aver/=n;coutaver;,ints80,n,i;,cinsi;aver+=si;aver/=n;for(i=0;iaver)coutsi);,返回,输出高于平均分的成绩,五、一维数组的输入和输出,数组的输入和输出只能逐个对数组元素进行操作(字符数组例外),输入方法:
定义:
inta10,i;,输入第i个数组元素:
cinai;,输入整个数组元素:
for(i=0;iai;,输出方法:
输出第i个数组元素:
coutai;,输出整个数组元素:
for(i=0;i10;i+)coutai;,返回,例4.2.2:
用一维数组求Fibonacci数列,#includevoidmain()inti;intf20=1,1;for(i=2;i20;i+)fi=fi-2+fi-1;for(i=0;i20;i+)if(i%5=0)coutn;cout“t”fi;,六、一维数组程序设计举例,f0f1f2f3f4f5:
f19,i=2f2=f0+f1,i=3f3=f1+f2,i=4f4=f2+f3,2,3,5,8,6765,例4.2.3:
输入一个数据,在已知数组中查找是否有该数据,9,a0a1a2a3a4a5a6a7a8a9,#includevoidmain()inti,x;inta10=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“nofind!
”endl;,课堂练习:
有一个数列,它的第一项为0,第二项为1,以后每一项都是它的前两项之和,试生成此数列的前20项,并按逆序显示出来.,练习答案:
#includeVoidmain()intf20=0,1,j;for(j=2;j=0;j-)/逆序显示coutfj;coutendl;,返回,4-2-2二维数组,一、二维数组的定义,二、二维数组的存储结构,三、二维数组的初始化,四、二维数组元素的引用形式,五、二维数组的输入和输出,六、二维数组程序设计举例,返回,一、二维数组的定义,格式:
类型标识符数组名常量表达式常量表达式,intb23;,b为23(2行3列)的数组,b0b1,b,-b00b01b02,-b10b11b12,b0b1,b00,b01,b02,返回,二、二维数组的存储结构,intb23;,b10,b11,b12,b00,b01,b02,存放顺序:
按行存放,先顺序存放第一行的元素,再存放第二行的元素,b0、b1可以作为数组名,a10a11a12,a20a21a22,a00a01a02,a00a01a02a10a11a12a20a21a22,101010141018102210261030103410381042,数组的元素在内存中是连续存放的inta33;的存放形式如下:
a0a1a2,C+将二维数组看作一维数组,其每个数组元素又是一个一维数组,返回,三、二维数组的初始化,intb23=1,2,3,4,5,6;,intb23=1,2,3,4,5,6;,分行赋值,按数组排列的顺序赋值,注意:
此方法数据没有明显的界限,当数据较多时容易出错,将数据依次赋给元素b00,b01b12,返回,intb3=1,2,3,4,5,6;,intb;intb=1,2,3,4,5,6;intbnm;,错!
若全部都赋初值,第一维长度可省略,返回,四、二维数组元素的引用形式,数组名下标1下标2,b02=b10+b00-b02;,数组元素可以出现在表达式中,也可以被赋值,引用形式:
inta34;.a34=4;,错!
注意:
(1)每个下标都要用括起来如a21不能写成a2,1
(2)下标不要超过定义的范围,返回,五、二维数组的输入和输出,数组的输入和输出只能逐个对数组元素进行操(字符数组例外),定义:
inta23,i,j;,返回,六、二维数组程序设计举例,例4.2.4:
有一个3*4的矩阵,编程求出其中的最大值及其所在的行号和列号。
max,row,col,12,1,2,#includevoidmain()inti,j,row=0,col=0,max;inta34=5,2,0,9,3,7,12,6,10,4,1,8;max=a00;for(i=0;imax)max=aij;row=i;col=j;cout“max=”max;cout“max=a”rowcol;,输出:
max=12max=a12,例4.2.5:
将一个矩阵进行转置(即原来的行变为列),#includevoidmain()inta34,b43,i,j;for(i=0;iaij;for(i=0;i3;i+)for(j=0;j4;j+)bji=aij;for(i=0;i4;i+)for(j=0;j3;j+)coutbij;coutendl;,输入数组a,进行矩阵转置,输出数组b,a02,b20,a21,b12,返回,课堂练习:
1.数组元素ai是该数组中的第个元素.2.元素类型为int的数组a10共占用字节的存储空间,其中元素a5的字节地址为.3.元素类型为double的数组a46共占用字节的存储空间,其中元素a25的字节地址为.4.元素类型为char的数组a1030共占用字节的存储空间,其中元素a34的字节地址为.答案:
1.i+12.40a+203.192a+1364.300a+94,第一方面:
利用数组进行数值计算:
书中给出了三个例子,一个是计算个人所得税,二是进行矩阵求和,三是按月进行公司产值计算,都具有代表性P103
(2),4-3数组的应用,第二方面:
利用数组进行统计:
书中给出了两个例子,一是统计每个候选人的选票,二是统计每个用电区间的居民户数:
P105
(1),第三方面:
数据排序:
/数据结构书中介绍了两种方法:
选择排序和插入排序(见后),第四方面:
查找数据:
/数据结构书中介绍了两种方法:
顺序查找(不要求数组元素有序排列)和二分查找(要求数组元素有序排列)P109
(1),基本算法举例1.排序
(1)冒泡法排序,例4.3.1:
输入5个数,进行由小到大排序:
98542,算法:
两两比较,大数向后移,找到最大数放在最后,再在剩余的的4个数中进行两两比较,找到最大数,以此类推.最后,小数排在开始,相当于浮起,故称之为:
冒泡法,85429,5428,425,24,比较4次第一轮,比较3次第二轮,比较2次第三轮,比较1次第四轮,98542,89542,85942,85492,8542,5842,5482,542,42,452,对n个数,则要进行n-1趟扫描,在第i趟扫描中要进行n-i次比较。
可以推知:
/*排序*/for(i=0;iaj+1)t=aj;aj=aj+1;aj+1=t;,#include#defineN10voidmain()inti,j,aN,t;for(i=0;iai;for(i=0;iN;i+)/输出coutai;,/*排序*/for(i=0;iaj+1)t=aj;aj=aj+1;aj+1=t;for(i=0;iN;i+)/输出coutai;,源程序:
例4.3.1,
(2)选择法排序,特点:
比较后不立即互换元素,而是记下其位置并在每一轮比较完毕后和()互换首先,比较的元素不同,以降序为例,是当前元素与上次比较後的最大元素进行比较,因此,在进行比较之前,要有一个初始化最大元素的过程其次,确定完毕的元素的互换是在每一轮完成后进行的,而不是在比较后进行的再次,互换元素的不同,为(i)和(iMax)举例原始数据:
3,5,7,9,4要求:
降序,第一轮比较,初始化设最大元素下标为k03579k=03579k=13579k=23579k=3k=3A(0)与A(k)交换的结果:
9573,#includeconstintN=10;voidmain()intaN,i,j,k,t;for(i=0;iai;for(i=0;iak)k=j;if(k!
=i)t=ai;ai=ak;ak=t;,源程序:
例4.3.2,for(i=0;iN;i+)coutai;,2.在有序数组中插入一个数后使原数组仍然有序。
例如:
3571218(m=5),将b=10插入步骤:
(1)要找到b在数组中的位置
(2)给b让位置(3)将b放到该位置上(4)数组元素的个数m加1,b=10,for(i=0;ib)break;,for(j=m-1;j=i;j-)aj+1=aj;,ai=b;,12,18,10,程序见例4.3.3,m=m+1;,(4),357101218(m=6),将b=10删除步骤:
(1)要找到b在数组中的位置
(2)后面的数组元素依次前移,覆盖该位置上的数组元素即可实现删除(3)数组元素的个数m减1,3.在有序数组中删除一个数,例如:
for(i=0;im;i+)if(ai=b)break;,10,12,18,for(j=i;jm-1;j+)aj=aj+1;,(3),m=m-1;,是对有序数列进行查找的一种高效查找办法,其基本思想是逐步缩小查找范围,采取半分作为分割范围可使比较次数最少.比较过程:
(设数列已做升序排序处理)设置三个变量,分别代表数组序列s的low,high和mid位置,其中mid=(low+high)/2,进行下列判断,134681012151820,X=15,4、查找:
(1)顺序查找,
(2)折半查找法:
对有序数组,返回,程序见例4.3.4,4-4字符串,二、字符串及字符串结束标志,四、字符数组的输入和输出,五、字符串处理函数,六、字符数组程序应用,一、字符数组的定义,三、字符数组的初始化,返回,一、字符数组,用来存放字符数据的数组为字符数组。
charc10;,charc10=I,a,m,h,a,p,p,y;,若初值个数小于数组长度,剩余元素自动定为空字符,charc12=c,p,r,o,g,r,a,m;,intc10;,定义,初始化,二者互相通用,但存储空间不同,返回,二、字符串和字符串结束标志,C+中没有专门的字符串变量,因此字符串存放在字符数组中,字符串以“0”作为结束标志,字符串:
由若干个有效字符组成的序列有效字符包括字母,数字,专用字符,转义字符如:
“bfer”“a45-7”“mtkn”,例:
charc5;,c0=O;c1=K;c2=!
;,c0=O;c1=K;c2=!
;c3=0;,注意:
字符数组与字符串并不相同,返回,三、字符数组的初始化,如果对数组全部元素指定初值,则可以省略数组的长度charc=H,e,l,l,o;,返回,1.为数组中的元素指定初值charc8=H,e,l,l,o;,2.对字符数组指定字符串初值,charc8=“Hello”;charc8=“Hello”;charc8=H,e,l,l,o,0;,charc=“Hello”;,charc6=“Hello”;,charc5=“Hello”;,错误的初始化,注意:
初始化时数组的长度应足够大,确保可以容纳所有字符和结束标志0,返回,1.输入单个字符charc8;inti;cinc0c1c2;,for(i=0;ici;,2.整个数组的输入输出,即按数组名输入输出(仅用于字符数组),因数组名本身代表数组的首地址,四、字符数组的输入和输出,返回,注意:
(1)输入、输出字符串时不包括“”
(2)cin输入时系统一直读取字符,直到遇到“空白符”为止。
例如:
输入数据helloworldC数组中内容为hello,返回,补充get()函数(包含在“iostream.h”)如想输入含空格的字符串,如“helloworld”只能使用get()函数,使用格式如下:
cin.get(字符数组名,字符串长度,规定的结束符)其中,规定的结束符省略时,默认为回车键。
如:
charstr20;cin.get(str,20),五、字符串处理函数,字符串函数的原型保存在中字符串连接函数:
strcat(s1,s2);char*strcat(char*s1,constchar*s2);连接s1和s2两个字符串赋给s1,返回s1的值字符串拷贝函数:
strcpy(s1,s2);char*strcpy(char*s1,constchar*s2);将s2中的字符串赋给s1,返回s1的值字符串比较函数:
strcmp(s1,s2)求字符串长度函数:
strlen(s)函数值为整数(返回字符个数),(参数为字符数组名),六、字符数组程序应用,字符串的长度,逆序,字符串函数,返回,例4.4.1:
求字符串长度,扫描数组,只要不是0,计数器就加1,源程序:
#includevoidmain()inti;chars50;cins;for(i=0;i50,i,for(i=0;i50,i,i=0,字符串函数,/*例4.4.2:
STRCAT*/,#includevoidmain()inti,j;chars140,s220;cins1s2;for(i=0;i40,s1,s2,s1,/i=strlen(s1);,/*例4.4.3:
STRCPY*/#includevoidmain()charp180,p280;inti;cinp2;for(i=0;p2i!
=0;i+)p1i=p2i;p1i=0;cout“p1=“p1“np2=“p2“n”;,例4.4.4(综合举例)某班有50个学生,期终考试8门课程。
求每个学生总成绩、平均成绩,并按总成绩高分到低分输出。
(上机作业),skip,charname5112;/*采用外部数组实现数据传递*/floatcj519;floattacj513;#includevoidinput();/*函数声明*/voidcount();voidsort();voidoutput();voidmain()input();/*调用输入函数*/count();/*调用计算函数*/sort();/*调用排序函数*/output();/*调用输出函数*/,voidinput()/*输入函数*/inti,j;for(i=1;inamei;for(j=1;jcjij;,voidcount()/*计算函数*/inti,j;for(i=1;i=50;i+)tacji1=0;for(j=1;j=8;j+)tacji1+=cjij;tacji2=tacji1/8;,voidsort()/*排序函数*/inti,flag;charts12;floattc;doflag=0;for(i=1;itacji1)strcpy(ts,namei);strcpy(namei,namei+1);strcpy(namei+1,ts);/交换姓名,for(j=1;j=8;j+)/*交换8门课程成绩*/t=cjij;cjij=cji+1j;cji+1j=t;t=tacji1;tacji1=tacji+11;tacji+11=t;/*交换总成绩*/t=tacji2;tacji2=tacji+12;tacji+12=t;/*交换平均成绩*/flag=1;while(flag=1);,voidoutput()/*输出函数*/inti;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;couttacji1tacji2i;coutn;,常见错误,1、数组下标越界。
如:
inta10=1,2,3,4,5,6,7,8,9,10;,for(i=1;i=10;i+)coutai;,C+规定定义时用a10,表示数组有10个元素,而不是可以用的最大下标值为10。
数组只包括a0到a910个元素,因此用a10超出范围。
for(i=0;i=9;i+)coutai;,2、数组整体赋值。
inta10;intb10=1,2,3,4,5,6;,a=b;,+不允许对数组进行整体操作,如果把数组a赋值给数组b,需要用循环语句来实现。
for(i=0;i10;i+)ai=bi;,3、误以为数组名代表数组中全部元素。
main()inta4=1,2,3,4;couta;,企图用数组名代表全部元素。
+中,数组名代表数组首地址,不能通过数组名输出4个整数。
couta0a1a2a3);,或:
for(i=0;i=3;i+)coutai;,4、引用数组元素时使用圆括号。
couta(5);,5、向一个字符数组赋字符串。
charstr20;str=Iamaboy.;,这种错误和第二种错误为一种错误,即不支持对数组的整体操作。
strcpy(str,Iamabpy.);,6、构造字符串时忘记在末尾应加0。
i=0;while(ch=getchar()!
=n)stri+=ch;coutstr;,由于构造的字符串没有加结束标志,当用cout函数输出str时,从str的起始地址开始一个个的输出,输出完读入的字符后,没有遇到0,继续输出,这时的内容已不再是字符串中的字符。
因此,在自己构造一个字符串时,一定不要忘记在末尾加上0。
返回,i=0;while(ch=getchar()!
=0)stri+=ch;stri=0;coutstr;,返回,第三章作业答案:
3.#includevoidmain()inti,p=1;ints=1;for(i=1;i=10;i+)p*=3;s+=p;coutsendl;,第三章作业答案:
4.#includevoidmain()inti=0,s=0;doi+=2;s+=i*i;while(s1000);cout“n=“i-2endl;,6.#includevoidmain()inti,x,max;cinx;max=x;for(i=0;ix;if(xmax)max=x;cout“最大值为:
”maxendl;,9.#includevoidmain()inti,j;for(i=1;i12-i)cout;elsecout*;coutendl;,9.#includevoidmain()inti,j;for(i=6;i=1;i-)for(j=1;j=6+i)cout;elsecout*;coutendl;,第四章作业答案:
2.#includevoidmain()charstr30;inti,count=0;coutstr;for(i=0;stri;i+)if(stri=0,3.#includevoidmain()doublea44,p=1;inti,j;coutaij;for(i=0;i4;i+)p*=aii;cout“p=”pendl;,7.#includevoidmain()chars80;inti,x,b26=0;couts;for(i=0;si;i+)if(si=A,for(i=0;i26;i+)coutchar(a+i):
bi;if(i+1)%4=0)coutendl;,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数组 字符串