实验4 C语言函数应用编程

实验任务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 }

运行结果:

111111

问题1答案:是的。相同。

问题2答案:是的。值相同。相差16个字节。这个差值代表二维数组中一行元素所占的总字节数,即从一行的起始地址到下一行起始地址的偏移量。

 

实验任务2:

源代码:

 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 // 函数定义
22 double compute(int x[], int n) {
23     int i, high, low;
24     double ans;
25     high = low = x[0];
26     ans = 0;
27     for (i = 0; i < n; ++i) {
28         ans += x[i];
29 
30         if (x[i] > high)
31             high = x[i];
32         else if (x[i] < low)
33             low = x[i];
34     }
35     ans = (ans - high - low) / (n - 2);
36     return ans;
37 }

运行截图:

22222

问题1答案:形参:void input(int x[ ], int n)。实参:int x[N]

问题2答案:input函数:接收一个一维数组 x 和长度 n,通过循环读取 n 个整数,存入数组 x 中。

                    compute函数:接收一个一维数组 x 和长度 n,计算并返回去掉最大值和最小值后的平均值。

 

 

实验任务3:

源代码:

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

运行截图:

3333333

问题1答案:形参:int x[ ][N],实参:x。

问题2答案:不能。

问题3答案:init 函数:接收一个n×n的二维数组,将矩阵中所有元素的值统一初始化为 value。output 函数:接收一个n×n的二维数组,按行输出矩阵中的所有元素,每行输出后换行,形成矩阵格式的打印结果。

   

实验任务4:

源代码:

 1 #include <stdio.h>
 2 #define N 100
 3 void input(int x[], int n);
 4 double median(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 = median(x, n); 
12         printf("ans = %g\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 }
22 void sort(int x[], int n) {
23     int i, j, temp;
24     for (i = 0; i < n - 1; i++) {
25         for (j = 0; j < n - i - 1; j++) {
26             if (x[j] > x[j + 1]) {
27                 temp = x[j];
28                 x[j] = x[j + 1];
29                 x[j + 1] = temp;
30             }
31         }
32     }
33 }
34 double median(int x[], int n) {
35     sort(x, n);
36     if (n % 2 == 1) {
37         return x[n / 2];
38     }
39     else {
40         return (x[n / 2 - 1] + x[n / 2]) / 2.0;
41     }
42 }

运行截图:

444

 

实验任务5:

源代码:

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

运行截图:

555

 

 

实验任务6:

源代码:

 1 #include <stdio.h>
 2 #define N 100
 3 void dec_to_n(int x, int n);
 4 int main() {
 5    

int x; 6 while (printf("输入十进制整数: "), scanf_s("%d", &x) != EOF) { 7 dec_to_n(x, 2); 8 printf("\n"); 9 dec_to_n(x, 8); 10 printf("\n"); 11 dec_to_n(x, 16); 12 printf("\n\n"); 13 } 14 return 0; 15 } 16 void dec_to_n(int x, int n) { 17 char ans[100]; 18 char map[] = "0123456789ABCDEF"; 19 int r; 20 int i; 21 int cnt = 0; 22 do { 23 r = x % n; 24 ans[cnt++] = map[r]; 25 x = x / n; 26 } while (x); 27 for (i = cnt - 1; i >= 0; --i) 28 printf("%c", ans[i]); 29 }

运行截图:

6666

 

实验任务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 int main() {
 7     int x[N][N];
 8     int n;
 9     while (printf("输入n: "), scanf_s("%d", &n) != EOF) {
10         printf("输入方阵:\n");
11         input(x, n);
12         printf("输出方阵:\n");
13         output(x, n);
14         if (is_magic(x, n))
15             printf("是魔方矩阵\n\n");
16         else
17             printf("不是魔方矩阵\n\n");
18     }
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 int is_magic(int x[][N], int n) {
40     int i, j;
41     int row_sum, col_sum;
42     int diag1 = 0, diag2 = 0;
43     int magic_sum = n * (n * n + 1) / 2; 
44     for (i = 0; i < n; ++i) {
45         diag1 += x[i][i];
46         diag2 += x[i][n - 1 - i];
47     }
48     if (diag1 != magic_sum || diag2 != magic_sum) {
49         return 0;
50     }
51     for (i = 0; i < n; ++i) {
52         row_sum = 0;
53         for (j = 0; j < n; ++j) {
54             row_sum += x[i][j];
55         }
56         if (row_sum != magic_sum) {
57             return 0;
58         }
59     }
60     for (j = 0; j < n; ++j) {
61         col_sum = 0;
62         for (i = 0; i < n; ++i) {
63             col_sum += x[i][j];
64         }
65         if (col_sum != magic_sum) {
66             return 0;
67         }
68     }
69     return 1;
70 }

运行截图:

77777

77777777

算法思路说明:先根据公式 n*(n²+1)/2 计算出标准幻和, 分别计算两条主对角线的和,若不等于幻和则直接判定为非魔方矩阵.逐行计算每行元素和,逐列计算每列元素和,只要有一行或一列的和不等于幻和,就判定为非魔方矩阵, 所有行、列、对角线的和都等于幻和时,才返回1,表示是魔方矩阵。

 

posted @ 2026-05-04 00:20  rjyyy  阅读(5)  评论(0)    收藏  举报