实验4

试验任务1

代码

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

 

截图

屏幕截图 2026-05-04 111741

 

问题回答:

1.是连续存放的,x和&x[0]的值相同;

2.是连续存放的,x,x[0]和&x[0]的值相同,x[0]和x[1]相差16个字节,其含义为一行元素所占字节总数。

 

 

试验任务2

代码

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

 

截图

屏幕截图 2026-05-05 132557

 

问题回答:

1.形参是int x[ ],实参是数组名x;

2.input的功能是输入n个整型数据,comput的功能是计算数据中去掉一个最大值和一个最小值后的平均值。

 

 

试验任务3

代码

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define N 100
 4 
 5 void output(int x[][N],int n);
 6 void init(int x[][N],int n,int value);
 7 
 8 int main(){
 9     int x[N][N];
10     int n,value;
11 
12     while(printf("Enter n and value: "),scanf("%d%d",&n,&value) != EOF){
13         init(x,n,value);
14         output(x,n);
15         printf("\n");
16     }
17 
18     system("pause");
19     return 0;
20 }
21 
22 void output(int x[][N],int n){
23     int i,j;
24 
25     for(i = 0;i<n;++i){
26         for(j = 0;j<n;++j)
27             printf("%d",x[i][j]);
28         printf("\n");
29     }
30 }
31 
32 void init(int x[][N],int n,int value){
33     int i,j;
34 
35     for(i = 0;i<n;++i)
36         for(j = 0;j<n;++j)
37             x[i][j] = value;
38 }

 

截图

屏幕截图 2026-05-05 134439

 

问题回答:

1.形参是int x[ ] [N],实参是二维数组名x;

2.第二维大小不能省略编译器会报错;

3.output的功能是输出二维数组的所有元素,init的功能是将二维数组的所有元素初始化指定为value值。

 

 

试验任务4

代码

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

 

截图

屏幕截图 2026-05-05 140845

 

 

试验任务5

 

代码

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

 

截图

屏幕截图 2026-05-05 142732

 

 

试验任务6

代码

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

 

截图

捕获

 

 

 

试验任务7

代码

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

 

截图

屏幕截图 2026-05-05 145211

 

核心逻辑:先计算标准幻和的值,再计算每行、每列、两条对角线上的值是否等于幻和,若其中有一条不满足,则是非魔方矩阵,只有全部条件满足时,才是魔方矩阵。

 

posted @ 2026-05-05 15:00  Hhhm00  阅读(3)  评论(0)    收藏  举报