实验4

1.实验任务1

源代码

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

运行测试截图

{6E6A9AAF-5EDA-4FBD-9D77-26E9A0A69D36}

 

问题1:一维数组x在内存中是否连续存放?x和&x[0]的值相同吗?答1:是连续存放的,x和&x[0]的值相同。

问题2:二维数组x在内存中是否按行连续存放?x、x[0]和&x[0][0]的值相同吗?x[0]和x[1]相差多少? 该差值的含义是什么?答2:是按行连续存放的,x、x[0]和&x[0][0]的值相同,x[0]和x[1]相差(列数*sizeof(字符类型))字节,意义是一整行元素所占的内存大小。

2.实验任务2

源代码

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

运行测试截图

{045A8A49-8892-4663-B434-7375BBFFA84F}

问题1:一维数组作为参数时(以 input 函数为例),形参、实参书写形式分别是什么?答1:形参是int x[]、实参是x(数组名)。

问题2:函数 input 的功能是?函数 compute 的功能是?答2:函数 input 的功能是从键盘输入 n 个整数,依次存入数组 x 的前 n 个元素中,函数 compute 的功能是计算数组 x 中 n 个整数去掉最大值和最小值后的平均值。

3.实验任务3

源代码

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

运行结果截图

{E49DF378-3B00-42EA-9BA2-85C8DBA7EFD7}

问题1:两维数组作为函数参数时(以函数 output 为例),形参、实参书写形式分别是什么?答1:形参是 void output(int x[][N],int n)(函数定义)、实参是output()(函数调用)。

问题2:两维数组作为函数形参时,第二维大小能省略吗?(以函数 output 为例,试着把形参 x[][N] 写成 x[] [] ,编译代码,观察编译器是否报错)答2:报错。不能省略,编译器无法知道每行有多少个元素,无法计算元素地址。

问题3:函数 output 的功能是?函数 init 的功能是?答3:函数 output 的功能是输出一个nxn矩阵(二维数组x的前n行、前n列),每个元素后跟一个空格,每行末尾换行。函数 init 的功能是将一个nxn矩阵(二维数组x的前n行、前n列)的所有元素赋值为 value。

4.实验任务4

源代码

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define N 100
 4 void input(int x[], int n);
 5 double median(int x[], int n);
 6 int main() {
 7     int x[N];
 8     int n;
 9     double ans;
10     while(printf("Enter n: "), scanf("%d", &n) != EOF) {
11         input(x, n);
12         ans = median(x, n);
13         printf("ans = %g\n\n", ans);
14     }
15     system("pause");
16     return 0;
17 }
18 void input(int x[], int n){
19     int i;
20     printf("请输入%d个整数",n);
21     for(i=0;i<n;i++)
22         scanf("%d",&x[i]);
23 }
24 double median(int x[], int n){
25     int i,j;
26     int 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+1];
31                 x[j+1]=x[j];
32                 x[j]=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 }

运行结果截图

{7327BF66-9753-45A7-A608-D454164DDE7D}

5.实验任务5

源代码

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

运行结果截图

{C16FCBA3-ED21-4129-B689-02A59990B58F}

6.实验任务6

源代码

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

运行结果截屏

{ED0D8719-E00A-447B-9A73-8DAD27C4F5B3}

7.实验任务7

源代码

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #define N 100
 5 void input(int x[][N], int n);
 6 void output(int x[][N], int n);
 7 int is_magic(int x[][N], int n);
 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 void input(int x[][N], int n) {
24     int i, j;
25     for (i = 0; i < n; ++i) {
26         for (j = 0; j < n; ++j)
27             scanf("%d", &x[i][j]);
28     }
29 }
30 void output(int x[][N], int n) {
31     int i, j;
32     for (i = 0; i < n; ++i) {
33         for (j = 0; j < n; ++j)
34             printf("%4d", x[i][j]);
35         printf("\n");
36     }
37 }
38 
39 int is_magic(int x[][N], int n) {
40     int i, j;
41     int target = n * (n * n + 1) / 2;
42     int sum;
43     for (i = 0; i < n; ++i) {
44         sum = 0;
45         for (j = 0; j < n; ++j)
46             sum += x[i][j];
47         if (sum != target) return 0;
48     }
49     for (j = 0; j < n; ++j) {
50         sum = 0;
51         for (i = 0; i < n; ++i)
52             sum += x[i][j];
53         if (sum != target) return 0;
54     }
55     sum = 0;
56     for (i = 0; i < n; ++i)
57         sum += x[i][i];
58     if (sum != target) return 0;
59 
60     sum = 0;
61     for (i = 0; i < n; ++i)
62         sum += x[i][n - 1 - i];
63     if (sum != target) return 0;
64 
65     return 1;
66 }

运行结果截屏

{C6D2C4C0-B3C0-4FF8-8227-15D07B26B4CE}

{8287CB7B-F9F8-419E-9E1B-2447AAD4A2B3}

 算法思路说明:已知每行、每列、两条对角线上的和均等于幻和 n(n²+1)/2,分别校验行和,列和,还有主对角线和副对角线的和是否等于,所有条件均满足是魔方矩阵,否则不是。
 
posted @ 2026-05-05 21:04  202283300498石欣源  阅读(6)  评论(0)    收藏  举报