第5章 利用数组处理批量数据 接标题2接正文5.1为什么需要用数组 如果有100个互不关联的数据,可以分别把它们存放到100个变量中。但是如果这些数据是有内在联系的,是具有相同属性的(如100个学生的成绩),就可以把这批数据看作一个整体,称为数组(array)。所谓数组,就是用一个统一的名字代表这批数据,而用序号或下标来区分各个数据。例如用s代表学生成绩这组数据,s就是数组名,用s1,s2,s3分别代表学生1、学生2、学生3的成绩,s右下角的数字1,2,3用来表示该数据在数中的序号,称为下标(subscript)。数组中的数据称为数组元素。 概括地说: 数组是有序数据的集合。要寻找一个数组中的某一个元素必须给出两个要素,即数组名和下标。数组名和下标唯一地标识一个数组中的一个元素。 数组是有类型属性的,例如可以定义a是整型数组,b是单精度型数组等。同一数组中的每一个元素都必须图5.1 属于同一数据类型。例如,一个数组不能由9个整型数据和1个单精度型数据组成。一个数组在内存中占一片连续的存储单元。如果有一个整型数组a,假设数组的起始地址为2000,则该数组在内存中的存储情况如图5.1所示。 引入数组就不需要在程序中定义大量的变量,大大减少程序中变量的数量,使程序精练,而且数组含义清楚,使用方便,明确地反映了数据间的联系。许多好的算法都与数组有关。熟练地利用数组,可以大大地提高编程和解题的效率,加强了程序的可读性。 由于在程序中无法用下角表示下标,因此在计算机高级语言中都用括号来表示下标,在BASIC,Pascal,FORTRAN,COBOL等语言中用圆括号来表示下标,如s(1),s(2),s(3)。C和C++用方括号来表示下标,如用s\[1\],s\[2\],s\[3\] 分别代表s1,s2,s3。5.2定义和引用一维数组[4/5]5.2.1定义一维数组定义一维数组的一般形式为 类型名数组名\[常量表达式\]; 例如: 表示数组名为a,此数组为整型,有10个元素。 说明: (1) 数组名定名规则和变量名相同,遵循标识符定名规则。 (2) 用方括号括起来的常量表达式表示下标值,如下面写法是合法的: //假设前面已定义了n为常变量 (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) 常量表达式中可以包括常量、常变量和符号常量,但不能包含变量。也就是说,不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。例如,下面这样定义数组是不行的: // 输入a数组的长度 int a\[n\];// 试图根据n的值决定数组的长度 如果把第1,2行改为下一行就合法了。// 用const定义n为常变量5.2.2引用一维数组的元素 数组必须先定义,然后使用。只能逐个引用数组元素的值而不能一次引用整个数组中的全部元素的值。 数组元素的表示形式为 数组名\[下标\] 下标可以是整型常量或整型表达式。例如: 例5.1定义一个整型数组a,把0~9共10个整数赋给数组元素a\[0\]~a\[9\] ,然后按a\[9\],a\[8\],…,a\[0\] 的顺序输出。 利用循环来处理这类问题是轻而易举的。 编写程序: #include using namespace std; int main() {int i,a\[10\]; for (i=0;i<=9;i++) a\[i\]=i;//使a\[0\]~a\[9\]的值为0~9 for (i=9;i>=0;i--) cout< #include 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< using namespace std; int main() { int a\[11\]; int i,j,t; cout<<"input 10 numbers :"<>a\[i\]; cout<a\[i+1\])//如果前面的数大于后面的数 {t=a\[i\];a\[i\]=a\[i+1\];a\[i+1\]=t;} //交换两个数的位置,使小数上浮 cout<<"the sorted numbers :"< using namespace std; int main() { int a\[2\]\[3\]={{1,2,3},{4,5,6}}; int b\[3\]\[2\],i,j; cout<<"array a:"< using namespace std; int main() {int i,j,row=0,colum=0,max; int a\[3\]\[4\]={{5,12,23,56},{19,28,37,46},{-12,-34,6,8}}; max=a\[0\]\[0\];//使max开始时取a\[0\]\[0\]的值 for (i=0;i<=2;i++)//从第0行到第2行 for (j=0;j<=3;j++)//从第0列到第3列 if (a\[i\]\[j\]>max)//如果某元素大于max {max=a\[i\]\[j\];//max将取该元素的值 row=i;//记下该元素的行号i colum=j;//记下该元素的列号j } cout<<"max="< using namespace std; int main() {int max_value(int x,int max);//函数声明 int i,j,row=0,colum=0,max int a\[3\]\[4\]={{5,12,23,56},{19,28,37,46},{-12,-34,6,8}};//数组初始化 max=a\[0\]\[0\]; for (i=0;i<=2;i++) for (j=0;j<=3;j++) {max=max_value(a\[i\]\[j\],max);//调用max_value函数