数组.ppt
- 文档编号:18780169
- 上传时间:2023-11-10
- 格式:PPT
- 页数:93
- 大小:2.42MB
数组.ppt
《数组.ppt》由会员分享,可在线阅读,更多相关《数组.ppt(93页珍藏版)》请在冰点文库上搜索。
1,数组,2,一维数组的定义和引用,数组是同一类型的一组值(10个char或15个int),在内存中顺序存放。
整个数组共用一个名字,而其中的每一项又称为一个元素。
一、定义方式:
类型说明符数组名常量表达式;inta4;/表明a数组由4个int型元素组成,定义类型,数组名称,元素个数,3,inta4;/表明a数组由4个int型元素组成其元素分别为:
a0,a1,a2,a3其序号从0开始。
若存放首地址为2000H,则在内存中为:
C+不允许对数组的大小作动态的定义,即数组的大小不能是变量,必须是常量。
必须是常数,4,如果要根据不同的数值改变数组的大小,可用常量表达式。
如:
#defineSIZE50voidmain(void)intartSIZE;.,5,二、一维数组元素的引用,数组必须先定义,具体引用时(赋值、运算、输出)其元素等同于变量。
voidmain(void)inti,a10;for(i=0;i=0;i-)coutait;cout“n”;,输出:
9__8__7__6__5__4__3__2__1__0,定义,赋值,输出,i=0,a0=0,i=1,a1=1,a,0,1,2,i=2,a2=2,9,i=9,a9=9,6,三、一维数组的初始化,在定义数组的同时给数组元素赋值。
注意:
1、对数组中的一部分元素列举初值,未赋值的部分是0。
inta10=0,1,2,3,4,5;,2、不能给数组整体赋值,只能一个一个地赋值。
inta10=0,1,2,.,9;,非法,inta10=0,1,2,3,4,5,6,7,8,9;,inta10=0,1,2,3,4,5,0,0,0,0;,7,3、可以用inta=0,1,2,3,4,5,6,7,8,9;给数组赋值,编译器会自动计算出内的元素项数,并将数组定义为该长度。
4、用局部static或全局定义的数组不赋初值,系统均默认其为0。
staticinta10;(即存储在静态数据区中的数组其元素默认为0),数组在内存中顺序存放,第一个元素位于地址的最低端。
a,8,求Fibonacci数列:
1,1,2,3,5,8,.的前20个数,即F1=1(n=1)F2=1(n=2)Fn=Fn-1+Fn-2(n=3),fi=fi-1+fi-2,9,下面程序的运行结果是:
voidmain(void)inta6,i;for(i=1;i3)%5;coutait;,输出:
-40443,1,-4,2,0,3,4,4,4,5,3,10,排序算法,用起泡法对6个数排序(由小到大),将相邻的两个数两两比较,将小的调到前头。
11,第五趟循环1次,for(j=1;jai+1)t=ai;ai=ai+1;ai+1=t;,12,一般,元素的序号从0开始,因此,程序可以变动如下:
for(j=0;jai+1)t=ai;ai=ai+1;ai+1=t;,13,二维数组的定义和引用,一、定义方式:
类型说明符数组名常量表达式常量表达式;,inta34;,其元素分别为:
a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a23,表明a数组由34个int型元素组成,定义类型,数组名,行数,列数,14,其行列的序号均从0开始。
若存放首地址为2000H,则在内存中为:
即在内存中,多维数组依然是直线顺序排列的,第一个元素位于最低地址处。
其元素分别为:
a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a23,15,二、二维数组的引用,与一维数组一样,二维数组必须先定义,其维数必须是常量。
具体引用时(赋值、运算、输出)其元素等同于变量。
voidmain(void)inta23,i,j;coutaij;for(i=0;i2;i+)/*输出*/for(j=0;j3;j+)coutaijt;cout“n”;,输入:
123456,输出:
___1___2___3___4___5___6,定义,赋值,输出,16,三、二维数组的初始化,在定义数组的同时给数组元素赋值。
即在编译阶段给数组所在的内存赋值。
1、分行赋值,inta34=1,2,3,4,5,6,7,8,9,10,11,12;,2、顺序赋值,inta34=1,2,3,4,5,6,7,8,9,10,11,12;/依次赋值,17,3、部分赋值,inta34=1,5,9;/*a00=1,a10=5,a20=9其余元素为0*/,inta34=0,1,5;/*a00=0,a01=1,a10=5*/,18,4、分行或全部赋值时,可以省略第一维,第二维不可省。
inta4=1,2,5,6,7,8,9,10,11,12;,5、不能给数组整体赋值,只能一个一个地赋值。
6、用static定义的数组不赋初值,系统均默认其为0。
staticinta23;,inta23=1,2,3,.,12;,19,voidmain(void)inta33,i,j;for(i=0;i3;i+)for(j=0;j3;j+)if(i=2)aij=ai-1ai-1j+1;elseaij=j;coutaijt;cout“n”;,i=0a00=0a01=1a02=2,i=1a10=0a11=1a12=2,a20=a1a10+1=a10+1=1,i=2,a21=a1a11+1=a11+1=2,a22=a1a12+1=a12+1=3,输出:
___0___1___2,___0___1___2,___1___2___3,20,有一个34的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。
先考虑解此问题的思路。
从若干个数中求最大者的方法很多,我们现在采用“打擂台”算法。
如果有若干人比武,先有一人站在台上,再上去一人与其交手,败者下台,胜者留台上。
第三个人再上台与在台上者比,同样是败者下台,胜者留台上。
如此比下去直到所有人都上台比过为止。
最后留在台上的就是胜者。
21,程序模拟这个方法,开始时把a00的值赋给变量max,max就是开始时的擂主,然后让下一个元素与它比较,将二者中值大者保存在max中,然后再让下一个元素与新的max比,直到最后一个元素比完为止。
max最后的值就是数组所有元素中的最大值。
22,max=a00;/使max开始时取a00的值for(i=0;imax)/如果某元素大于maxmax=aij;/max将取该元素的值row=i;/记下该元素的行号icolum=j;/记下该元素的列号jcoutrowtcolumtmaxendl;,23,将数组行列式互换。
12356789,147258369,for(i=0;i3;i+)for(j=0;j3;j+)t=aij;aij=aji;aji=t;,for(i=0;i3;i+)for(j=0;ji;j+)t=aij;aij=aji;aji=t;,24,打印杨辉三角形1112113311464115101051,aij=ai-1j-1+ai-1j,25,voidmain(void)staticintn2,i,j,k;for(i=0;i2;i+)nj+=ni+i+1;coutnktnk+endl;,21,26,以下程序用于从键盘上输入若干个学生的成绩,统计出平均成绩,并输出低于平均成绩的学生成绩。
输入负数结束,voidmain()floatx100,sum=0,ave,a;intn=0,i;couta;,ave=sum/n;cout“ave=“aveendl;for(i=0;_;i+)if(_)cout“x“i“”xiendl;,cina,a=0,sum+=a,n+,in,xiave,27,输入一个十进制数,输出它对应的八进制数。
725/2=362余数=1=K0362/2=181余数=0=K1181/2=90余数=1=K290/2=45余数=0=K345/2=22余数=1=K422/2=11余数=0=K511/2=5余数=1=K65/2=2余数=1=K72/2=1余数=0=K81/2=0余数=1=K9,不断地除8,求其余数,直到被除数为0,最后余数倒序排列。
28,voidmain(void)intx,i,n;inta100;cinx;i=0;while(x)ai=x%8;x=x/8;i+;n=i;,for(i=n-1;i=0;i-)coutai;coutendl;,将余数依次存入数组中,29,已有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中。
输入:
cinx;25,x,25,y,25,34,34,30,x,25,y,25,34,34,x,34,34,y,34,56,56,31,voidmain(void)inta6=1,4,7,10,12;intx;for(inti=0;ix;for(i=0;ix)break;,for(intj=i;j=5;j+)inty=aj;aj=x;x=y;for(i=0;i6;i+)coutait;coutendl;,输入一个数,从头比较,大于这个数退出,将这个数插入,32,a,b,输入:
cinx;25,3,6,9,13,25,34,56,78,33,voidmain(void)inta6=1,4,7,10,12;intb6;intx;for(inti=0;ix;for(i=0;i5;i+)if(aix)bi=ai;elsebreak;,bi=x;for(intj=i;j5;j+)bj+1=aj;for(i=0;i6;i+)coutbit;coutendl;,小于这个数赋值,大于这个数退出,重新开始赋值,34,a,输入:
cinx;25,78,56,34,25,for(i=n-1;i=0;i-),从后向前循环,35,voidmain(void)inta6=2,5,8,10,12;intx;for(inti=0;ix;for(i=4;i0;i-)if(aix)ai+1=ai;elsebreak;,ai+1=x;for(i=0;i6;i+)coutait;coutendl;,关键!
从后面开始循环,从前向后移数,不大于退出循环,赋值,36,用筛选取法求出2200之间的所有素数。
筛法:
首先将1n个数为数组置初值。
2的倍数不是素数,置0;3的倍数不是素数,置0;5的倍数不是素数,置0;.,依次类推,最后将数组中不是0的元素输出。
37,字符数组,用来存放字符数据的数组是字符数组,字符数组中的一个元素存放一个字符。
一、字符数组的定义,char数组名常量表达式;,charc4;/*每个元素占一个字节*/,c0=I;c1=m;c2=_;,类型,数组名,数组大小,38,二、字符数组的初始化,与数值数组的初始化相同,取其相应字符的ASCII值。
charc10=I,a,m,a,b,o,y;,39,如果字符个数大于数组长度,做错误处理;如果数值个数小于数组长度,后面的字节全部为0。
如果省略数组长度,则字符数即为数组长度。
staticcharc=I,a,m,a,g,i,r,l;,同理,也可定义和初始化一个二维或多维的字符数组。
分层或省略最后一维。
charst1=65,66,68;,40,三、字符数组的引用,voidmain(void)charc10=I,a,m,a,b,o,y;inti;for(i=0;i10;i+)coutci;cout“n”;,定义,输出,41,四、字符串和字符串结束标志,C+语言将字符串作为字符数组来处理。
字符串常量:
“CHINA”,在机内被处理成一个无名的字符型一维数组。
C+语言中约定用0作为字符串的结束标志,它占内存空间,但不计入串长度。
有了结束标志0后,程序往往依据它判断字符串是否结束,而不是根据定义时设定的长度。
42,字符串与字符数组的区别:
chara=C,H,I,N,A;,charc=“CHINA”;,字符数组,字符串,43,可以用字符串的形式为字符数组赋初值,charc=“Iamaboy”;/*长度11字节,以0结尾*/,chara=I,a,m,a,b,o,y;/*长度10字节*/,如果数组定义的长度大于字符串的长度,后面均为0。
charc10=“CHINA”;,0的ASCII为0,而(空格)的ASCII为32。
44,charw=T,u,r,b,o,0;,charw=“Turbo0”;,charw=“Turbo0”;,charw=Turbo0;,非法,45,chara25=“abcd”,“ABCD”;,str为字符数组在内存中存储的地址,一经定义,便成为常量,不可再赋值。
charstr12=“TheString”;,非法,在语句中赋值,定义数组,开辟空间时赋初值,46,字符数组的输入输出,逐个字符的输入输出。
这种输入输出的方法,通常是使用循环语句来实现的。
如:
charstr10;coutstri;/A.A行将输入的十个字符依次送给数组str中的各个元素。
定义,赋值,47,把字符数组作为字符串输入输出。
对于一维字符数组的输入,在cin中仅给出数组名;输出时,在cout中也只给出数组名。
voidmain(void)chars150,s260;couts1;cins2;cout“ns1=“s1;cout“ns2=“s2“n”;,输入:
abcdstring,cin只能输入一个单词,不能输入一行单词。
数组名,数组名,输出到0为止,48,当要把输入的一行作为一个字符串送到字符数组中时,则要使用函数cin.getline()。
这个函数的第一个参数为字符数组名,第二个参数为允许输入的最大字符个数。
cin.getline(数组名,数组空间数);,chars180;.cin.getline(s1,80);,首先开辟空间,参数是数组名,49,voidmain(void)chars381;cout”输入一行字符串:
”;cin.getline(s3,80);/Acout”s3=”s3n;/B,当输入行中的字符个数小于80时,将实际输入的字符串(不包括换行符)全部送给s3;当输入行中的字符个数大于80时,只取前面的80个字符送给字符串。
定义,从键盘接收一行字符,输出到0为止,50,从键盘输入一行字符,统计其中分别有多少大小写字母,以$号结束输入。
从键盘输入一行字符,统计其中分别有多少大小写字母。
从键盘输入一行字符,其中的大写变小写,小写变大写。
51,从键盘接收一行字符,统计有多少个单词数?
wearestudents.,不能用字母数或空格数来判断,只能用字母和空格状态变化的次数来判断。
设状态变量word,判别到字母时word为1,判别到非字母时word为0。
word的初始值为0,当从0变为1时,单词数加1。
52,voidmain(void)chars80;inti=0,word=0,num=0;cin.getline(s,80);while(si!
=0)if(si=a,表明前一字符非字母,改变状态,防止继续对下一字母计数,改变状态,碰到下一个字母时开始计数,53,六、字符串处理函数,C中没有对字符串变量进行赋值、合并、比较的运算符,但提供了许多字符串处理函数,用户可以调用#include“string.h”,所有字符串处理函数的实参都是字符数组名,54,1、合并两个字符串的函数strcat(str1,str2),staticcharstr120=“Iama”;staticcharstr2=“boy”;strcat(str1,str2);,将第二个字符串str2接到第一个字符串str1后。
注意:
第一个字符串要有足够的空间。
空间足够大,55,2、复制两个字符串的函数strcpy(str1,str2),staticcharstr120=“Iama”;staticcharstr2=“boy”;strcpy(str1,str2);,strcpy(str1,“CHINA”);,strcpy(“CHINA”,str1);,str1=str2;,str1=“CHINA”;,字符串正确赋值,均为非法,56,3、比较两个字符串的函数strcmp(str1,str2),此函数用来比较str1和str2中字符串的内容。
函数对字符串中的ASCII字符逐个两两比较,直到遇到不同字符或0为止。
函数值由两个对应字符相减而得。
该函数具有返回值,返回值是两字符串对应的第一个不同的ASCII码的差值。
若两个字符串完全相同,函数值为0。
if(strcmp(str1,str2)=0).,用来判断两字符串是否相等,57,staticcharstr120=“CHINA”;staticcharstr2=“CHINB”;coutstrcmp(str1,str2)endl;,输出:
-1,staticcharstr120=“CHINA”;staticcharstr2=“AHINB”;coutstrcmp(str1,str2)endl;,输出:
2,if(str1=str2)cout“yesn”;,if(strcmp(str1,str2)=0)cout“yesn”;,非法,正确,58,4、求字符串长度的函数strlen(str1),长度不包括0。
函数参数为数组名,返回值为数组首字母到0的长度。
并非数组在内存中空间的大小。
chars80;strcpy(s,“abcd”);coutstrlen(s)endl;,输出:
4,输出:
3,coutstrlen(str1)endl;,coutsiziof(s)endl;,输出:
80,59,charstr120=“CHINA”;coutstrlen(str1)endl;,输出:
5,charsp=“x69082”;coutstrlen(sp)endl;,输出:
6,charsp=“tv0willn”;coutstrlen(sp)endl;,输出:
3,charstr120=“abook”;coutstrlen(str1)endl;,输出:
1,60,5、strlwr(str1),将str1中的大写字母转换成小写字母。
6、strupr(str1),将str1中的小写字母转换成大写字母。
61,7、函数strncmp(字符串1,字符串2,maxlen)函数原型为:
intstrncmp(charstr1,charstr2,intm),第三个参数为正整数,它限定了至多比较的字符个数,若字符串1或字符串2的长度小于maxlen的值时,函数的功能与strcmp()相同。
当二个字符串的长度均大于maxlen的值时,maxlen为至多要比较的字符个数。
coutstrncmp(“China”,“Chifjsl;kf”,3)n;,输出:
0,62,第三个参数为正整数,它限定了至多拷贝的字符个数,若字符串2的长度小于maxlen的值时,函数的功能与strcpy()相同。
当字符串2的长度大于maxlen的值时,maxlen为至多要拷贝的字符个数。
8、函数strncpy(字符数组名1,字符串2,maxlen)函数原型为:
voidstrncmp(charstr1,charstr2,intm),63,chars90,s190;strncpy(s,abcdssfsdfk,3);/Astrncpy(s1,abcdef,90);/Bcoutsendl;couts1endl;,输出:
abc,输出:
abcdef,注意,二字符串之间不能直接进行比较,赋值等操作,这些操作必须通过字符串函数来实现。
空间足够大,64,输入三个字符串按大小输出。
输入n个字符串按大小输出。
65,voidchanged(charstr1,charstr2)charstr380;strcpy(str3,str1);strcpy(str1,str2);strcpy(str2,str3);,voidmain(void)chars180,s280,s380;cout0)changed(s1,s2);if(strcmp(s1,s3)0)changed(s1,s3);if(strcmp(s2,s3)0)changed(s2,s3);coutsorted:
endlendl;couts1endls2endls3endl;,66,voidchanged(charstr1,charstr2)charstr380;strcpy(str3,str1);strcpy(str1,str2);strcpy(str2,str3);,voidmain(void)charss1080;inti,j;cout0)changed(ssj,ssj+1);coutsorted:
endlendl;for(i=0;i10;i+)coutssiendl;,67,用选择法对6个数排序(由小到大),设定一个变量,放入数组中的最小数的序号,然后将其与最上面的数比较交换。
即9与8比较,假定元素序号为1的数是最小的数,这时,最小数的序号变为2,即8与5比较,68,第一趟,循环5次,这时,最小数的序号变为3,即5与4比较,这时,最小数的序号变为4,即4与2比较,这时,最小数的序号变为5,第一趟比较完毕,最小数是a6,最小数的序号为6,69,从第二个数开始比较,假定最小数的序号为2,70,第二趟,循环4次,第二趟比较完毕,最小数是a5,最小数的序号为5,71,第三趟,循环3次,72,第四趟,循环2次,73,第五趟,循环1次,for(i=1;iaj)min=j;t=amin;amin=ai;ai=t;,74,一般,元素的序号从0开始,因此,程序可以变动如下:
for(i=0;iaj)min=j;t=amin;amin=ai;ai=t;,小循环,找最小数的序号,从i找起,大循环,找到后与i交换,每一次循环前设置最小数的序号,75,调试程序的方法:
1)单步调试:
以行为单位,每运行一步,程序就会中断,可以实时查询目前各变量的状态及程序的走向。
可以选择是否进入子函数。
2)运行到光标处,可以直接使程序运行到光标处再进行单步调试,这种方法可以不必运行正确的循环而直接到有疑问的地方。
76,在a数组中查找与x值相同的元素所在的位置,数据从a1元素开始存放,请填空:
#defineMAX10voidmain(void)intaMAX+1,x,i;for(i=1;i_;coutx;a0=x;i=MAX;,while(x!
=_)_;if(_)coutx“thepos:
”iendl;elsecout“Notfound”endl;,ai,ai,i-,i!
=0,77,voidmain(void)charstr=“SSSWILTECH1111W1WALLMP1”;charc;intk;for(k=2;(c=strk)!
=0;k+)switch(c)caseA:
couta;continue;case1:
break;case1:
while(c=str+k)!
=1,S,W,I,T,C,H,*,#,W,a,M,P,*,78,以下程序分别在a数组和b数组中放入an+1和bn+1个由小到大的有序数,程序把两个数组中的数按由小到大的顺序归并到c数组中,请填空:
voidmain(void)inta10=1,2,5,8,9,10,an=5;intb10=1,3,4,8,12,18,bn=5;inti,j,k,c20,max=9999;aan+1=ban+1=max;i=j=k=0;,while(ai!
=max|bj!
=max)if(aibj)ck=_;k+;_elseck=_;k+;_;for(i=0;ik;i+)coutci;coutendl;,ai,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数组