6.1一个数组中的元素可以有多少种不同的类型? 答:只有一种。一个数组中的所有元素都是同类型的 6.2数组下标可以有哪些类型? 答:数组下标必须是整数类型 6.3在定义一个数组的同时初始化它,但初始化列表中的值少于数组元素的个数。其余 元素的值将是什么? 答:初始化列表中的值将赋值给数组前面的元素,其余元素的初值为0。 6.4当数组初始化列表中的值的个数多于数组元素的个数,将会发生什么现象? 答:将会出错。 6.5为什么必须知道“C的数组是按行序为主序存储”的? 答:因为当需要按某种顺序访问数组元素时,例如初始化数组,通过移动指针连续访问 数组等等操作都与C的存储方式有关。 6.6多维数组的多个下标必须分别出现在各自的方括号对内。那么,在什么条件下,下 列代码段可以通过编译而不会产生出错或警告信息: inta[5][10]; b=a[2,4] 答:表达式 b=a[2,4]; 等价于下面这个表达式 b=a[4] 在这里,a[4]是一个类型为int型的常量指针。因此,只要b是一个类型为in*的指针, 该段代码就不会存错。但如果将b=a[2,4]改为 将出错。因为a[5]不存在 6.7表达式a[计+j和i+j[a]是否相等? 答:不妨设i=2,j=3 如果a是二维数组,则a[+j就是a[5],它代表数组a第5行首元素的地址,即a[5] &a[5][0]。表达式i+j[a]即2+3[a],也就是a[3]+2,它代表数组a第三行第二列元素 的地址,即a[3]-+2==&a[3][2]。显然两者不相等 如果a是一维数组,由i=2,j=3代入a[计+j得a[5],它表示a的第5个元素。 而表达式计+j[a]转换为指针表示是i+*(a+j),它等价于i+a[j,即a[3]+2,它表示将a[3] 的值加上2。可见,a[i+j不等于ij[a] 6.8设有定义 int array [3][4] 请给出下面每个表达式的值。假定数组起始位置为100, sizeof(int)==2 (2)array+2 (3)array [2] (4) array[2]-1 (5)& array[1]2] (6)& array[2][0] 答:(1)1000 2)1016
1 6.1 一个数组中的元素可以有多少种不同的类型? 答:只有一种。一个数组中的所有元素都是同类型的。 6.2 数组下标可以有哪些类型? 答:数组下标必须是整数类型。 6.3 在定义一个数组的同时初始化它,但初始化列表中的值少于数组元素的个数。其余 元素的值将是什么? 答:初始化列表中的值将赋值给数组前面的元素,其余元素的初值为 0。 6.4 当数组初始化列表中的值的个数多于数组元素的个数,将会发生什么现象? 答:将会出错。 6.5 为什么必须知道“C 的数组是按行序为主序存储”的? 答:因为当需要按某种顺序访问数组元素时,例如初始化数组,通过移动指针连续访问 数组等等操作都与 C 的存储方式有关。 6.6 多维数组的多个下标必须分别出现在各自的方括号对内。那么,在什么条件下,下 列代码段可以通过编译而不会产生出错或警告信息: int a[5][10]; …… b = a[2,4]; 答:表达式 b = a[2,4]; 等价于下面这个表达式: b = a[4]; 在这里,a[4]是一个类型为 int 型的常量指针。因此,只要 b 是一个类型为 int*的指针, 该段代码就不会存错。但如果将 b = a[2,4]改为 b = a[2,5] 将出错。因为 a[5]不存在。 6.7 表达式 a[i+j]和 i+j[a]是否相等? 答:不妨设 i = 2,j = 3。 如果 a 是二维数组,则 a[i+j]就是 a[5],它代表数组 a 第 5 行首元素的地址,即 a[5] == &a[5][0]。表达式 i+j[a]即 2+3[a],也就是 a[3]+2,它代表数组 a 第三行第二列元素 的地址, 即 a[3]+2 == &a[3][2]。显然两者不相等。 如果 a 是一维数组,由 i == 2,j == 3 代入 a[i+j] 得 a[5],它表示 a 的第 5 个元素。 而表达式 i+j[a]转换为指针表示是 i+*(a+j),它等价于 i+a[j],即 a[3]+2,它表示将 a[3] 的值加上 2。可见,a[i+j]不等于 i+j[a]。 6.8 设有定义 int array[3][4]; 请给出下面每个表达式的值。假定数组起始位置为 1000,sizeof(int) == 2。 (1) array (2) array+2 (3) array[2] (4) array[2]-1 (5) &array[1][2] (6) &array[2][0] 答:(1) 1000 (2) 1016
(3)1016 (4)1014 (6)1016 6.9编程生成如下矩阵 51 432 5 4 32154 23 12 51 算法分析:考虑到上三角矩阵和下三角矩阵(不含主对角线)元素的有序性,可分别形 成矩阵元素。一种实现方案如下: #define MAX 5 #includestdio. h> int maino int 1,j,k: int a[MAX] [MAX] for (i=0: i< MAX ++i) /*形成上三角矩阵各元素* for(j=i: j< MAX: ++j) a[i][j]=k++ } for (i=1:i< MAX: ++i) /*形成下三角矩阵各元素* ali]lj] ali-j-1][MAX-1] for (i=0: i< MAX: ++i) /*输出矩阵各元素*/ printf( \n) for (j=0; j< MAX: ++j) printf( %3d", allin 6.10将自然数1~n2按自然数的顺序依次填入“蛇形”方阵中。一个4×4的蛇形方阵 681215 7131416 算法分析:先打印上三角,再打印下三角,打印方向如下图箭头所示。用循环变量
2 (3) 1016 (4) 1014 (5) 1012 (6) 1016 6.9 编程生成如下矩阵: 1 2 3 4 5 5 1 2 3 4 4 5 1 2 3 3 4 5 1 2 2 3 4 5 1 算法分析:考虑到上三角矩阵和下三角矩阵(不含主对角线)元素的有序性,可分别形 成矩阵元素。一种实现方案如下: #define MAX 5 #include<stdio.h> int main() { int i,j,k; int a[MAX][MAX]; for (i = 0; i < MAX ; ++i) /* 形成上三角矩阵各元素 */ { k = 1; for (j = i; j < MAX ; ++j) a[i][j] = k++; } for (i = 1; i < MAX ; ++i) /* 形成下三角矩阵各元素 */ for (j = 0; j <= i-1; ++j) a[i][j] = a[i-j-1][MAX-1]; for (i = 0; i < MAX ;++i) /* 输出矩阵各元素 */ { printf(" \n"); for (j = 0; j < MAX ; ++j) printf("%3d", a[i][j]); } } 6.10 将自然数 1~n 2 按自然数的顺序依次填入“蛇形”方阵中。一个 4×4 的蛇形方阵 为: 1 3 4 10 2 5 9 11 6 8 12 15 7 13 14 16 算法分析:先打印上三角,再打印下三角,打印方向如下图箭头所示。用循环变量 i
控制行。 对上三角:当i=1时,打印一个元素, 当i=n时,打印n个元素 对下三角:当i=1时,打印n-i个元素 当i=n时,打印ni+1个元素。 种实现方案 #include <stdio. h int maino t a[nin, i printf( Input n=) for(k =1: k <=n: k++) if(k%2=1 for(i=1,j=k;i<=k&&j>=1;i++,j-) els for(j=1,i=k;j<=k&&i>=1;j++,i一) ali]lj] =d++ if(n%2=1) for(k=1;k<=n-1;k++) f(k%2=1) for (j=k+l, i=n: i >=k+1 &&j<=n [i][j for(j=n,i=k+:j>=k+1&&i <=n a[i][j=d+; else for(k=1;k<=n-1;k++) if(k%2=1) for(i=k+1,j=n;j≥=k+1&i<=n;i+,j一) a[]lj]=d+ for(j=k+1,i=n;i>=k+1&&j<= a[i][j=d++; for(j printf("%4d", a[]])
3 控制行。 对上三角:当 i=1 时,打印一个元素, 当 i=n 时,打印 n 个元素。 对下三角:当 i=1 时,打印 n-i 个元素, 当 i=n 时,打印 n-i+1 个元素。 一种实现方案: #define N 15 #include <stdio.h> int main() { int a[N][N], i, j, k, n, d = 1; printf("Input n= "); scanf("%d", &n); for(k = 1; k <= n; k++) if(k % 2 == 1) for(i = 1,j = k; i <= k && j >= 1; i++,j--) a[i][j] = d++; else for(j = 1,i = k; j <= k && i >= 1; j++,i--) a[i][j] = d++; if(n % 2 == 1) { for(k = 1; k <= n-1; k++) if(k % 2 == 1) for( j = k+1,i = n; i >= k+1 && j <= n; j++,i--) a[i][j] = d++; else for(j = n,i = k+1;j >= k+1 && i <= n; j--,i++) a[i][j] = d++; } else for(k = 1; k <= n-1; k++) if(k % 2 == 1) for(i = k+1,j = n; j >= k+1 && i <= n; i++,j--) a[i][j] = d++; else for(j = k+1,i = n; i >= k+1 && j <= n; j++,i--) a[i][j] = d++; for(i = 1; i <= n; i++) { for(j = 1; j <= n; j++) printf("%4d", a[i][j]);
printf("\n\n") return 另一种实现方案 #include <stdio. h #definen 15 int mainO int aN]N], r, i,j, d=1 for(i=0: i<N: ++i) if(i%2==0) for(j=i; j >=0: -j) [i-j]lil for(j=0: j<=i: ++j) [i-j]lil } for(i=l; i<N:++i) if((i+N)%2=0) for(j=i,r=l:j<N: ++r, ++j) a[n-r][j]=d+ els for(j=N;j〉i;-j) a[N-j+i][j-1]=d++; printf( \n") for(i =0:i<N: ++i) N;++j) printf(%4d", a[i]]) printf("\n\n") 6.11按自然数顺序生成“螺旋形”方阵。一个4×4的螺旋形方阵为: 算法分析:本题看起来似乎很难。事实上,我们可以将这个螺旋方阵一分为四:先生成
4 printf("\n\n"); } return 0; } 另一种实现方案: #include <stdio.h> #define N 15 int main() { int a[N][N],r,i,j,d = 1; for(i = 0; i < N; ++i) { if(i % 2 == 0) for(j = i; j >= 0; --j) a[i-j][j] = d++; else for(j = 0; j <= i; ++j) a[i-j][j] = d++; } for(i=1;i<N;++i) { if((i + N) % 2 == 0) for(j = i,r = 1; j < N; ++r,++j) a[N-r][j] = d++; else for(j = N; j > i; --j) a[N-j+i][j-1] = d++; } printf("\n"); for(i = 0; i < N; ++i) { for(j = 0; j < N; ++j) printf("%4d",a[i][j]); printf("\n\n"); } } 6.11 按自然数顺序生成“螺旋形”方阵。一个 4×4 的螺旋形方阵为: 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 算法分析:本题看起来似乎很难。事实上,我们可以将这个螺旋方阵一分为四:先生成
上面一行,接着生成右边一列,再生成下面一行,最后生成左边一列。要注意两点:与6.10 题一样,用一个变量d控制当前应填入矩阵中的数,每填入一次d就加一,以保证填入的数 不会出错。此其一;其二,注意控制每一行每一列的上、下界。下面是它的一个实现方案。 #define max 20 #includestdio. h> int main( inta[MAX+1[MAX+1];/*数组0下标未用*/ printf("Input n=") scanf(%d", &n) d=0: f(n%2)m=n/2+1;/*变量m控制循环的次数*/ else m=n/2 for(i=1; i <=m; ++1) for(j=i; j<= n-i+1: ++j) /*生成上面一行元素* a[i]lj] for(j=i+1;j<=n-i+1;++j)/*生成右边一列元素*/ [j][ni+1]=+d for (j=n-i /*生成下面一行元素* a[n-i+1][j]=++d; for (j=n-i: j >=i+l: --j) /*生成左边一列元素*/ a[j][i]=++d }/至此,螺旋方阵已经生成* printf("\n");/*下面是输出螺旋方阵*/ for(i=1: i <=N: ++i) for(j=1: j<=N: ++j) printf(%4d, a[i]lj]) printf("\n\n") 6.12编程,按递增序生成集合M最小的100个数。M的定义如下: 数1属于M ②如果x属于M,则y=2x+1和z=3x+1也属于M: ③再也没有别的数属于M 算法分析:用数组存放M。对任一自然数K,若K能用M中已存在的数生成,则将K存 人数组。如此依次考察自然数,则得到的必是最小的、互异的数。下面是一种实现方案 #includestdio. h> int maino
5 上面一行,接着生成右边一列,再生成下面一行,最后生成左边一列。要注意两点:与 6.10 题一样,用一个变量 d 控制当前应填入矩阵中的数,每填入一次 d 就加一,以保证填入的数 不会出错。此其一;其二,注意控制每一行每一列的上、下界。下面是它的一个实现方案。 #define MAX 20 #include<stdio.h> int main() { int i,j,d,m,n; int a[MAX+1][ MAX+1] ; /* 数组 0 下标未用 */ printf("Input n= "); scanf("%d", &n); d = 0; if(n % 2) m = n / 2+1; /* 变量 m 控制循环的次数 */ else m = n / 2; for(i = 1; i <= m; ++i) { for(j = i; j <= n-i+1; ++j) /* 生成上面一行元素 */ a[i][j] = ++d; for (j = i+1; j <= n-i+1; ++j) /* 生成右边一列元素 */ a[j][n-i+1] = ++d; for (j = n-i; j >= i; --j) /* 生成下面一行元素 */ a[n-i+1][j]=++d; for (j = n-i; j >= i+1; --j) /* 生成左边一列元素 */ a[j][i] = ++d; } /* 至此,螺旋方阵已经生成 */ printf("\n"); /* 下面是输出螺旋方阵 */ for(i = 1; i <= N; ++i) { for(j = 1; j <= N; ++j) printf("%4d",a[i][j]); printf("\n\n"); } } 6.12 编程,按递增序生成集合 M 最小的 100 个数。M 的定义如下: ① 数 1 属于 M; ② 如果 x 属于 M,则 y=2x+1 和 z=3x+1 也属于 M; ③ 再也没有别的数属于 M。 算法分析:用数组存放M。对任一自然数K,若K能用M中已存在的数生成,则将K存 人数组。如此依次考察自然数,则得到的必是最小的、互异的数。下面是一种实现方案: #include<stdio.h> int main()