1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,数 组,1,4/19/2025,本章要点,1,、数组的定义格式,2,、数组元素引用的格式,3,、数组的赋值与初始化,4,、数组与函数,5,、字符数组,6,、字符串,2,4/19/2025,数组,数组是由一组具有相同数据类型的元素组成的集合。数组的类型就是这组元素的数据类型。构成数组的这组元素在内存中占用一组连续的存储单元。可以用一个统一的数组名标识这一组数据,而用下标来指明数组中各元素的序号。,3,4/19/2025,一维数组的定义,语法格式:,类型 数组名,常量表达式,;,如:,char a5;,int
2、b10;,const int size=10;,int csize;,注意,:在定义数组时,不能用变量来描述数组定义中的元素个数。例如,下面的定义方式是不合法的:,int n;,cinn;,int bn;,数组名是代表数组元素首地址的符号常量,例 对于 char a10,a的内容是一个地址,也就是a0的地址;在定义a10之后a为一个表示地址的常量。,4,4/19/2025,一维数组的存储,用数组名加下标值就可以访问数组中对应的某个元素。下标值从,0,开始,因此对于一个具有,n,个元素的一维数组来说,它的下标值是,0 n-1,。,数组元素在内存中是顺序存储的。对于一维数组,就是简单地按下标顺序存
3、储。,如:,int b5;,b0,b1,b2,b3,b4,5,4/19/2025,一维数组的初始化,语法格式为:,类型 数组名,数组范围,=,值,1,,值,2,,,,值,n;,例如:,char a5=a,b,c,d,e;,或:,char a=a,b,c,d,e;,int c5=1,2;,当数组长度与初始化元素的个数不相等时,数组长度不能省去不写,,如上例不能写为:,int c=1,,,2,;,字符数组初始化:,char d6=h,e,l,l,o,0;,char d6=”hello”;,三种等价,char d6=”hello”;,6,4/19/2025,数组元素的赋值,由于数组名是常量,数组元素
4、是变量,所以对数组的赋值只能针对数组元素,并且必须逐一赋值。,例,int mydata5;,mydata0=3;mydata1=78;,mydata2=54;mydata3=90;,mydata4=6;,mydata=3,78,54,90,6,是错误的!,7,4/19/2025,若要在数组之间进行赋值,也只能逐一地赋值。,for(i=0;i,数组名;,或,cin,数组名,下标,;,如:对一个大小为,5,的字符型数组,a,赋值,可以用下列两种方式:,char a5;,cina;/,一般只针对字符数组,或,char a5;,int i;,for(i=0;iai;,数组元素的赋值,8,4/19/20
5、25,数组元素的引用,引用形式为:,数组名,下标,下标可以是整常数或整型表达式。例如,a2+1,、,ai+j,等(,i,和,j,为整型变量)。例如:,a2=10;/,将,10,赋给数组中的,a2,元素。,a5=a2;/,将,a2,元素的值赋给,a5,元素,couta5;/,打印,a5,元素的值,9,4/19/2025,数组越界,在给数组元素赋值或对数组元素进行引用时,一定要注意下标的值不要超过数组的范围,否则会产生数组越界问题。因为当数组下标越界时,编译器并不认为它是一个错误,但这往往会带来非常严重的后果。,例如:定义了一个整型数组,a,:,int a10;,数组,a,的合法下标为,09,。如
6、果程序要求给,a10,赋值,将可能导致程序出错,甚至系统崩溃。,可以使用下式预防越界:,sizeof,(,a,),/sizeof,(,int,),10,4/19/2025,一维数组例,#include,using namespace std;,void showVal(int num);,int main(),int testArr 5 =5,10,15,20,25;,for(int ct=0;ct 5;ct+),showVal(,testArr ct,);,return 0;,void showVal(int num),cout num “;,11,4/19/2025,一维数组例,#incl
7、ude,using namespace std;,int main(),int i,a,10,;,for(i=0;i=0;i-),couta,i,;,coutendl;,return 0;,12,4/19/2025,一维数组例,#include,using namespace std;,int main(),int age5;/,数组声明,int sum=0;,for(int i=0;i5;i+),coutagei;/,写数组元素,sum+=agei;,coutThe average is:sum/5.0endl;,return 0;,13,4/19/2025,一维数组例,#include,u
8、sing namespace std;,int main(),int age=18,20,17,21,19;/,数组初始化,int sum=0;,for(int i=0;i5;i+),sum+=agei;,coutThe average is:sum/5.0endl;,return 0;,14,4/19/2025,一维数组例,编写程序,用冒泡法对,10,个数排序,(,按由小到大顺序,),。,15,4/19/2025,一维数组例,#include,using namespace std;,int main(),int a11;,int i,j,t;,coutinput 10 numbers,:,
9、endl;,for(i=1;iai;,coutendl;,for(j=1;j=9;j+)/,共进行,9,趟比较,for(i=1;iai+1)/,如果前面的数大于后面的数,t=ai;ai=ai+1;ai+1=t;,coutthe sorted numbers,:,endl;,for(i=1;i11;i+)/,输出,10,个数,coutai;,coutn;,for(i=0;iai;,for(i=0;in-1;i+),for(j=i+1;jn;j+),if(aiaj),swap(ai,aj);,for(i=0;in;i+),coutaia;,int na;,for(c=0;cnc;,cinb;,fo
10、r(c=0;cb),e=e+1;,coutn;,while(n0),ai=n%2;,i+;,n=n/2;,for(j=i-1;j=0;j-)coutaj;,86.,十进制数转换为二进制数,19,4/19/2025,二维数组的定义,语法格式:,类型 数组名,常量表达式,1,常量表达式,2,;,如:,int a23,;,数组,a,各元素如下:,a00 a01 a02,a10 a11 a12,二维数组中每个元素都是用下列方式标识:,数组名,行下标,列下标,对于二维数组,可以把它看成是由多个一维数组构成。如:,int a23,;就可以看成是由两个形如,int a3,;的一维数组构成的。,20,4/19
11、/2025,二维数组初始化,(,1,)分别对各元素赋值,每一行的初始值用一对花括号括起来。例如:,int a23=,1,2,3,4,5,6,;,(,2,)将各初始值全部连续地写在一个花括号内,在程序编译时会按内存中排列的顺序将各初始值分别赋给数组元素。例如,int a23=1,2,3,4,5,6;,(,3,)只对数组的部分元素赋值。例如:,int a23=1,2,3,4;,(,4,)可以在分行赋初值时,只对该行中一部分元素赋初值,例如:,static int a23=1,2,1;,21,4/19/2025,省略第一维的大小,若在定义数组时给出了全部数组元素的初值,则数组的第一维下标可以省略,但
12、第二维下标不能省略。,下面两种定义方式等价:,static int a23=1,2,3,4,5,6;,static int a 3=1,2,3,4,5,6;,static int a2=1,2,3,4,5,6;,/,错误写法,在分行定义时,也可以只对部分元素赋初值而省略第一维的下标。例如:,int a 4=1,2,3,4,5,;,等价于,int a34=1,2,0,0,0,0,0,0,3,4,5,0,;,22,4/19/2025,二维数组例,#include,using namespace std;,int main(),float disks24;,int row,col;,disks00=
13、2.39;/Row 1,column 1,disks01=2.75;/Row 1,column 2,disks02=3.29;/Row 1,column 3,disks03=3.59;/Row 1,column 4,disks10=1.75;/Row 2,column 1,23,4/19/2025,二维数组例,disks11=2.19;/Row 2,column 2,disks12=2.69;/Row 2,column 3,disks13=2.95;/Row 2,column 4,/Print,for(row=0;row2;row+),for(col=0;col4;col+),cout “$”
14、disksrowcol “n”;,return 0;,24,4/19/2025,二维数组例,#include /,二维矩阵的转置,using namespace std;,int main(),int a23=1,2,3,4,5,6;,int b32,i,j;,coutarray a,:,endl;,for(i=0;i=1;i+),for(j=0;j=2;j+),bji=aij;,coutarray b,:,endl;,for(i=0;i=2;i+),for(j=0;j=1;j+),coutb,i,j,;,coutendl;,return 0;,25,4/19/2025,二维数组例,#incl
15、ude,using namespace std;,int main(),int i,j,row=0,colum=0,max;,int a34=5,12,23,56,19,28,37,46,-12,-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;/,记下该元素的行号,i,colum=j;/,记下该元素的列号,j,coutmax=max,row=row,colum=columendl;,return
16、0;,26,4/19/2025,例,:,读入下表中值到数组,分别求各行、各列及表中所有数之和,12 4 6,15 7 9,8 23 3,2 5 17,12 4 6,22,15 7 9,31,8 23 3,34,2 5 17,24,37,39,35,111,#include,int main(),int x54,i,j;,for(i=0;i4;i+),for(j=0;jxij;,for(i=0;i3;i+),x4i=0;,for(j=0;j5;j+),xj3=0;,for(i=0;i4;i+),for(j=0;j3;j+),xi3+=xij;,x4j+=xij;,x43+=xij;,for(i=
17、0;i5;i+),for(j=0;j4;j+),cout“”xij;,coutendl;,return 0;,27,4/19/2025,多维数组,类型 数组名,常量表达式,1,常量表达式,2,常量表达式,n,;,例如:定义一个整型三维数组:,int a234;,int a234=,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,;,或:,int a234=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24;,或,int a 34=1,2,3,4
18、5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24;,int b 32=1,2,3,5,0,7,8,10;,int b232=1,2,3,0,5,0,0,7,8,0,10,0;,等价,28,4/19/2025,数组和函数,1.,数组元素作为函数的参数,用法与普通变量作参数相同。将数组元素的值传送给形参进行函数体调用,函数调用完返回后,数组元素的值不变。这种传送方式是“值传送”方式。,29,4/19/2025,例,#include,using namespace std;,int main(),int max_value(int x,i
19、nt max);/,函数声明,int i,j,row=0,colum=0,max;,int a34=5,12,23,56,19,28,37,46,-12,-34,6,8;/,数组初始化,max=a00;,for(i=0;i=2;i+),for(j=0;j=3;j+),max=max_value(aij,max);,/,调用,max_value,函数,if(max=aij)/,如果函数返回的是,aij,的值,row=i;/,记下该元素行号,i,colum=j;/,记下该元素列号,j,coutmax=max,row=row,colum=colummax)return x;/,如果,xmax,,函数
20、返回值为,x,else return max;/,如果,xmax,,函数返回值为,max,30,4/19/2025,数组名作为函数的参数,当用数组名作为函数的实参和形参时,传递的是数组的地址。这时实参数组和形参数组应该分别在它们所在的函数中定义。把实参数组的起始地址传送给形参数组,这样形参数组就和实参数组共占同一段内存单元,当形参值发生变化时,实参值也发生变化。,数组和函数,31,4/19/2025,例,#include,using namespace std;,int main(),void select_sort(int array,int n);/,函数声明,int a10,i;,cou
21、tenter 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;,32,4/19/2025,例,void select_sort(int array,int n),/,形参,array,是数组名,int i,j,k,t;,for(i=0;in-1;i+),k=i;,for(j=i+1;jn;j+),if(ar
22、rayjarrayk)k=j;,t=arrayk;,arrayk=arrayi;,arrayi=t;,void select_sort(int array10,int n),void select_sort(int array,int n),void select_sort(int array5,int n),均合法,.,.,2,1,0,9,a,56,23,12,.,.,88,array,33,4/19/2025,例,输入,10,个学生的成绩,求平均成绩,并将低于平均成绩的分数打印出来。,#include,using namespace std;,void readdata(float sco
23、re10),coutPlease input 10 students score:endl;,for(int i=0;iscorei;,34,4/19/2025,例,float aver(float score10),float sum=0;int i;,for(i=0;i10;i+),sum+=scorei;,return(sum/10);,void print(float score10,float ave),int i;,coutthe scores which are below the average:;,for(i=0;i10;i+),if(scoreiave),coutscore
24、i;,coutendl;,35,4/19/2025,例,int main(),float ave,score10;,readdata(score);,ave=aver(score);,coutaverage=aveendl;,print(score,ave);,return 0;,运行结果:,Please input 10 students score:,10 20 30 40 50 60 70 80 90 100,average=55,the scores which are below the average:10 20 30 40 50,36,4/19/2025,数组元素与 数组名,作函
25、数参数比较,1,2,a,调用前,a0,a1,1,2,a,调用,a0,a1,1,2,x,y,2,1,x,y,交换,1,2,a,返回,#include,void,swap2(int x,int y),int z;,z=x;x=y;y=z;,int main(),int a2=1,2;,swap2(a0,a1);,cout“a0=“a0“,a1=“a1;,return 0;,值传递,37,4/19/2025,1,2,a,调用前,1,2,a,x,调用,2,1,a,x,交换,2,1,a,返回,#include,void,swap2,(int x,),int z;,z=x0;x0=x1;x1=z;,int
26、 main(),int a2=1,2;,swap2(,a,);,couta0=“a0“,a1=“a1;,return 0;,地址传递,38,4/19/2025,例,:,求二维数组中最大元素值,1 3 5 7,2 4 6 8,15 17 34 12,i,j,max=1,1 3 5 7,2 4 6 8,15 17 34 12,i,j,max=3,1 3 5 7,2 4 6 8,15 17 34 12,i,j,max=5,j,1 3 5 7,2 4 6 8,15 17 34 12,i,max=7,j,1 3 5 7,2 4 6 8,15 17 34 12,i,max=7,j,1 3 5 7,2 4
27、6 8,15 17 34 12,i,max=34,39,4/19/2025,#include,int max_value,(int array34,),int i,j,k,max;,max=array00;,for(i=0;i3;i+),for(j=0;jmax),max=arrayij;,return(max);,int main(),int a34=1,3,5,7,2,4,6,8,15,17,34,12;,cout“max value is“,max_value(,a,),endl;,return 0;,多维形参数组第一维维数,可省略,第二维必须相同,int array4,40,4/19/
28、2025,例,:,求二维数组中各行元素之和,#include,void get_sum_row(,int x3,int result,int row,int col),int i,j;,for(i=0;irow;i+),resulti=0;,for(j=0;jcol;j+),resulti+=xij;,int main(),int a23=3,6,9,1,4,7;,int sum_row2,row=2,col=3,i;,get_sum_row(,a,sum_row,row,col);,for(i=0;irow;i+),coutThe sum of row“i+1“=“sum_rowiendl;
29、return 0;,3,1,4,6,7,9,a,sum_row,x,result,18,12,41,4/19/2025,字符数组,char c10;,c0=I;c1=;c2=a;c3=m;c4=;,c5=h;c6=a;c7=p;c8=p;c9=y;,char c10=I,a,m,h,a,p,p,y;,char c=I,a,m,h,a,p,p,y;,42,4/19/2025,字符数组赋值和引用,char c5;,c=C,h,i,n,a;/,错误,不能对整个数组一次赋值,c0=C;c1=h;c2=i;c3=n;c4=a;,/,对数组元素赋值,正确,若已定义了,a,和,b,是具有相同类型和长度的数
30、组,且,b,数组已被初始化,则:,a=b;/,错误,不能对整个数组整体赋值,a0=b0;/,正确,引用数组元素,43,4/19/2025,字符串,char str=I am happy;,char str=I am happy;,char str=I,a,m,h,a,p,p,y,0;,等价,char str10=China;,44,4/19/2025,字符数组的输入和输出,(1),逐个字符输入输出。,如:,char c5;,for(int i=0;ici;,(2),将整个字符串一次输入或输出。,如:,char str,20,;,cinstr;/,用字符数组名输入字符串,cout,字符串,2,,
31、函数值为一正整数。,(3),如果字符串,1,字符串,2,,函数值为一负整数。,5,、,字符串长度函数,strlen(const char);,char str10=China;,coutstrlen(str);/,不包括,0,字符串处理函数,47,4/19/2025,例,#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_strin
32、g(country_name,3);,return 0;,48,4/19/2025,例,void max_string(char str30,int n),int i;,char string30;,strcpy(string,str0);/,使,string,的值为,str0,的值,for(i=0;i0),strcpy(string,stri);/,将,stri,中的字符串复制到,string,coutendlthe largest string is,:,string0),strcpy(str,str1);strcat(str,str2);,else,if(strcmp(str1,str2
33、)0),strcpy(str,str2);strcat(str,str1);,else,strcpy(str,str1);,len3=strlen(str);,puts(str);,coutLen1=len1,Len2=len2,Len3=len3 string1;/,从键盘输入字符串给字符串变量,string1,cout,、,=,、,=,等关系运算符来进行字符串的比较。,53,4/19/2025,字符串类,5,、,字符串数组,string name5;/,定义一个字符串数组,它包含,5,个字符串元素,string name5=Zhang,Li,Fun,Wang,Tan;,54,4/19/20
34、25,字符串类,#include,#include,using namespace std;,int main(),string string1,string2,string3,temp;,coutstring1string2string3;,if(string2string3),temp=string2;string2=string3;string3=temp;,if(string1=string2),coutstring1“”string2“”string3endl;,else if(string1=string3),coutstring2“”string1“”string3endl;,else,coutstring2“”string3“”string1endl;,55,4/19/2025,本章总结,1,、数组的定义格式,2,、数组元素的格式,3,、数组的赋值与初始化,4,、数组与函数,5,、字符数组,6,、字符串,56,4/19/2025,