实验四

实验任务1:

1.源代码:

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

2.运行效果截图:

1

3.问题回答:

(1)是连续存放;相同

(2)是按行连续存放;差16字节;差值表示二维数组一行占用的内存字节数

 

实验任务2:

1.源代码:

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

2.运行结果截图:

2

3.问题回答:

(1)形参:void input(int x[ ] ,int n);实参:input(x,n)、

(2)input:输入n个整数到数组x中;compute:这组数去掉最大值和最小值取平均值

 

实验任务3:

1.源代码:

 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 int main() {
 7     int x[N][N];
 8     int n, value;
 9     while (printf("Enter n and value: "), scanf_s("%d%d", &n, &value) != EOF) {
10         init(x, n, value); 
11         output(x, n); 
12         printf("\n");
13     }
14     return 0;
15 }
16 // 函数定义
17 void output(int x[][N], int n) {
18     int i, j;
19     for (i = 0; i < n; ++i) {
20         for (j = 0; j < n; ++j)
21             printf("%d ", x[i][j]);
22         printf("\n");
23     }
24 }
25 // 函数定义2
26 void init(int x[][N], int n, int value) {
27     int i, j;
28     for (i = 0; i < n; ++i)
29         for (j = 0; j < n; ++j)
30             x[i][j] = value;
31 }

2.运行结果截图:

3

3.问题回答:

(1)形参:output (int x[ ][N], int n);实参:output (x, n)

(2)不能省略,必须确定第二维长度,不然会报错

(3)output:按行输出n*n的二维数组元素;init:将这些元素赋值为指定值value

 

实验任务4:

1.源代码:

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

2.运行结果截图:

4

 

实验任务5:

1.源代码:

 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     printf("Enter n: ");
10     scanf_s("%d", &n);
11     input(x, n);
12 
13     printf("原始矩阵:\n");
14     output(x, n);
15     rotate_to_right(x, n);
16 
17     printf("变换后矩阵:\n");
18     output(x, n);
19     return 0;
20 }
21 void input(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             scanf_s("%d", &x[i][j]);
27     }
28 }
29 void output(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             printf("%4d", x[i][j]);
35 
36         printf("\n");
37     }
38 }
39 void rotate_to_right(int x[][N], int n) {
40     int i, j;
41     int temp[N];
42     for (i = 0; i < n; i++) {
43         temp[i] = x[i][n - 1];
44     }
45     for (j = n - 1; j > 0; j--) {
46         for (i = 0; i < n; i++) {
47             x[i][j] = x[i][j - 1];
48         }
49     }
50     for (i = 0; i < n; i++) {
51         x[i][0] = temp[i];
52     }
53 }

2.运行结果截图:

5

 

实验任务6:

1.源代码:

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

2.运行效果截图:

4d40703246ff386f3813ba0493803640

 

实验任务7:

1.源代码

 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_s("%d", &n) != EOF) 
10     {
11         printf("输入方阵:\n");
12         input(x, n);
13 
14         printf("输出方阵:\n");
15         output(x, n);
16 
17         if (is_magic(x, n))
18             printf("是魔方矩阵\n\n");
19         else
20             printf("不是魔方矩阵\n\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_s("%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 int is_magic(int x[][N], int n) {
40     int magic_sum = n * (n * n + 1) / 2;
41     int sum_row = 0, sum_col = 0, sum_diag1 = 0, sum_diag2 = 0;
42     int i, j;
43     for (i = 0; i < n; i++) {
44         sum_row = 0;
45         for (j = 0; j < n; j++) {
46             sum_row += x[i][j];
47         }
48         if (sum_row != magic_sum) {
49             return 0;
50         }
51     }
52     for (j = 0; j < n; j++) {
53         sum_col = 0;
54         for (i = 0; i < n; i++) {
55             sum_col += x[i][j];
56         }
57         if (sum_col != magic_sum) {
58             return 0;
59         }
60     }
61     for (i = 0; i < n; i++) {
62         sum_diag1 += x[i][i];
63     }
64     if (sum_diag1 != magic_sum) {
65         return 0;
66     }
67     for (i = 0; i < n; i++) {
68         sum_diag2 += x[i][n - 1 - i];
69     }
70     if (sum_diag2 != magic_sum) {
71         return 0;
72     }
73     return 1;
74 }

2.运行结果截图:

7

3.解释说明:

先算出魔方矩阵的标准幻和,再依次检查每行、每列、两条对角线的和是否都等于这个幻和,全部符合就是魔方矩阵,返回1,否则就不是,返回0

 

posted @ 2026-05-05 20:51    阅读(4)  评论(0)    收藏  举报