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

问题1

是连续存放的

值是相等的

问题2

二维数组的存放是联系的

值是相等的

差值意味着一行元素的总字节数

任务2

源代码

 1 #include <stdio.h>
 2 #define N 100
 3 
 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     while(printf("Enter n: "), scanf("%d", &n) != EOF) {
13         input(x, n);        // 函数调用
14         ans = compute(x, n); // 函数调用
15         printf("ans = %.2f\n\n", ans);
16     }
17     return 0;
18 }
19 
20 // 函数定义
21 void input(int x[], int n) {
22     int i;
23     for(i = 0; i < n; ++i)
24         scanf("%d", &x[i]);
25 }
26 
27 // 函数定义
28 double compute(int x[], int n) {
29     int i, high, low;
30     double ans;
31     high = low = x[0];
32     ans = 0;
33     for(i = 0; i < n; ++i) {
34         ans += x[i];
35         if(x[i] > high)
36             high = x[i];
37         else if(x[i] < low)
38             low = x[i];
39     }
40     ans = (ans - high - low) / (n - 2);
41     return ans;
42 }

问题1

形参为int x[]或 int x[N]

实参为input(x,n)

问题2

input是为了接受n个整数,并存入数组之中

compute是为了求平均值

任务3

源代码

 1 #include <stdio.h>
 2 #define N 100
 3 
 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     return 0;
18 }
19 
20 // 函数定义:初始化二维数组
21 void init(int x[][N], int n, int value) {
22     int i, j;
23     for(i = 0; i < n; ++i)
24         for(j = 0; j < n; ++j)
25             x[i][j] = value;
26 }
27 
28 // 函数定义:输出二维数组
29 void output(int x[][N], int n) {
30     int i, j;
31     for(i = 0; i < n; ++i) {
32         for(j = 0; j < n; ++j)
33             printf("%d ", x[i][j]);
34         printf("\n");
35     }
36 }

问题1

形参为int x【】 ,int x【N】【N】

实参为output(x,n)

问题2

不可省略

问题3

output是为了收集n*n的二维数组,按行输出所有元素

init是为了接受二维数组并对其初始化赋值

任务4

源代码

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

截图

image

 任务5

源代码

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

截图

 

image

 任务6

源代码

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

截图

image

 任务7

源代码

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

截图

image

 

posted @ 2026-05-05 22:26  龚祉天  阅读(7)  评论(0)    收藏  举报