实验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     // 输出数组x占用的内存字节数
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     // 输出数组名x对应的值 
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     // 输出二维数组x占用的内存字节数
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     // 输出二维数组名x, 以及,x[0], x[1]的值
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 }
39 
40 int main() {
41     printf("测试1: int型一维数组\n");
42     test1();
43 
44     printf("\n测试2: int型二维数组\n");
45     test2();
46 
47     return 0;
48 }

2.运行结果截图

屏幕截图 2026-05-03 210327

3.回答问题

(1).

连续

相同

(2).

连续

相同

x[0]和x[1]相差4字节

差值的含义为:数组x中单个元素所占用的字节数

 

任务二

1.源代码

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

2.运行结果截图

屏幕截图 2026-05-03 212735

3.回答问题

(1).

形参书写形式:元素类型 数组名[]

实参书写形式:数组名

(2).

input的功能:将输入的n个整数依次存入数组x的前n个元素中

compute的功能:计算去掉一个最高分和一个最低分后的平均分

 

任务三

1.源代码

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

2.运行结果截图

屏幕截图 2026-05-04 202847

3.回答问题

(1).

形参书写形式:元素类型 数组名[][数组列数] ;

实参书写形式:数组名

(2).

不能

(3).

output的功能:依次输出数组元素前n行元素中的前n列元素

init的功能:将数组前n行中的前n列元素的值更改为value

 

任务四

1.源代码

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

2.运行结果截图

屏幕截图 2026-05-04 214354

 

任务五

1.源代码

 1 #define  _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 #define N 100
 4 
 5 // 函数声明
 6 void input(int x[][N], int n);
 7 void output(int x[][N], int n);
 8 // 函数rotate_to_right声明
 9 void rotate_to_right(int x[][N], int n);
10 
11 int main() {
12     int x[N][N];
13     int n;
14 
15     printf("输入n: "); 
16     scanf("%d", &n);
17     input(x, n);
18 
19     printf("原始矩阵:\n");
20     output(x, n);
21 
22     // 函数rotate_to_right调用
23     rotate_to_right(x, n);
24 
25     printf("变换后矩阵:\n");
26     output(x, n);
27 
28     return 0;
29 }
30 
31 // 函数定义
32 // 功能: 输入一个n*n的矩阵x
33 void input(int x[][N], int n) {
34     int i, j;
35     
36     for (i = 0; i < n; ++i) {
37         for (j = 0; j < n; ++j)
38             scanf("%d", &x[i][j]);
39     }
40 }
41 
42 // 函数定义
43 // 功能: 输出一个n*n的矩阵x
44 void output(int x[][N], int n) {
45     int i, j;
46 
47     for (i = 0; i < n; ++i) {
48         for (j = 0; j < n; ++j)
49             printf("%4d", x[i][j]);
50 
51         printf("\n");
52     }
53 }
54 
55 // 函数rotate_to_right定义
56 // 功能: 把一个n*n的矩阵x,每一列向右移, 最右边一列绕回左边
57 void rotate_to_right(int x[][N], int n) {
58     int i, j, last;
59     for (i = 0; i < n; i++) {
60         last = x[i][n - 1];
61         for (j = n - 1; j > 0; j--) {
62             x[i][j] = x[i][j - 1];
63         }
64         x[i][0] = last;
65     }
66 }

2.运行结果截图

屏幕截图 2026-05-04 221812

 

任务六

1.源代码

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

2.运行结果截图

 屏幕截图 2026-05-05 100201

 

任务七

1.源代码

 1 #define  _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 #define N 100
 4 
 5 // 函数声明
 6 void input(int x[][N], int n);
 7 void output(int x[][N], int n);
 8 // 待补足函数is_magic声明
 9 int is_magic(int x[][N], int n);
10 
11 int main() {
12     int x[N][N];
13     int n;
14 
15     while(printf("输入n: "), scanf("%d", &n) != EOF) {
16         printf("输入方阵:\n");  
17         input(x, n); 
18 
19         printf("输出方阵:\n");  
20         output(x, n);   
21 
22         if(is_magic(x, n))
23             printf("是魔方矩阵\n\n");
24         else
25             printf("不是魔方矩阵\n\n");
26     }
27 
28     return 0;
29 }
30 
31 // 函数定义
32 // 功能: 输入一个n*n的矩阵x
33 void input(int x[][N], int n) {
34     int i, j;
35     
36     for (i = 0; i < n; ++i) {
37         for (j = 0; j < n; ++j)
38             scanf("%d", &x[i][j]);
39     }
40 }
41 
42 // 功能: 输出一个n*n的矩阵x
43 void output(int x[][N], int n) {
44     int i, j;
45 
46     for (i = 0; i < n; ++i) {
47         for (j = 0; j < n; ++j)
48             printf("%4d", x[i][j]);
49 
50         printf("\n");
51     }
52 }
53 
54 
55 // 功能: 判断一个n阶方阵是否为魔方矩阵,如果是,返回1,否则,返回0
56 int is_magic(int x[][N], int n) {
57     int i, j, sum = 0;
58     //每行
59     for (i = 0; i < n; i++) {
60         for (j = 0; j < n; j++)
61             sum += x[i][j];
62         if (sum == n * (n * n + 1) / 2)
63             sum = 0;
64         else
65             return 0;
66     }
67     //每列
68     for (j = 0; j < n; j++) {
69         for (i = 0; i < n; i++)
70             sum += x[i][j];
71         if (sum == n * (n * n + 1) / 2)
72             sum = 0;
73         else
74             return 0;
75     }
76     //主对角线
77     for (i = 0; i < n; i++)
78         sum += x[i][i];
79     if (sum == n * (n * n + 1) / 2)
80         sum = 0;
81     else
82         return 0;
83     //副对角线
84     for (i = n - 1; i >= 0; i--)
85         sum += x[n - 1 - i][i];
86     if (sum == n * (n * n + 1) / 2)
87         sum = 0;
88     else
89         return 0;
90 
91     return 1;
92 }

2.运行结果截图

屏幕截图 2026-05-05 103944

屏幕截图 2026-05-05 104328

3.算法思路说明

核心逻辑:分别计算行、列、两条对角线方向上的元素和,并与幻和 n(n*n+1)/2 比较。所有方向的和均等于幻和则为魔方矩阵。行和列用嵌套循环,对角线用单循环。

posted @ 2026-05-05 11:01  昵称不足4个字符  阅读(9)  评论(0)    收藏  举报