实验4

任务1

源代码:

1 #include <stdio.h>
 2 #define N 4
 3 #define M 2
 4 
 5 void test1() {
 6     int x[N] = {1, 9, 8, 4};          
 7     int i;
 8 
 9   
10     printf("sizeof(x) = %d\n", sizeof(x));
11 
12    
13     for (i = 0; i < N; ++i)
14         printf("%p: %d\n", &x[i], x[i]);
15 
16   
17     printf("x = %p\n", x); 
18 }
19 
20 void test2() {
21     int x[M][N] = {{1, 9, 8, 4}, {2, 0, 4, 9}};
22     int i, j;
23 
24    
25     printf("sizeof(x) = %d\n", sizeof(x));
26 
27    
28     for (i = 0; i < M; ++i)
29         for (j = 0; j < N; ++j)
30             printf("%p: %d\n", &x[i][j], x[i][j]);
31     printf("\n");
32 
33   
34     printf("x = %p\n", x);
35     printf("x[0] = %p\n", x[0]);
36     printf("x[1] = %p\n", x[1]);
37     printf("\n");
38 }
40 int main() {
41     printf("测试1: int型一维数组\n");
42     test1();
43 
44     printf("\n测试2: int型二维数组\n");
45     test2();
46 
47     return 0;
48 }

image

问题一:连续,值相等

问题二:二维数组也是连续的,三个值相等,差值为4,也就是类似正常一维数组那样连续值的差值,与前一个的地址值差4,也就是与前一层的最后一个元素交接

任务2:

源代码:

 1 #include <stdio.h>
 2 #define N 100
 3 void input(int x[], int n);
 4 double compute(int x[], int n);
 5 
 6 int main() {
 7     int x[N];
 8     int n, i;
 9     double ans;
10 
11     while(printf("Enter n: "), scanf("%d", &n) != EOF) {
12         input(x, n);
13         ans = compute(x, n);
14         printf("ans = %.2f\n\n", ans);
15     }
16 
17     return 0;
18 }
19 
20 void input(int x[], int n) {
21     int i;
22 
23     for(i = 0; i < n; ++i)
24         scanf("%d", &x[i]);
25 }
26 
27 double compute(int x[], int n) {
28     int i, high, low;
29     double ans;
30 
31     high = low = x[0];
32     ans = 0;
33 
34     for(i = 0; i < n; ++i) {
35         ans += x[i];
36 
37         if(x[i] > high)
38             high = x[i];
39         else if(x[i] < low)
40             low = x[i];
41     }
42 
43     ans = (ans - high - low)/(n-2);
44 
45     return ans;
46 }

image

问题1:

形参形式:int[]

实参形式:调用时直接写数组名x

问题2:

input的功能是接收用户输入的n个整数,存入一维数组x中。

compute的功能是计算下中所有元素的总和,找出数组中的最大值和最小值,从总和中减去最大值和最小值再除以(n-2)

任务3

源代码:

 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 
21 void output(int x[][N], int n) {
22     int i, j;
23 
24     for(i = 0; i < n; ++i) {
25         for(j = 0; j < n; ++j)
26             printf("%d ", x[i][j]);
27         printf("\n");
28     }
29 }
30 
31 void init(int x[][N], int n, int value) {
32     int i, j;
33 
34     for(i = 0; i < n; ++i)
35         for(j = 0; j < n; ++j)
36             x[i][j] = value;
37 }

image

问题一:二维数组形参需要先说明数组内参数类型,然后加上两次方括号,第二个方括号内给定值。实参就是直接把数组名给它(同一维数组)

问题二不能省略报错array type has incomplete element type

问题三output函数功能是把n×n维的矩阵输出,input函数是给数组的n×n维的值都赋值为value的大小

任务4

源代码:

 1 #include <stdio.h>
 2 #define N 100
 3 void input(int x[],int n);
 4 double median(int x[],int n);
 5 
 6 int main() {
 7     int x[N];
 8     int n;
 9     double ans;
10 
11     while(printf("Enter n: "), scanf("%d", &n) != EOF) {
12         input(x, n);
13         ans = median(x, n);
14         printf("ans = %g\n\n", ans);
15     }
16 
17     return 0;
18 }
19 void input(int x[],int n)
20 {
21     int i;
22     for(i=0;i<n;++i)
23     {scanf("%d",&x[i]);
24     }
25 }
26 double median(int x[],int n)
27 {int i,j,temp;
28 for(i=0;i<n-1;++i)
29 {for(j=0;j<n-1-i;++j)
30 {if(x[j]>x[j+1])
31 {temp=x[j];
32 x[j]=x[j+1];
33 x[j+1]=temp;
34 }
35 }
36 }
37 
38  if(n%2==1)
39 {return x[n/2];}
40  else{
41     return(x[n/2-1]+x[n/2])/2.0;
42 
43 }
44 }

