实验四

实验任务一

源代码

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

运行结果

屏幕截图 2026-04-29 152356

问题

1.是   相同

2.是   相同   N*sizeof(int)字节   从第0行首地址到第1行首地址的偏移量

实验任务二

源代码

 1 #include <stdio.h>
 2 #include <stdlib.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);        // 调用input函数输入数组
16         ans = compute(x, n); // 调用compute函数计算结果
17         printf("ans = %.2f\n\n", ans);
18     }
19     system("pause");
20     return 0;
21 }
22 
23 // 函数定义:输入n个整数到数组x中
24 void input(int x[], int n) {
25     int i;
26     for(i = 0; i < n; ++i)
27         scanf("%d", &x[i]);
28 }
29 
30 // 函数定义:去掉最大值和最小值后,计算剩余数的平均值
31 double compute(int x[], int n) {
32     int i, high, low;
33     double ans;
34 
35     high = low = x[0];
36     ans = 0;
37 
38     // 遍历数组,求和并找出最大值、最小值
39     for(i = 0; i < n; ++i) {
40         ans += x[i];
41         if(x[i] > high)
42             high = x[i];
43         else if(x[i] < low)
44             low = x[i];
45     }
46 
47     // 去掉一个最大值和一个最小值,计算平均值
48     ans = (ans - high - low) / (n - 2);
49     return ans;
50 }

运行结果

屏幕截图 2026-04-29 153224

问题

1.void input(int x[], int n)           input(x,n)

2.输入 n 个整数到数组 x 中       计算去掉最大值、最小值后的数组的平均分并返回 

实验任务三

源代码

 1 #include <stdio.h>
 2 #include <stdlib.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);    // 调用init初始化二维数组
15         output(x, n);         // 调用output输出二维数组
16         printf("\n");
17     }
18     system("pause");
19     return 0;
20 }
21 
22 // 函数定义:输出n×n的二维数组
23 void output(int x[][N], int n) {
24     int i, j;
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 // 函数定义:将n×n的二维数组所有元素初始化为value
33 void init(int x[][N], int n, int value) {
34     int i, j;
35     for(i = 0; i < n; ++i)
36         for(j = 0; j < n; ++j)
37             x[i][j] = value;
38 }

运行结果

屏幕截图 2026-04-29 153833

问题

1.void output(int x[][N], int n)        output(x, n)

2.不能

3.逐行输出 n×n 二维数组的所有元素      将 n×n 二维数组的所有元素都赋值为 value,完成数组的初始化

实验任务四

源代码

 1 #include <stdio.h>
 2 #include<stdlib.h>
 3 #define N 100
 4 
 5 // 函数声明
 6 void input(int x[], int n);
 7 double median(int x[], int n);
 8 
 9 // 冒泡排序(辅助函数,给median使用)
10 void sort(int x[], int n) {
11     int i, j, temp;
12     for(i = 0; i < n - 1; i++) {
13         for(j = 0; j < n - 1 - i; j++) {
14             if(x[j] > x[j+1]) {
15                 temp = x[j];
16                 x[j] = x[j+1];
17                 x[j+1] = temp;
18             }
19         }
20     }
21 }
22 
23 int main() {
24     int x[N];
25     int n;
26     double ans;
27 
28     while(printf("Enter n: "), scanf("%d", &n) != EOF) {
29         input(x, n);         // 调用input录入数据
30         ans = median(x, n);  // 调用median计算中值
31         printf("ans = %g\n\n", ans);
32     }
33     system("pause");
34     return 0;
35 }
36 
37 // 函数定义:从键盘录入n个整数到数组x中
38 void input(int x[], int n) {
39     int i;
40     for(i = 0; i < n; ++i)
41         scanf("%d", &x[i]);
42 }
43 
44 // 函数定义:计算n个整数的中值
45 double median(int x[], int n) {
46     // 1. 先排序
47     sort(x, n);
48 
49     // 2. 根据奇偶性计算中值
50     if(n % 2 == 1) {
51         // 奇数个元素:取中间位置的数
52         return x[n / 2];
53     } else {
54         // 偶数个元素:取中间两个数的平均值
55         return (x[n/2 - 1] + x[n/2]) / 2.0;
56     }
57 }

运行结果

屏幕截图 2026-04-29 154623

 

实验任务五

源代码

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

 

运行结果

屏幕截图 2026-04-29 154927

实验任务六

源代码

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

运行结果

image

 

实验任务七

源代码

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define N 100
 4 
 5 // 函数声明
 6 void input(int x[][N], int n);
 7 void output(int x[][N], int n);
 8 int is_magic(int x[][N], int n);
 9 
10 int main() {
11     int x[N][N];
12     int n;
13 
14     while(printf("输入n: "), scanf("%d", &n) != EOF) {
15         printf("输入方阵:\n");
16         input(x, n);
17 
18         printf("输出方阵:\n");
19         output(x, n);
20 
21         if(is_magic(x, n))
22             printf("是魔方矩阵\n\n");
23         else
24             printf("不是魔方矩阵\n\n");
25     }
26     system("p0ause");
27     return 0;
28 }
29 
30 // 函数定义:输入一个n*n的矩阵x
31 void input(int x[][N], int n) {
32     int i, j;
33     for (i = 0; i < n; ++i)
34         for (j = 0; j < n; ++j)
35             scanf("%d", &x[i][j]);
36 }
37 
38 // 函数定义:输出一个n*n的矩阵x
39 void output(int x[][N], int n) {
40     int i, j;
41     for (i = 0; i < n; ++i) {
42         for (j = 0; j < n; ++j)
43             printf("%4d", x[i][j]);
44         printf("\n");
45     }
46 }
47 
48 // 函数定义:判断一个n阶方阵是否为魔方矩阵,是返回1,否则返回0
49 int is_magic(int x[][N], int n) {
50     int i, j;
51     int magic_sum = n * (n * n + 1) / 2; // 计算幻和
52     int row_sum, col_sum, diag1 = 0, diag2 = 0;
53 
54     // 1. 检查两条对角线的和
55     for (i = 0; i < n; ++i) {
56         diag1 += x[i][i];
57         diag2 += x[i][n - 1 - i];
58     }
59     if (diag1 != magic_sum || diag2 != magic_sum)
60         return 0;
61 
62     // 2. 检查每一行的和
63     for (i = 0; i < n; ++i) {
64         row_sum = 0;
65         for (j = 0; j < n; ++j)
66             row_sum += x[i][j];
67         if (row_sum != magic_sum)
68             return 0;
69     }
70 
71     // 3. 检查每一列的和
72     for (j = 0; j < n; ++j) {
73         col_sum = 0;
74         for (i = 0; i < n; ++i)
75             col_sum += x[i][j];
76         if (col_sum != magic_sum)
77             return 0;
78     }
79 
80     // 所有条件都满足,返回1
81     return 1;
82 }

 

 运行结果

屏幕截图 2026-04-29 155451

 

posted @ 2026-04-29 15:55  kasdda  阅读(3)  评论(0)    收藏  举报