一、实验目的
(一)掌握二维数组的定义、赋值及输入输出的方法;
(二)掌握与二维数组有关的算法如查找、矩阵转置等;
(三)掌握在程序设计中使用数组的方法。数组是非常重要的数据类型,循环中使用数组能更好地发挥循环的作用,有些问题不使用数组难以实现。
(四)掌握在VC++环境下上机调试二维数组程序的方法,并对结果进行分析。
二、预习要求
熟悉二维数组的定义、引用和相关算法(求最大值、最小值)的程序设计,同时要掌握在程序设计中利用双重循环来实现二维数组的输入和输出。
三、实验内容
(一)二维数组的初始化,即给二维数组的各个元素赋初值。下面的几个程序都能为数组元素赋值,请输入程序并运行,比较这些赋值方法有何异同。
1.在定义数组的同时对数组元素分行初始化。
1. /* c7-1.c 二维数组的初始化(分行)*/ 2. #include "stdio.h" 3. void main( ) 4. { int i,j,a[2][3]={{1,2,3},{4,5,6}}; 5. for(i=0; i<2; i++) 6. { for(j=0; j<3; j++) 7. printf("%d ",a[i][j]); 8. printf("\n"); 9. } 10. }
2.不分行的初始化。把{ }中的数据依次赋值给数组的各个元素。
1. /* c7-2.c 二维数组的初始化(不分行)*/ 2. #include "stdio.h" 3. void main( ) 4. { int i,j,a[2][3]={1,2,3,4,5,6}; 5. for(i=0;i<2;i++) 6. { for(j=0;j<3;j++) 7. printf("%d ",a[i][j]); 8. printf("\n"); 9. } 10. }
3.为部分数组元素初始化。
如:数组定义语句为:
int i,j,a[2][3]={{1,2},{4}};
4.可以省略第一维的定义,但不能省略第二维的定义。
如:
int a[ ][3]={1,2,3,4,5,6};
依次运行以上程序,比较这四种定义方式的不同之处。
(二)求一个4×4矩阵的主对角线元素之和。
编程提示:
1.定义一个4行4列的二维数组a。
2.可利用双重循环的嵌套为该二维数组的各个数组元素赋值,一般格式为:
for(i=0; i<4; i++)
for(j=0; j<4; j++)
scanf("%d",&a[i][j]);
3.用循环求和,并注意矩阵对角上线元素的特征是:行下标和列下标相同。
4.输出对角线元素之和。
1. /* c7-3.c 求一个4×4矩阵的主对角线元素之和*/ 2. #include "stdio.h" 3. void main() 4. { 5. int i,i,s1=0,s2=0,sum=0; 6. int a[4][4]={1,2,3,4,2,3,4,5,3,4,5,6,4,5,6,7}; 7. for(i=0;i<4;i++) 8. { 9. for(j=0;j<4;j++) 10. { 11. if(i==j) 12. s1=s1+a[i][j]; 13. if(i+j==3) 14. s2=s2+a[i][j]; 15. } 16. } 17. sum=s1+s2; 18. printf("sum=%d\n",sum); 19. }
(三)打印出以下的杨辉三角(要求打印出10行)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
编程提示:
1.杨辉三角的特点是:第1列和对角线上的元素为1,其它各元素的值都是上一行上一列元素和上一行前一列元素之和。
2.定义一个10×10的二维数组a。
3.先用一个单层循环为第一列和对角线上的元素赋值。如:
for(i=0; i<10; i++) { a[i][i]=1;a[i][0]=1; }
4.再用一个双重循环嵌套为其它元素赋值。
for( ; i<10; i++)
for( ; ; j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
5.计算之后再用一个双重循环嵌套输出杨辉三角。注意各层循环变量的初值和终值怎样确定。
1. #include "stdio.h" 2. void main() 3. { 4. int i,j,a[10][10]; 5. for(i=0;i<10;i++) 6. { 7. a[i][i]=1; 8. a[i][0]=1; 9. } 10. for(i=2;i<10;i++) 11. { 12. for(j=1;j<i;j++) 13. { 14. a[i][j]=a[i-1][j-1]+a[i-1][j]; 15. } 16. } 17. for(i=0;i<10;i++) 18. { 19. for(j=0;j<=i;j++) 20. printf("%d ",a[i][j]); 21. printf("\n"); 22. } 23. }
(四)已知二维数组a中的元素为:
4 4 34
37 3 12
5 6 5
求二维数组a中的最大值和最小值。程序的输出应为:The max is: 37 ,The min is: 3
1. /* c7-5.c 求二维数组中元素的最大值与最小值 */ 2. #include "stdio.h" 3. void main() 4. { 5. int i,j,max,min,a[3][3]-{1,2,3,4,5,6,7,8,9}; 6. max=a[0][0]; 7. min=a[3][3]; 8. for(i=0;i<3;i++) 9. { 10. for(j=0;j<3;j++) 11. if(max<a[i][j]) 12. max=a[i][j]; 13. if(min>a[i][j]) 14. min=a[i][j]; 15. } 16. printf("该数组最大值为:%d\n",max); 17. printf("该数组最小值为:%d\n",min); 18. }
(五)以下程序是查找二维数组a的最大元素及其下标。
1. /* c7-6.c 求二维数组中元素的最大值及其下标 */ 2. #include "stdio.h" 3. void main() 4. { int a[4][4]={{1,2,3,4},{3,4,5,6},{5,6,7,8},{7,8,9,10}}; 5. int i,j,max,l,c; /* max存放最大值,l、c分别存放行和列的下标 */ 6. max=a[0][0]; 7. for(i=0; i<4; i++) 8. { 9. for(j=0; j<4; j++) 10. if(max<a[i][j]) 11. { 12. max=a[i][j]; 13. l=i; 14. c=j; 15. } 16. } 17. printf("max=%d,l=%d,c=%d%\n",max,l,c); 18. }
四、实验注意事项
(一)C规定,二维数组的行和列的下标都是从0开始的。
例如,有定义:int b[3][[5]; 则数组b的第一维下标的上界为2,第二维下标的上界为4。说明定义了一个整型二维数组b,它有3行5列共3*5=15个数组元素,行下标为0,1,2,列下标为0,1,2,3,4,则数组b的各个数组元素是:
b[0][0],b[0][1],b[0][2],b[0][3],b[0][4]
b[1][0],b[1][1],b[1][2],b[1][3],b[1][4]
b[2][0],b[2][1],b[2][2],b[2][3],b[2][4]
(二)要对二维数组的多个数组元素赋值,应当使用循环语句并在循环过程中,使数组元素的下标变化。可用下面的方法为所有数组元素赋值:
int i,j,a[3][3];
for(i=0; i<3; i++)
for(j=0; j<3; j++)
scanf("%d",&a[i][j]);