C++一维数组
定义一维数组
定义一维数组的一般格式为:
类型标识符 数组名[常量表达式];
例如:
int a[10];</div>
它表示数组名为a,此数组为整型,有10个元素。
关于一维数组的几点说明:
1) 数组名定名规则和变量名相同,遵循标识符定名规则。
2) 用方括号括起来的常量表达式表示下标值,如下面的写法是合法的:
int a[10]; int a[2*5]; int a[n*2]; //假设前面已定义了n为常变量</div>
3) 常量表达式的值表示元素的个数,即数组长度。例如,在“int a[10];”中,10表示a数组有10个元素,下标从0开始,这10个元素是: a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7], a[8],a[9]。注意最后一个元素是a[9]而不是a[10]。
4) 常量表达式中可以包括常量、常变量和符号常量,但不能包含变量。也就是说,C++不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。例如,下面这样定义数组是不行的:
int n; cin>>n; //输入a数组的长度 int a[n]; //企图根据n的值决定数组的长度</div>
如果把第1,2行改为下面一行就合法了:
const int n=5;</div>
引用一维数组的元素
数组必须先定义,然后使用。只能逐个引用数组元素的值而不能一次引用整个数组中的全部元素的值。
数组元素的表示形式为:
数组名[下标]
下标可以是整型常量或整型表达式。例如:
a[0]= a[5]+ a[7]- a[2*3]</div>
【例】数组元素的引用。
#include <iostream> using namespace std; int main( ) { int i, a[10]; for (i=0;i<=9;i++) a[i]=i; for (i=9;i>=0;i--) cout<<a[i]<<" "; cout<<endl; return 0; }</div>
运行结果如下:
9 8 7 6 5 4 3 2 1 0</div>
程序使a[0]~a[9]的值为0~9,然后按逆序输出。
一维数组的初始化
1) 在定义数组时分别对数组元素赋予初值。例如:
int a[10]={0,1,2,3,4,5,6,7,8,9};</div>
2) 可以只给一部分元素赋值。例如:
int a[10]={0,1,2,3,4};</div>
3) 如果想使一个数组中全部元素值为1,可以写成:
int a[10]={1,1,1,1,1,1,1,1,1,1};</div>
不能写成
int a[10]={1*10};</div>
不能给数组整体赋初值。
4) 在对全部数组元素赋初值时,可以不指定数组长度。例如:
int a[5]={1,2,3,4,5};</div>
可以写成
int a[]={1,2,3,4,5};</div>
一维数组程序举例
【例】用数组来处理求Fibonacci数列问题。
可以用20个元素代表数列中的20个数,从第3个数开始,可以直接用表达式f[i]=f[i-2]+f[i-1]求出各数。程序如下:
#include <iostream> #include <iomanip> using namespace std; int main( ) { int i; int f[20]={1,1}; //f[0]=1,f[1]=1 for(i=2;i<20;i++) f[i]=f[i-2]+f[i-1]; //在i的值为2时,f[2]=f[0]+f[1],依此类推 for(i=0;i<20;i++) //此循环的作用是输出20个数 { if(i%5==0) cout<<endl; //控制换行,每行输出5个数据 cout<<setw(8)<<f[i]; //每个数据输出时占8列宽度 } cout<<endl; //最后执行一次换行 return 0; }</div>
运行结果如下:
【例】编写程序,用起泡法对10个数排序(按由小到大顺序)。
起泡法的思路是:将相邻两个数比较,将小的调到前头。见图5.2。然后进行第2趟比较,对余下的前面5个数按上法进行比较,见图。
可以推知,如果有n个数,则要进行n-1趟比较(和交换)。在第1趟中要进行n-1次两两比较,在第j趟中要进行n-j次两两比较。
根据以上思路写出程序,今设n=10,本例定义数组长度为11,a[0]不用,只用a[1]~a[10],以符合人们的习惯。从前面的叙述可知,应该进行9趟比较和交换。
#include <iostream> using namespace std; int main( ) { int a[11]; int i, j, t; cout<<"input 10 numbers :"<<endl; for (i=1;i<11;i++) //输入a[1]~a[10] cin>>a[i]; cout<<endl; for (j=1;j<=9;j++) //共进行9趟比较 for(i=1;i<=10-j;i++)//在每趟中要进行(10-j)次两两比较 if (a[i]>a[i+1]) //如果前面的数大于后面的数 { t=a[i];a[i]=a[i+1];a[i+1]=t; }//交换两个数的位置, 使小数上浮 cout<<"the sorted numbers :"<<endl; for(i=1;i<11;i++) //输出10个数 cout<<a[i]<<" "; cout<<endl; return 0; }</div>
运行情况如下:
input 10 numbers: 3 5 9 11 33 6 -9 -76 100 123↙ the sorted numbers: -76 -9 3 5 6 9 11 33 100 123</div>
C++二维数组
具有两个下标的数组称为二维数组。有些数据要依赖于两个因素才能惟一地确定,例如有3个学生,每个学生有4门课的成绩,显然,成绩数据是一个二维表,如书中表所示。
想表示第3个学生第4门课的成绩,就需要指出学生的序号和课程的序号两个因素,在数学上以S3,4表示。在C++中以s[3][4]表示,它代表数据73。
定义二维数组
定义二维数组的一般形式为:
类型标识符 数组名[常量表达式][常量表达式];
例如:
float a[3][4], b[5][10];</div>
定义a为3×4(3行4列)的单精度数组,b为5×10(5行10列)的单精度数组。注意不能写成“float a[3,4], b[5,10];”。C++对二维数组采用这样的定义方式,使我们可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。例如,可以把a看作是一个一维数组,它有3个元素:a[0],a[1],a[2],每个元素又是一个包含4个元素的一维数组,见图5.4。a[0],a[1],a[2]是3个一维数组的名字。
上面定义的二维数组可以理解为定义了3个一维数组,即相当于:
float a[0][4], a[1][4], a[2][4];</div>
此处把a[0],a[1],a[2]作一维数组名。C++的这种处理方法在数组初始化和用指针表示时显得很方便,这在以后会体会到。
C++中,二维数组中元素排列的顺序是:按行存放,即在内存中先顺序存放第一行的元素,再存放第二行的元素。图表示对a[3][4]数组存放的顺序。
上面定义的二维数组可以理解为定义了3个一维数组,即相当于:
float a[0][4], a[1][4], a[2][4];</div>
此处把a[0],a[1],a[2]作一维数组名。C++的这种处理方法在数组初始化和用指针表示时显得很方便,这在以后会体会到。
C++中,二维数组中元素排列的顺序是:按行存放,即在内存中先顺序存放第一行的元素,再存放第二行的元素。图5.5表示对a[3][4]数组存放的顺序。
C++允许使用多维数组。有了二维数组的基础,再掌握多维数组是不困难的。例如,定