第 8讲 一维数组和二维数组一、一维数组
1、一维数组的定义
2、一维数组元素的引用
3、一维数组的初始化二、二维数组
1、二维数组的定义和引用
2、二维数组的初始化数学中,a1,a2,a3,···,ai,···,an
C程序中,a[0],a[1],a[2],···,a[i-1],··a[n-1]
数组是数目固定,类型相同的若干变量的有序集合。
数组中的每一个数称为数组元素,数组中的每一个元素都属于同一个数据类型。
在内存中数组占有一段连续的存储空间。
一、一维数组
1、一维数组的定义定义的格式:
类型说明符 数组名 [整常量表达式 ],···;
说明:
类型说明符,表明该数组所属类型,即数组元素的类型。
数组名,即数组的名称,其命名方法同变量名。
[ ]:下标运算符,可通过该运算符的个数反映出数组的维数。
整常量表达式,为一整常量表达式,表明数组的大小。
特点:
数组元素的个数必须是确定的数组元素的类型必须一致一维数组在内存中的存放方式:
数组定义以后,编译系统(计算机)将在内存中开辟一块连续的存储单元用于存放数组元素,
数组名表示存储单元的首地址,存储单元的大小由数组的类型和数组的大小决定。
例如 int a[5];
int a[ 4 ]a[ 3 ]a[ 2 ]a[ 1 ]a[ 0 ]
2字节 2字节 2字节 2字节 2字节引用方式,数组名 [下标 ]
2、一维数组元素的引用说明:
下界 ≤ 下标 ≤ 上界;
下界= 0;上界=整常量表达式- 1。
下标为整型表达式;
一个数组元素实质是一个变量,代表内存中的一个存储单元。引用后的数组变量也称下标变量。
例 #define N 20
int a[5];
float f1[N+6];
说明:
a[5],a[0],a[1],a[2],a[3],a[4]
f1[N+6],f1[0],f1[2],··,f1[25]
注意:
引用 a[5],f1[26]编译不报错,但不能得到正确的运行结果。
一维数组元素引用的规定:
数组必须先定义后使用。
数组元素只能逐个被引用,不能一次引用整个数组。
对数组中所有元素逐个引用时,通常可使用循环结构。
例,1) float b[12];
b[1]=1.0; b[3]=7.6;
b[0]=b[1]+b[3];
b[2]=b[1]-b[3];
···
2) int j,a[10];
for ( j=0; j<10; j++ ) a[j]=j;
数组的初始化,指定义数组时对数组元素赋以初值。
3、一维数组的初始化格式:
类型符 数组名 [表达式 ]= {初值表 };
说明:
给全部元素赋初值。
给部分元素赋初值。
给全部元素赋初值时可不指定数组的长度。
给全部元素赋初值。
例 int a[8]={ 0,1,2,3,4,5,6,7 };
给部分元素赋初值。
例 int a[8]={ 0,1,2,3,4 };
a[0 ] a[1 ] a[2 ] a[3 ] a[4 ] a[5 ] a[6 ] a[7 ]
0 1 2 3 4 5 6 7
a[0 ] a[1 ] a[2 ] a[3 ] a[4 ] a[5 ] a[6 ] a[7 ]
0 1 2 3 4 0 0 0
给全部元素赋初值时可不指定数组的长度。
例 int a[ ]={ 0,1,2,3,4,5,6,7 };
a[0 ] a[1 ] a[2 ] a[3 ] a[4 ] a[5 ] a[6 ] a[7 ]
0 1 2 3 4 5 6 7
例 6.1 统计全班 32名同学某门功课的平均成绩,找出最高分,输出。
main( )
{ int i,sum,max,a[32] ;
float average;
for ( i=0; i < 32; i ++ )
scanf( "%d",&a[i] ); / * 给数组元素赋初值 */
for ( sum=0,i=0,max=a[0]; i<32; i++ )
{ sum += a[i];
if ( a[i] > max ) max=a[i];
}
average=(float)sum/32;
printf("Average=%.2f,MAX=%d\n",average,max);
}
例 6.2 将一个数组中的值按逆序重新存放,并输出它。
这里数组长度为 N。
分析,N-S图如下显示初始数组元素显示逆序数组元素
for(i=0;i<N/2;i++)
第 i个元素与第 N-i-1个元素互换程序:
# define N 5
main( )
{char a[N],temp;
int i;
printf(“Enter array a:\n”);
for(i=0;i<N;i++) scanf(“%c”,&a[i]);
for(i=0;i<N;i++) printf(“%4c”,a[i]);
for(i=0;i<N/2;i++) { temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp;}
printf(“\n Now,array a:\n”);
for(i=0;i<N;i++) printf(“%4c”,a[i]);
}
例 6.3 用起泡法排序。
将任意十个数按由小到大的方式排序。
例:
第 一 轮
6
8
2
9
3
1
2
8
3
91
9
6
2
8
3
1
9
2
6
3
81
8
第 二 轮
2
3
1
6
8
9
第 三 轮
2
1
3
6
8
9
第 四 轮
1
2
3
6
8
9
第 五 轮
6
8
2
9
3
1
原 数思路,将相邻两个数进行比较,使小数在前,大数在后。
分析说明:
1)相邻两数比较,a[j]> a[j+1]
2) 第一轮,6个数,j=1~5; 循环 5次,找出最大数,放在最后。
3)第二轮,5个数,j=1~4; 循环 4次,找出次大数,放在最大数前。
4)余此类推,经过 5轮,将 6个数排序输出。
所以:外循环为 i=0~4,内循环为,j=0~5-i;
即,for( i=0; i< 5 ; i++)
for (j=0; j< 6–i; j++)
if ( a[j]> a[j+1]) { a[j]←→a[j+1] }
程序:
main( )
{ int a[10],i,j,k;
printf("请任意输入 10个整数,\n");
for ( i=0 ; i<10 ; i++) scanf("%d",&a[i]) ;
printf("\n") ;
for ( i=0; i<= 8; i++)
for ( j=0; j<9-i; j++)
if (a[j]>a[j+1])
{ k=a[j]; a[j]=a[j+1]; a[j+1]=k; }
printf("按由小到大的顺序输出 10个整数是,\n");
for (i=0; i<10; i++) printf(,%d,",a[i]);
printf(”\b。 \n”);
}
二、二维数组
1、二维数组的定义和引用二维数组的定义格式:
类型说明符 数组名 [整常量表达式 1][整常量表达式 2]
存储方式:
在计算机中二维数组的元素按行顺序存放。
注意:
0≤下标 1≤常量表达式 1-1;
0≤下标 2≤常量表达式 2-1。
二维数组的引用格式:
数组名 [下标 1][下标 2]
例,int m[2][3]
合法引用格式为:
m[0][0] m[0][1] m[0][2]
m[1][0] m[1][1] m[1][2]
说明:
给全部元素赋初值。
给部分元素赋初值。
给二维数组的全部元素赋初值,可以不指定第一维的长度,但第二维的长度不能省略。
2、二维数组的初始化二维数组初始化通常是按行进行的。
格式:
类型符 数组名 [表达式 1][表达式 2]={初值表 };
二维数组初始化举例,
给全部元素赋初值。
例 int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};
或写成,int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
给部分元素赋初值。
例 int a[3][4]={{0,1},{4,5,6},{8,9,10,11}};
或写成,int b[3][4]={0,1,2,3,4,5,6 } ;
给二维数组的全部元素赋初值,可以不指定第一维的长度,但第二维的长度不能省略。
例 int a[ ][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};
或写成,int a[ ][4]={0,1,2,3,4,5,6,7,8,9,10,11};
例 6.4 矩阵的转置。
分析:将矩阵 Am*n行列互换后,得一新矩阵为 Bn*m。
它们的元素对应关系为,ai,j = bj,i
程序,main()
{ int i,j,a[3][4],b[4][3];
for ( i=0; i<3; i++ )
for ( j=0; j<4 ; j++ )
{ scanf("%d",&a[i][j]);
b[j][i]=a[i][j]; }
for ( i=0; i<4; i++ )
{ for ( j=0; j<3 ; j++ )
printf("%7d ",b[i][j]);
printf("\n"); }
}
例 6.5 打印阳辉三角 。( 要求打印 N行)
杨辉三角形是( a+b) 的 n次幂展开后各项的系数。
例如:
…… ……
( a+b) 的 0次幂展开后各项的系数为,1
( a+b) 的 1次幂展开后各项的系数为,1,1
( a+b) 的 2次幂展开后各项的系数为,1,2,1
( a+b) 的 3次幂展开后各项的系数为,1,3,3,1
( a+b) 的 4次幂展开后各项的系数为,1,4,6,4,1
分析:杨辉三角各行的系数有如下规律
( 1)各行第一个数都是 1;
( 2)各行最后一个数为 1;
( 3)从第 3行起,除上面指出的第一个数和最后一个数外,其余各数是上一行同列和前一列两个数之和。
1
1,2,1
1,3,3,1
1,4,6,4,1
a[3][2]=a[2][1]+a[2][2]
a[4][4]=a[3][3]+a[3][4]
表示为通式即:
a[i][j]=a[i-1][j]+a[i-1][j-1]
N-S图为:
使数组第一列和对角线元素为 1
输出二维数组的内容其他各元素为,(用 for循环 )
a[i][j]=a[i-1][j]+a[i-1][j-1]
程序,# define N 10
main( )
{ int i,j,a[N][N];
for(i=0;i<N;i++) {a[i][i]=1; a[i][0]=1;}
for(i=2;i<N;i++)
for(j=1;j<=i-1;j++)
a[i][j]=a[i-1][j]+a[i-1][j-1];
for(i=0;i<N;i++)
{for(j=1;j<=i;j++) printf(“%6d”,a[i][j]);
print(“\n”);}
}
1、一维数组的定义
2、一维数组元素的引用
3、一维数组的初始化二、二维数组
1、二维数组的定义和引用
2、二维数组的初始化数学中,a1,a2,a3,···,ai,···,an
C程序中,a[0],a[1],a[2],···,a[i-1],··a[n-1]
数组是数目固定,类型相同的若干变量的有序集合。
数组中的每一个数称为数组元素,数组中的每一个元素都属于同一个数据类型。
在内存中数组占有一段连续的存储空间。
一、一维数组
1、一维数组的定义定义的格式:
类型说明符 数组名 [整常量表达式 ],···;
说明:
类型说明符,表明该数组所属类型,即数组元素的类型。
数组名,即数组的名称,其命名方法同变量名。
[ ]:下标运算符,可通过该运算符的个数反映出数组的维数。
整常量表达式,为一整常量表达式,表明数组的大小。
特点:
数组元素的个数必须是确定的数组元素的类型必须一致一维数组在内存中的存放方式:
数组定义以后,编译系统(计算机)将在内存中开辟一块连续的存储单元用于存放数组元素,
数组名表示存储单元的首地址,存储单元的大小由数组的类型和数组的大小决定。
例如 int a[5];
int a[ 4 ]a[ 3 ]a[ 2 ]a[ 1 ]a[ 0 ]
2字节 2字节 2字节 2字节 2字节引用方式,数组名 [下标 ]
2、一维数组元素的引用说明:
下界 ≤ 下标 ≤ 上界;
下界= 0;上界=整常量表达式- 1。
下标为整型表达式;
一个数组元素实质是一个变量,代表内存中的一个存储单元。引用后的数组变量也称下标变量。
例 #define N 20
int a[5];
float f1[N+6];
说明:
a[5],a[0],a[1],a[2],a[3],a[4]
f1[N+6],f1[0],f1[2],··,f1[25]
注意:
引用 a[5],f1[26]编译不报错,但不能得到正确的运行结果。
一维数组元素引用的规定:
数组必须先定义后使用。
数组元素只能逐个被引用,不能一次引用整个数组。
对数组中所有元素逐个引用时,通常可使用循环结构。
例,1) float b[12];
b[1]=1.0; b[3]=7.6;
b[0]=b[1]+b[3];
b[2]=b[1]-b[3];
···
2) int j,a[10];
for ( j=0; j<10; j++ ) a[j]=j;
数组的初始化,指定义数组时对数组元素赋以初值。
3、一维数组的初始化格式:
类型符 数组名 [表达式 ]= {初值表 };
说明:
给全部元素赋初值。
给部分元素赋初值。
给全部元素赋初值时可不指定数组的长度。
给全部元素赋初值。
例 int a[8]={ 0,1,2,3,4,5,6,7 };
给部分元素赋初值。
例 int a[8]={ 0,1,2,3,4 };
a[0 ] a[1 ] a[2 ] a[3 ] a[4 ] a[5 ] a[6 ] a[7 ]
0 1 2 3 4 5 6 7
a[0 ] a[1 ] a[2 ] a[3 ] a[4 ] a[5 ] a[6 ] a[7 ]
0 1 2 3 4 0 0 0
给全部元素赋初值时可不指定数组的长度。
例 int a[ ]={ 0,1,2,3,4,5,6,7 };
a[0 ] a[1 ] a[2 ] a[3 ] a[4 ] a[5 ] a[6 ] a[7 ]
0 1 2 3 4 5 6 7
例 6.1 统计全班 32名同学某门功课的平均成绩,找出最高分,输出。
main( )
{ int i,sum,max,a[32] ;
float average;
for ( i=0; i < 32; i ++ )
scanf( "%d",&a[i] ); / * 给数组元素赋初值 */
for ( sum=0,i=0,max=a[0]; i<32; i++ )
{ sum += a[i];
if ( a[i] > max ) max=a[i];
}
average=(float)sum/32;
printf("Average=%.2f,MAX=%d\n",average,max);
}
例 6.2 将一个数组中的值按逆序重新存放,并输出它。
这里数组长度为 N。
分析,N-S图如下显示初始数组元素显示逆序数组元素
for(i=0;i<N/2;i++)
第 i个元素与第 N-i-1个元素互换程序:
# define N 5
main( )
{char a[N],temp;
int i;
printf(“Enter array a:\n”);
for(i=0;i<N;i++) scanf(“%c”,&a[i]);
for(i=0;i<N;i++) printf(“%4c”,a[i]);
for(i=0;i<N/2;i++) { temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp;}
printf(“\n Now,array a:\n”);
for(i=0;i<N;i++) printf(“%4c”,a[i]);
}
例 6.3 用起泡法排序。
将任意十个数按由小到大的方式排序。
例:
第 一 轮
6
8
2
9
3
1
2
8
3
91
9
6
2
8
3
1
9
2
6
3
81
8
第 二 轮
2
3
1
6
8
9
第 三 轮
2
1
3
6
8
9
第 四 轮
1
2
3
6
8
9
第 五 轮
6
8
2
9
3
1
原 数思路,将相邻两个数进行比较,使小数在前,大数在后。
分析说明:
1)相邻两数比较,a[j]> a[j+1]
2) 第一轮,6个数,j=1~5; 循环 5次,找出最大数,放在最后。
3)第二轮,5个数,j=1~4; 循环 4次,找出次大数,放在最大数前。
4)余此类推,经过 5轮,将 6个数排序输出。
所以:外循环为 i=0~4,内循环为,j=0~5-i;
即,for( i=0; i< 5 ; i++)
for (j=0; j< 6–i; j++)
if ( a[j]> a[j+1]) { a[j]←→a[j+1] }
程序:
main( )
{ int a[10],i,j,k;
printf("请任意输入 10个整数,\n");
for ( i=0 ; i<10 ; i++) scanf("%d",&a[i]) ;
printf("\n") ;
for ( i=0; i<= 8; i++)
for ( j=0; j<9-i; j++)
if (a[j]>a[j+1])
{ k=a[j]; a[j]=a[j+1]; a[j+1]=k; }
printf("按由小到大的顺序输出 10个整数是,\n");
for (i=0; i<10; i++) printf(,%d,",a[i]);
printf(”\b。 \n”);
}
二、二维数组
1、二维数组的定义和引用二维数组的定义格式:
类型说明符 数组名 [整常量表达式 1][整常量表达式 2]
存储方式:
在计算机中二维数组的元素按行顺序存放。
注意:
0≤下标 1≤常量表达式 1-1;
0≤下标 2≤常量表达式 2-1。
二维数组的引用格式:
数组名 [下标 1][下标 2]
例,int m[2][3]
合法引用格式为:
m[0][0] m[0][1] m[0][2]
m[1][0] m[1][1] m[1][2]
说明:
给全部元素赋初值。
给部分元素赋初值。
给二维数组的全部元素赋初值,可以不指定第一维的长度,但第二维的长度不能省略。
2、二维数组的初始化二维数组初始化通常是按行进行的。
格式:
类型符 数组名 [表达式 1][表达式 2]={初值表 };
二维数组初始化举例,
给全部元素赋初值。
例 int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};
或写成,int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
给部分元素赋初值。
例 int a[3][4]={{0,1},{4,5,6},{8,9,10,11}};
或写成,int b[3][4]={0,1,2,3,4,5,6 } ;
给二维数组的全部元素赋初值,可以不指定第一维的长度,但第二维的长度不能省略。
例 int a[ ][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};
或写成,int a[ ][4]={0,1,2,3,4,5,6,7,8,9,10,11};
例 6.4 矩阵的转置。
分析:将矩阵 Am*n行列互换后,得一新矩阵为 Bn*m。
它们的元素对应关系为,ai,j = bj,i
程序,main()
{ int i,j,a[3][4],b[4][3];
for ( i=0; i<3; i++ )
for ( j=0; j<4 ; j++ )
{ scanf("%d",&a[i][j]);
b[j][i]=a[i][j]; }
for ( i=0; i<4; i++ )
{ for ( j=0; j<3 ; j++ )
printf("%7d ",b[i][j]);
printf("\n"); }
}
例 6.5 打印阳辉三角 。( 要求打印 N行)
杨辉三角形是( a+b) 的 n次幂展开后各项的系数。
例如:
…… ……
( a+b) 的 0次幂展开后各项的系数为,1
( a+b) 的 1次幂展开后各项的系数为,1,1
( a+b) 的 2次幂展开后各项的系数为,1,2,1
( a+b) 的 3次幂展开后各项的系数为,1,3,3,1
( a+b) 的 4次幂展开后各项的系数为,1,4,6,4,1
分析:杨辉三角各行的系数有如下规律
( 1)各行第一个数都是 1;
( 2)各行最后一个数为 1;
( 3)从第 3行起,除上面指出的第一个数和最后一个数外,其余各数是上一行同列和前一列两个数之和。
1
1,2,1
1,3,3,1
1,4,6,4,1
a[3][2]=a[2][1]+a[2][2]
a[4][4]=a[3][3]+a[3][4]
表示为通式即:
a[i][j]=a[i-1][j]+a[i-1][j-1]
N-S图为:
使数组第一列和对角线元素为 1
输出二维数组的内容其他各元素为,(用 for循环 )
a[i][j]=a[i-1][j]+a[i-1][j-1]
程序,# define N 10
main( )
{ int i,j,a[N][N];
for(i=0;i<N;i++) {a[i][i]=1; a[i][0]=1;}
for(i=2;i<N;i++)
for(j=1;j<=i-1;j++)
a[i][j]=a[i-1][j]+a[i-1][j-1];
for(i=0;i<N;i++)
{for(j=1;j<=i;j++) printf(“%6d”,a[i][j]);
print(“\n”);}
}