实验4

实验任务一

源代码task1.c

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

运行结果截图

捕获1

回答问题

1.一维数组在内存中连续存放,x&x[0] 的值相同

2.二维数组按行连续存放,xx[0]&x[0][0] 值相同;x[0]x[1] 相差 16 字节,表示一行元素的总字节大小

实验任务二

源代码task2.c

 1 #include <stdio.h>
 2 #define N 100
 3 
 4 void input(int x[], int n);
 5 double compute(int x[], int n);
 6 
 7 int main() {
 8     int x[N];
 9     int n, i;
10     double ans;
11 
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 
18     return 0;
19 }
20 
21 void input(int x[], int n) {
22     int i;
23 
24     for(i = 0; i < n; ++i)
25         scanf("%d", &x[i]);
26 }
27 
28 double compute(int x[], int n) {
29     int i, high, low;
30     double ans;
31 
32     high = low = x[0];
33     ans = 0;
34 
35     for(i = 0; i < n; ++i) {
36         ans += x[i];
37 
38         if(x[i] > high)
39             high = x[i];
40         else if(x[i] < low)
41             low = x[i];
42     }
43 
44     ans = (ans - high - low)/(n-2);
45 
46     return ans;
47 }
View Code

运行结果截图

捕获2

回答问题

1.形参:int x[];实参:直接写数组名 x

2.input:输入 n 个整数到数组

 compute:去掉最高分、最低分,求平均分

实验任务三 

源代码task3.c

 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 
18     return 0;
19 }
20 
21 void output(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             printf("%d ", x[i][j]);
27         printf("\n");
28     }
29 }
30 
31 void init(int x[][N], int n, int value) {
32     int i, j;
33 
34     for(i = 0; i < n; ++i)
35         for(j = 0; j < n; ++j)
36             x[i][j] = value;
37 }
View Code

运行结果截图

 3

回答问题

1.形参:int x[][N];实参:直接写数组名 x

2.第二维不能省略,省略会编译报错

3.output:输出 n×n 矩阵

 init:把矩阵所有元素设为指定值

实验任务四 

源代码task4.c

 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 
12     while (printf("Enter n: "), scanf("%d", &n) != EOF) {
13         input(x, n);
14         ans = median(x, n);
15         printf("ans = %g\n\n", ans);
16     }
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 
27 double median(int x[], int n) {
28     int i, j, temp;
29  
30     for (i = 0; i < n-1; i++) {
31         for (j = 0; j < n-i-1; j++) {
32             if (x[j] > x[j+1]) {
33                 temp = x[j];
34                 x[j] = x[j+1];
35                 x[j+1] = temp;
36             }
37         }
38     }
39    
40     if (n % 2 == 1) {
41         return x[n/2];              
42     } 
43     else {
44         return (x[n/2-1] + x[n/2])/2.0; 
45     }
46 }
View Code

运行结果截图

4

实验任务五 

源代码task5.c

 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 
16     printf("原始矩阵:\n");
17     output(x, n);
18 
19     rotate_to_right(x, n);
20 
21     printf("\n变换后矩阵:\n");
22     output(x, n);
23     system("pause");
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, j, temp;
46     for (i = 0; i < n; i++) {
47         temp = x[i][n-1];
48         for (j = n-1; j > 0; j--) {
49             x[i][j] = x[i][j-1];
50         }
51         x[i][0] = temp;
52     }
53 }
View Code

 运行结果截图

5

实验任务六 

源代码task6.c

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

运行结果截图

捕获6

实验任务七

源代码task7.c

 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 
12     while(printf("输入n: "), scanf("%d", &n) != EOF) {
13         printf("输入方阵:\n");
14         input(x, n);
15 
16         printf("输出方阵:\n");
17         output(x, n);
18 
19         if(is_magic(x, n))
20             printf("是魔方矩阵\n\n");
21         else
22             printf("不是魔方矩阵\n\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 
36 void output(int x[][N], int n) {
37     int i, j;
38     for (i = 0; i < n; i++) {
39         for (j = 0; j < n; j++) {
40             printf("%d\t", x[i][j]);
41         }
42         printf("\n");
43     }
44 }
45 
46 int is_magic(int x[][N], int n) {
47     int i, j, sum;
48     int target = n * (n * n + 1) / 2;
49 
50     for (i = 0; i < n; i++) {
51         sum = 0;
52         for (j = 0; j < n; j++) sum += x[i][j];
53         if (sum != target) return 0;
54     }
55 
56     for (j = 0; j < n; j++) {
57         sum = 0;
58         for (i = 0; i < n; i++) sum += x[i][j];
59         if (sum != target) return 0;
60     }
61 
62     sum = 0;
63     for (i = 0; i < n; i++) sum += x[i][i];
64     if (sum != target) return 0;
65 
66     sum = 0;
67     for (i = 0; i < n; i++) sum += x[i][n-1-i];
68     if (sum != target) return 0;
69 
70     return 1;
71 }
View Code

运行结果截图

7.17.27.37.4

算法思路

1.计算标准幻和:公式 sum = n*(n²+1)/2

2.逐行检查:遍历每一行,求和是否等于幻和。

3.逐列检查:遍历每一列,求和是否等于幻和。

4.检查对角线:主对角线(i=j)和副对角线(i+j=n-1),求和是否等于幻和。

5.返回结果:所有检查都通过就是魔方矩阵,否则不是。

实验任务八 

源代码task8.c

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 int main() {
 4     int n;
 5     for (n = 1; ; n++) {
 6         int square = n * n;    
 7         int cube = n * n * n;  
 8         int used[10] = {0};    
 9         int valid = 1;
10 
11         int temp = square;
12         while (temp > 0) {
13             int digit = temp % 10;
14             if (used[digit]) valid = 0;
15             used[digit] = 1;
16             temp /= 10;
17         }
18 
19         temp = cube;
20         while (temp > 0 && valid) {
21             int digit = temp % 10;
22             if (used[digit]) valid = 0;
23             used[digit] = 1;
24             temp /= 10;
25         }
26 
27         if (valid) {
28             int all_used = 1;
29             for (int i = 0; i < 10; i++) {
30                 if (!used[i]) all_used = 0;
31             }
32             if (all_used) {
33                 printf("%d\n", n);
34                 break;
35             }
36         }
37     }
38     system("pause");
39     return 0;
40 }
View Code

运行结果截图

8

算法思路

1.从 1 开始枚举整数,计算每个数的平方与立方;
2.用数组标记 0-9 每个数字的出现情况,逐位检查平方与立方的各位数字是否重复;
3.若不重复,则进一步验证 0-9 是否全部被使用;
4.找到首个满足 “平方与立方拼接后 0-9 数字各用一次” 条件的数后,输出结果并终止程序。
 
 

 

posted @ 2026-05-02 15:36  wuhahahaha  阅读(4)  评论(0)    收藏  举报