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 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 =1;i++,j-) els for(j=1,i=k;j=1;j++,i一) ali]lj] =d++ if(n%2=1) for(k=1;k=k+1 &&j=k+1&&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 int main() { int a[N][N], i, j, k, n, d = 1; printf("Input n= "); scanf("%d", &n); for(k = 1; k = 1; i++,j--) a[i][j] = d++; else for(j = 1,i = k; j = 1; j++,i--) a[i][j] = d++; if(n % 2 == 1) { for(k = 1; k = k+1 && j = k+1 && i = k+1 && 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 =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 #define N 15 int main() { int a[N][N],r,i,j,d = 1; for(i = 0; i = 0; --j) a[i-j][j] = d++; else for(j = 0; 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 =i+l: --j) /*生成左边一列元素*/ a[j][i]=++d }/至此,螺旋方阵已经生成* printf("\n");/*下面是输出螺旋方阵*/ for(i=1: i int maino
5 上面一行,接着生成右边一列,再生成下面一行,最后生成左边一列。要注意两点:与 6.10 题一样,用一个变量 d 控制当前应填入矩阵中的数,每填入一次 d 就加一,以保证填入的数 不会出错。此其一;其二,注意控制每一行每一列的上、下界。下面是它的一个实现方案。 #define MAX 20 #include 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 = 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 int main()
int a[100], k, x2, X3 if(2*a[x2] a[x3]) [k]=2*a[x2++]+1;x3++; else if(2 a[x2] int mainO int j, m[100], y, z [0] while(jm[y]*2 m[j]=m[y++]*2+1; if(m[z]*3+1==m[j])z++ else m[j] =m[z++]*3+1 (=0;j<100;j++) printf("%6d″,m[j]) if((j+1)%10==0) printf("n"); return 0: 6.13有一个已按升序排列的数组,现插入一个数 number,要求插入后该数组仍为升序 算法分析:这个问题可以分解为以下四步 6
6 { int a[100],k,x2,x3; a[1] = 1; x2 = 1; x3 = 1; for(k = 2; k int main() { int j,m[100],y,z; m[0] = j = 1; y = z = 0; while(j = m[y] * 2) { m[j] = m[y++] * 2+1; if(m[z] * 3+1 == m[j]) z++; } else m[j] = m[z++] * 3+1; j++; } for(j = 0; j < 100; j++) { printf("%6d",m[j]); if((j + 1) % 10 == 0) printf("\n"); } return 0; } 6.13 有一个已按升序排列的数组,现插入一个数 number,要求插入后该数组仍为升序。 算法分析:这个问题可以分解为以下四步:
(1)生成一个有n个元素的有序数组a (2)定位插入点,设其为i 3)将a[i],a[i+1],…,a[n-1]顺序右移一位 (4)插入新元素 注意到插入点不外乎三种情况之一:首元素之前;末元素之后:任意两元素之间。 下面就是按以上思路的一个实现方案 #includestdio. #define max 50 int maino t n, i, number, index, a [MAX] /*生成一个有n个元素的有序数组a*/ printf("Input n(nalindex]) /*元素右移一位*/ for (i 1: i > inde a[i+1]=a[i] /*插入新元素 /*输出插入后的结果* 0:i<=n printf(%4d",ali]) 6.14输入一正整数NN不超过80位),去掉其中任意S个数字后剩下的数字按原左右
7 (1)生成一个有 n 个元素的有序数组 a; (2)定位插入点,设其为 i; (3)将 a[i],a[i+1],…,a[n-1]顺序右移一位; (4)插入新元素。 注意到插入点不外乎三种情况之一:首元素之前;末元素之后;任意两元素之间。 下面就是按以上思路的一个实现方案。 #include #define MAX 50 int main() { int n,i,number,index,a[MAX]; /* 生成一个有 n 个元素的有序数组 a */ printf("Input n(n= a[n-1]) index = n; /* 插在最后 */ else if(number a[index]) index++; } /* 元素右移一位 */ for(i = n-1; i >= index; --i) a[i+1] = a[i]; a[index]=number; /* 插入新元素 */ /* 输出插入后的结果 */ printf("sorted array are:\n"); for( i = 0; i <= n; i++) printf("%4d",a[i]); printf("\n"); return 0; } 6.14 输入一正整数 N(N 不超过 80 位),去掉其中任意 S 个数字后剩下的数字按原左右
次序组成一个新的正整数。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数 最小。输出应包括所去掉的数字的位置和组成的新数。 例如:N=’178543’,S=4,删数过程如下: 算法分析:因为N #include c[k])k=j: c[k]=0 [t++]=k while(s) for(i =0: ia[k])k=i+1 for(i k: i< len: i++) a[i]=a[i+1]
8 次序组成一个新的正整数。编程对给定的 N 和 S,寻找一种方案使得剩下的数字组成的新数 最小。输出应包括所去掉的数字的位置和组成的新数。 例如: N=’178543’, S=4,删数过程如下: 178543 → 17543 → 1543 → 143 → 13 算法分析:因为 N #include int main() { char a[81],c[81]; int b[80]; int len,len1,s,s1,t,k,i,j; printf("Input the number N:"); scanf("%s",a); printf("The wish deletes numbers: "); scanf("%d",&s); len = len1 = strlen(a); t = 0; s1 = s; for(i = 0; i c[k]) k = j; c[k] = 0; b[t++] = k; } while(s) { k=0; for(i = 0; i a[k]) k = i+1; for(i = k; i < len; i++) a[i] = a[i+1]; --len; --s;
} printf( \nThe new number is ") for(i=0 i #define max 50 int mainO int size, i, j, k, temp, a [MAX] printf(Input size(size=d):",MAX): scanf(%d", &size printf("Input %d numbers to be sorted: \n", size) scanf(%d", &alil i< size-l: i++) for(j=i+l: j< size: j++) if(alj]< alk]) k=j f(k!=i) temp= alk [k]=a[i] alil printf( sorted array are: \n) printf(%d, ali) printf("\b%cⅦn",’’) return 0 另一种实现方案:
9 } printf("\nThe new number is "); for(i=0;i #define MAX 50 int main() { int size,i,j,k,temp,a[MAX]; printf("Input size(size<=%d): ",MAX); scanf("%d",&size); printf("Input %d numbers to be sorted:\n",size); for(i = 0; i <= size-1; i++) scanf("%d",&a[i]); for(i = 0; i < size-1; i++) { k = i; for(j = i+1; j < size; j++) if(a[j] < a[k]) k = j; if(k != i) { temp = a[k]; a[k] = a[i]; a[i] = temp; } } printf("sorted array are:\n"); for(i = 0; i < size; i++) printf("%d,",a[i]); printf("\b%c\n",' '); return 0; } 另一种实现方案:
#include #define max 50 elsort(int a[l, int n J, for(j=0 j+) for(i =j+1;i n-j: i++) if(alj]>a[nj-1)t=ajl, alj]= a[n-1-jl, a[n-1-j]=t if(ali]an-1-jd)t=aln-j-1l, a[n-j-1]= ali], alil=t int maino int i, a[MAX],n, t: printf(" Input n(n100000 例如,某公民月税前收入为4679.47元,用速算扣除法计算应纳税额为: (4679.47-1600)*15%-125=336.92元
10 #include #define MAX 50 void selsort(int a[],int n) { int i,j,t; for(j = 0; j a[n-j-1]) t = a[j],a[j] = a[n-1-j],a[n-1-j] = t; if(a[i] a[n-1-j]) t = a[n-j-1],a[n-j-1] = a[i],a[i] = t; } } int main() { int i,a[MAX],n,t; printf("Input n(n<=%d): ",MAX "); scanf("%d",&n); printf("Input %d numbers to be sorted:\n",n); for(i = 0; i < n; i++) scanf("%d",&a[i]); selsort(a,n); printf("sorted array are:\n"); for(i = 0; i < n; i++) printf("%d,",a[i]); printf("\b%c\n",' '); return 0; } 6.16 改写例 5-7,用数组实现。 算法分析:我国政府目前使用下面这些规则计算每个公民的个人月收入所得税: 含税级距 X 税率(%) 速算扣除数 X≤500 5 0 500<X≤2000 10 25 2000<X≤5000 15 125 5000<X≤20000 20 375 20000<X≤40000 25 1375 40000<X≤60000 30 3375 60000<X≤80000 35 6375 80000<X≤100000 40 10375 X>100000 45 15375 例如,某公民月税前收入为 4679.47 元,用速算扣除法计算应纳税额为: (4679.47-1600)*15%-125=336.92 元