task1.c
1 #include <stdio.h> 2 #define N 5 3 #define M 2 4 5 void test1() { 6 int x[N] = {1, 9, 8, 4}; 7 int i; 8 9 printf("sizeof(x) = %d\n", sizeof(x)); 10 11 for (i = 0; i < N; ++i) 12 printf("%p: %d\n", &x[i], x[i]); 13 14 printf("x = %p\n", x); 15 } 16 17 void test2() { 18 int x[M][N] = {{1, 9, 8, 4}, {2, 0, 4, 9}}; 19 int i, j; 20 21 printf("sizeof(x) = %d\n", sizeof(x)); 22 23 for (i = 0; i < M; ++i) 24 for (j = 0; j < N; ++j) 25 printf("%p: %d\n", &x[i][j], x[i][j]); 26 printf("\n"); 27 28 printf("x = %p\n", x); 29 printf("x[0] = %p\n", x[0]); 30 printf("x[1] = %p\n", x[1]); 31 printf("\n"); 32 } 33 34 int main() { 35 printf("测试1: int型一维数组\n"); 36 test1(); 37 38 printf("\n测试2: int型二维数组\n"); 39 test2(); 40 41 return 0; 42 }
问题1:int型一维数组x,在内存中是否是连续存放的?数组名x对应的值,和&x[0]是一样的吗?
答:是。一样。
问题2:int型二维数组x,在内存中是否是"按行连续存放"的?数组名x的值、x[0]、&x[0][0],其
值,在字面上,是一样的吗?x[0]和x[1]相差多少?你能猜测/推断出这个差值的意义吗?
答:是。一样。4。单个元素占用的内存字节条。
task2.c
1 #include <stdio.h> 2 #define N 100 3 4 void input(int x[], int n); 5 double compute(int x[], int n); 6 7 int main() { 8 int x[N]; 9 int n, i; 10 double ans; 11 12 while(printf("Enter n: "), scanf("%d", &n) != EOF) { 13 input(x, n); 14 ans = compute(x, n); 15 printf("ans = %.2f\n\n", ans); 16 } 17 18 return 0; 19 } 20 21 void input(int x[], int n) { 22 int i; 23 24 for(i = 0; i < n; ++i) 25 scanf("%d", &x[i]); 26 } 27 28 double compute(int x[], int n) { 29 int i, high, low; 30 double ans; 31 32 high = low = x[0]; 33 ans = 0; 34 35 for(i = 0; i < n; ++i) { 36 ans += x[i]; 37 38 if(x[i] > high) 39 high = x[i]; 40 else if(x[i] < low) 41 low = x[i]; 42 } 43 44 ans = (ans - high - low)/(n-2); 45 46 return ans; 47 }
观察:一维数组作为形参时,其书写形式?实参的书写形式?
答:书写形式是int x[].int x[N]
问题:函数input的功能是?函数compute的功能是?
答:input的功能是给数组中的n个元素赋值。compute的功能是将n个数去掉最大值和最小值求平均值。
task3.c
1 #include <stdio.h> 2 #define N 100 3 4 void output(int x[][N], int n); 5 void init(int x[][N], int n, int value); 6 7 int main() { 8 int x[N][N]; 9 int n, value; 10 11 while(printf("Enter n and value: "), scanf("%d%d", &n, &value) != EOF) { 12 init(x, n, value); 13 output(x, n); 14 printf("\n"); 15 } 16 17 return 0; 18 } 19 20 void output(int x[][N], int n) { 21 int i, j; 22 23 for(i = 0; i < n; ++i) { 24 for(j = 0; j < n; ++j) 25 printf("%d ", x[i][j]); 26 printf("\n"); 27 } 28 } 29 30 void init(int x[][N], int n, int value) { 31 int i, j; 32 33 for(i = 0; i < n; ++i) 34 for(j = 0; j < n; ++j) 35 x[i][j] = value; 36 }
观察:两维数组作为函数形参时,形参的书写形式?实参的书写形式?
答:int x[][N].x.
问题1:两维数组作为函数形参时,哪一维的大小不能省略?
第二维。
问题2:函数output功能是?函数init的功能是?
输出被赋值的二维数组。对二维数组进行赋值。
task4.c
1 #include <stdio.h> 2 #define N 100 3 void input(int x[N],int n); 4 double median(int x[N],int n); 5 int main(){ 6 int x[N]; 7 int n; 8 double ans; 9 while(printf("Enter n: "), scanf("%d", &n) != EOF) { 10 input(x, n); 11 ans = median(x, n); 12 printf("ans=%g\n\n",ans); 13 } 14 return 0; 15 } 16 void input(int x[N],int n){ 17 int i; 18 for(i=0;i<n;i++) 19 scanf("%d",&x[i]); 20 21 } 22 double median(int x[N],int n){ 23 double ans=0; 24 int a,t; 25 int i,j; 26 for(i=0;i<n-1;i++){ 27 for(j=0;j<n-i-1;j++){ 28 if(x[j]>x[j+1]){ 29 a=x[j]; 30 x[j]=x[j+1]; 31 x[j+1]=a; 32 } 33 } 34 } 35 if(n%2==1) 36 {t=(n-1)/2; 37 ans=1.0*x[2]; 38 } 39 else{t=x[(n/2)-1]+x[n/2]; 40 ans=0.5*x[t]; 41 } 42 return ans; 43 }
task5.c
1 #include <stdio.h> 2 #define N 100 3 void input(int x[][N], int n); 4 void output(int x[][N], int n); 5 void rotate_to_right(int x[][N],int n); 6 int main() { 7 int x[N][N]; 8 int n; 9 10 printf("输入n: "); 11 scanf("%d", &n); 12 input(x, n); 13 14 printf("原始矩阵:\n"); 15 output(x, n); 16 17 rotate_to_right(x,n); 18 19 printf("变换后矩阵:\n"); 20 output(x, n); 21 22 return 0; 23 } 24 void input(int x[][N], int n) { 25 int i, j; 26 for (i = 0; i < n; ++i) { 27 for (j = 0; j < n; ++j) 28 scanf("%d", &x[i][j]); 29 } 30 } 31 void output(int x[][N], int n) { 32 int i, j; 33 for (i = 0; i < n; ++i) { 34 for (j = 0; j < n; ++j) 35 printf("%4d", x[i][j]); 36 printf("\n"); 37 } 38 } 39 void rotate_to_right(int x[][N],int n){ 40 int i,j,a; 41 for(i=0;i<n;i++){ 42 for(j=0;j<n-1;j++){ 43 if(x[i][j]>x[i][j+1]){ 44 a=x[i][j]; 45 x[i][j]=x[i][j+1]; 46 x[i][j+1]=a; 47 } 48 } 49 } 50 }
task6.c
1 #include <stdio.h> 2 #define N 100 3 void dec_to_n(int x, int n); 4 int main() { 5 int x; 6 while(printf("输入十进制整数: "), scanf("%d", &x) != EOF) { 7 dec_to_n(x, 2); 8 dec_to_n(x, 8); 9 dec_to_n(x, 16); 10 printf("\n"); 11 } 12 return 0; 13 } 14 void dec_to_n(int x, int n){ 15 if(n==2){ 16 int arr[N]; 17 int i=0; 18 while(x>0){ 19 arr[i]=x%2; 20 x/=2; 21 i++; 22 } 23 int j; 24 for (j=i-1;j>=0;j--){ 25 printf("%d",arr[j]); 26 } 27 printf("\n"); 28 } 29 if(n==8){ 30 printf("%o\n",x); 31 } 32 if(n==16){ 33 printf("%x\n",x); 34 } 35 }
task7.c
1 #include <stdio.h> 2 #define N 100 3 void input(int x[][N], int n); 4 void output(int x[][N], int n); 5 int is_magic(int x[][N], int n); 6 int main() { 7 int x[N][N]; 8 int n; 9 while (printf("输入n: "), scanf("%d", &n) != EOF) { 10 printf("输入方阵:\n"); 11 input(x, n); 12 printf("输出方阵:\n"); 13 output(x, n); 14 if (is_magic(x, n)) 15 printf("是魔方矩阵\n\n"); 16 else 17 printf("不是魔方矩阵\n\n"); 18 } 19 return 0; 20 } 21 void input(int x[][N], int n) { 22 int i, j; 23 for (i = 0; i < n; ++i) { 24 for (j = 0; j < n; ++j) 25 scanf("%d", &x[i][j]); 26 } 27 } 28 void output(int x[][N], int n) { 29 int i, j; 30 for (i = 0; i < n; ++i) { 31 for (j = 0; j < n; ++j) 32 printf("%4d", x[i][j]); 33 printf("\n"); 34 } 35 } 36 int is_magic(int x[][N], int n) { 37 int t = 0,a= 0; 38 int value[N * N] = { 0 }; 39 int val; 40 int i,j; 41 for (i = 0; i < n; i++){ 42 t += x[0][i]; 43 val = x[0][i]; 44 if (val<1 || val>n * n || value[val - 1]){ 45 return 0; 46 } 47 value[val - 1] = 1; 48 } 49 for (i= 1;i < n;i++) { 50 a= 0; 51 for (j = 0;j< n;j++) { 52 a+= x[i][j]; 53 val = x[i][j]; 54 if (val<1 || val>n * n || value[val - 1]){ 55 return 0; 56 } 57 value[val - 1] = 1; 58 } 59 if (a!= t){ 60 return 0; 61 } 62 } 63 for (i= 0;i< n;i++){ 64 a= 0; 65 for (j=0;j< n;j++){ 66 a+= x[i][j]; 67 } 68 if (a!=t){ 69 return 0; 70 } 71 } 72 a=0; 73 for (i=0;i<n;i++){ 74 a+= x[i][i]; 75 } 76 if (a!=t){ 77 return 0; 78 } 79 a=0; 80 for (i = 0; i < n; i++){ 81 a+=x[i][n-1-i]; 82 } 83 if (a!=t){ 84 return 0; 85 } 86 return 1; 87 }