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 }