image

任务5

源代码:

 1 #include <stdio.h>
 2 #define N 100
 3 
 4 void input(int x[][N], int n);
 5 void output(int x[][N], int n);
 6 void rotate_to_right(int x[][N],int n);
 7 
 8 int main() {
 9     int x[N][N];
10     int n;
11 
12     printf("输入n: ");
13     scanf("%d", &n);
14     input(x, n);
15 
16     printf("原始矩阵:\n");
17     output(x, n);
18     rotate_to_right(x,n);
19     printf("变换后矩阵:\n");
20     output(x, n);
21 
22     return 0;
23 }
24 
25 void input(int x[][N], int n) {
26     int i, j;
27 
28     for (i = 0; i < n; ++i) {
29         for (j = 0; j < n; ++j)
30             scanf("%d", &x[i][j]);
31     }
32 }
33 
34 void output(int x[][N], int n) {
35     int i, j;
36 
37     for (i = 0; i < n; ++i) {
38         for (j = 0; j < n; ++j)
39             printf("%4d", x[i][j]);
40 
41         printf("\n");
42     }
43 }
44 void rotate_to_right(int x[][N],int n)
45 {
46     int i,j;
47     int temp;
48     int last_col[N];
49     for (i=0;i<n;++i)
50     {last_col[i]=x[i][n-1];
51         }
52     for(j=n-2;j>=0;--j)
53     {for(i=0;i<n;++i)
54     {x[i][j+1]=x[i][j];
55     }
56     }
57     for (i=0;i<n;++i)
58     {x[i][0]=last_col[i];
59     }
60 }

image

任务6

源代码:

 1 #include <stdio.h>
 2 #define N 100
 3 
 4 void dec_to_n(int x, int n);
 5 
 6 int main() {
 7     int x;
 8     while(printf("输入十进制整数: "), scanf("%d", &x) != EOF) {
 9         dec_to_n(x, 2);
10         dec_to_n(x, 8);
11         dec_to_n(x, 16);
12         printf("\n");
13     }
14     return 0;
15 }
16 
17 void dec_to_n(int x, int n) {
18     int res[N];
19     int i = 0, j;
20     int temp = x;
21 
22     if (temp == 0) {
23         printf("0\n");
24         return;
25     }
26 
27     while(temp != 0) {
28         res[i] = temp % n;
29         temp = temp / n;
30         i++;
31     }
32 
33     for(j = i-1; j >= 0; j--) {
34         if(res[j] < 10) {
35             printf("%d", res[j]);
36         } else {
37             printf("%c", res[j] - 10 + 'A');
38         }
39     }
40     printf("\n");
41 }

image

任务7

源代码:

 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 
 7 int main() {
 8     int x[N][N];
 9     int n;
10 
11     while(printf("输入n: "), scanf("%d", &n) != EOF) {
12         printf("输入方阵:\n");
13         input(x, n);
14 
15         printf("输出方阵:\n");
16         output(x, n);
17 
18         if(is_magic(x, n))
19             printf("是魔方矩阵\n\n");
20         else
21             printf("不是魔方矩阵\n\n");
22     }
23 
24     return 0;
25 }
26 
27 void input(int x[][N], int n) {
28     int i, j;
29     for (i = 0; i < n; ++i) {
30         for (j = 0; j < n; ++j) {
31             scanf("%d", &x[i][j]);
32         }
33     }
34 }
35 void output(int x[][N], int n) {
36     int i, j;
37     for (i = 0; i < n; ++i) {
38         for (j = 0; j < n; ++j) {
39             printf("%4d", x[i][j]);
40         }
41         printf("\n");
42     }
43 }
44 
45 int is_magic(int x[][N], int n) {
46     int i, j;
47     int sum, target;
48 
49     target = n * (n * n + 1) / 2;
50 
51     for (i = 0; i < n; ++i) {
52         sum = 0;
53         for (j = 0; j < n; ++j) {
54             sum += x[i][j];
55         }
56         if (sum != target)
57             return 0;
58     }
59     for (j = 0; j < n; ++j) {
60         sum = 0;
61         for (i = 0; i < n; ++i) {
62             sum += x[i][j];
63         }
64         if (sum != target)
65             return 0;
66     }
67 
68     sum = 0;
69     for (i = 0; i < n; ++i) {
70         sum += x[i][i];
71     }
72     if (sum != target)
73         return 0;
74 
75     sum = 0;
76     for (i = 0; i < n; ++i) {
77         sum += x[i][n - 1 - i];
78     }
79     if (sum != target)
80         return 0;
81 
82     return 1;
83 }

image

 

posted @ 2026-05-06 01:16  帕茹克  阅读(12)  评论(0)    收藏  举报