实验四

实验1

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.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("%p:%d\n", &x[i], x[i]);
11     printf("x=%p\n", x);
12 }
13 void test2() {
14     int x[M][N] = { {1,9,8,4},{2,0,4,9} };
15     int i, j;
16     printf("sizeof(x)=%d\n", sizeof(x));
17     for (i = 0; i < M; ++i)
18         for (j = 0; j < N; ++j)
19             printf("%p:%d\n", &x[i][j], x[i][j]);
20     printf("\n");
21     printf("x=%p\n", x);
22     printf("x[0]=%p\n", x[0]);
23     printf("x[1]=%p\n", x[1]);
24     printf("\n");
25 }
26 int main() {
27     printf("测试1:int型一维数组\n");
28     test1();
29     printf("\n测试2:int型二维数组\n");
30     test2();
31     return 0;
32 }
View Code

1

问题一:一维数组x在存放中是连续存放。x和&x[0]相同

问题二:二维数组x在内存中不是按行连续存放,x和x[0][0]和x[0]相同,x[0]和x[1]差16,差值的含义是列也要占据内存字节,而差的16个字节正好是第0行的1,2,3,4列所占的字节。

实验2:

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.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         input(x, n);
12         ans = compute(x, n);
13         printf("ans=%.2f\n\n", ans);
14     }
15     return 0;
16 }
17 void input(int x[], int n) {
18     int i;
19     for (i = 0; i < n; ++i)
20         scanf("%d", &x[i]);
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         if (x[i] > high)
30             high = x[i];
31         else if (x[i] < low)
32             low = x[i];
33     }
34     ans = (ans - high - low) / (n - 2);
35     return ans;
36 }
View Code

2

问题1:形参:x[],n。实参:以第一组数据为例:5;1,9,8,4,2

问题2:input的作用是输入x[]和n的具体值,compute的作用是去掉最高分与最低分求剩余平均值

实验3:

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

3

问题1:形参:x[][N],n。实参:5,42。

问题2:不可以,机器将无法计算矩阵大小。

问题3:output作用是输出矩阵,init的作用是将value的值赋给矩阵。

实验4:

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.h>
 3 #define N 100
 4 void input(int x[],int n);
 5 double medium(int x[], int n);
 6 int i;
 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 = medium(x, n);
14         printf("ans=%g\n\n", ans);
15     }
16     return 0;
17 }
18 void input(int x[], int n) {
19     
20     for (i = 0; i < n; ++i)
21         scanf("%d", &x[i]);
22 }
23 double medium(int x[], int n) {
24     double ans ;
25     int i, j;
26     int t;
27     for(i=0;i<n-1;++i)
28         for (j = 0; j<n-i-1 ;j++) {
29             if (x[j] > x[j + 1]) {
30                 t = x[j];
31                 x[j] = x[j + 1];
32                 x[j + 1] = t;
33             }
34 
35         }
36     if (n % 2 == 0)
37         ans =(1.0* x[n / 2] + 1.0*x[n / 2 - 1])/2;
38     else if (n % 2 != 0)
39         ans = 1.0*x[(n + 1) / 2 - 1];
40     return ans;
41 }
View Code

4

实验5:

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

5

 实验6:

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.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     return 0;
14 }
15 void dec_to_n(int x, int n) {
16     int i = 0, j, k = 0, h, m = 0, t, b;
17     int a[N], y[N], z[N];    
18     if (n == 2) {
19         if (x == 0) {
20             printf("0");
21         }
22         while (x > 0) {
23             a[i] = x % 2;
24             x = x / 2;
25             i++;
26         }
27         for (j = i - 1; j >= 0; j--)
28             printf("%d", a[j]);
29     }printf("\n");
30     if (n == 8) {
31         if (x == 0) {
32             printf("0");
33         }
34         while (x > 0) {
35             y[k] = x % 8;
36             x = x / 8;
37             k++;
38         }
39         for (h = k - 1; h >= 0; h--)
40             printf("%d", y[h]);
41     }printf("\n");
42     if (n == 16) {
43         if (x == 0) {
44             printf("0");
45         }
46         while (x > 0) {
47             z[m] = x % 16;
48             x = x / 16;
49             m++;
50         }
51         for (t = m - 1; t >= 0; t--) {
52             b = z[t];
53             if (b == 10) {
54                 printf("A");
55             }
56             else if (b == 11) {
57                 printf("B");
58             }
59             else if (b == 12) {
60                 printf("C");
61             }
62             else if (b == 13) {
63                 printf("D");
64             }
65             else if (b == 14) {
66                 printf("E");
67             }
68             else if (b == 15) {
69                 printf("F");
70             }
71             else
72             printf("%d", b);
73         }
74     }
75 }
View Code

6

 实验7:

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.h>
 3 #define N 100
 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 int main() {
 8     int x[N][N];
 9     int n;
10     while (printf("输入n:"), scanf("%d", &n) != EOF) {
11         printf("输入方阵:\n");
12         input(x, n);
13         printf("输出方阵:\n");
14         output(x, n);
15         if (is_magic(x, n))
16             printf("是魔方矩阵\n\n");
17         else
18             printf("是不魔方矩阵\n\n");
19     }
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 int is_magic(int x[][N], int n) {
38     int s;
39     int i, j, k, l, ans1 = 0, ans2 = 0, ans3 = 0, ans4 = 0,ans5=0;
40     int q, w;
41     s = n * (n * n + 1) / 2;
42     for (i = 0; i < n; ++i) {
43         for (j = 0; j < n; ++j) {
44             ans1 = ans1 + x[i][j];
45         }
46     }
47     for (k = 0; k < n; ++k) {
48         for (l = 0; l < n; ++l) {
49             ans2 = ans2 + x[l][k];
50         }
51     }
52     for (q = 0; q < n; ++q)
53         ans4 += x[q][q];
54     for (w = n - 1; w >= 0; w--)
55         ans5 += x[w][w];
56     if (ans1 / n == s && ans2 / n == s && ans4 == s && ans5 == s)
57         return 1;
58     return 0;
59 }
View Code

71

7

 实验8:



 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.h>
 3 #define N 100
 4 int same(int k[N]);
 5 void comput(int x, int a[]);
 6 void order(int d[],int m);
 7 void tog(int z[], int x1[],int x2[],int q, int w);
 8 int cnt(int l);
 9 void move(int arr[], int size);
10 int main() {
11     int i=1;
12     int s, m;
13     int p = 0, q = 0;
14     int a[N], b[N];
15     int c[N];
16     for (i = 1;; i++) {
17         s = i * i;
18         m = i * i * i;
19         comput(s, a);
20         comput(m, b);
21         order(a, cnt(s));
22         order(b, cnt(m));
23         tog(c, a, b, cnt(s),cnt(m));
24         order(c, cnt(s)+ cnt(m));
25         move(c, cnt(s) + cnt(m));
26         if (same(c)) {
27             printf("%d", i);
28             break;
29         }
30 
31 
32     }
33 }
34 int same(int k[N]) {
35     int x[N] = { 0,1,2,3,4,5,6,7,8,9 };
36     int i = 0;
37     int j = 0;
38     for (i = 0, j = 0; i < 10&& j < 10; ++i, ++j) {
39         if (k[j] != x[i])
40             return 0;
41     }
42     return 1;
43 }
44 void comput(int x, int a[]) {
45     int i = 0;
46     while (x != 0) {
47         a[i] = x % 10;
48         x = x / 10;
49         i++;
50     }
51 }
52 void order(int d[], int n) {
53     int i, j, t;
54     for (i = 0; i < n - 1; ++i)
55         for (j = 0; j < n - i - 1; ++j) {
56             if (d[j] > d[j + 1]) {
57                 t = d[j];
58                 d[j] = d[j + 1];
59                 d[j + 1] = t;
60             }
61         }
62 }
63 int cnt(int l) {
64     int i=0;
65     while (l != 0) {
66         i++;
67         l = l / 10;
68     }return i;
69 }
70 void tog(int z[], int x1[],int x2[],int q, int w) {
71     for (int i = 0; i < q; i++) {
72         z[i] = x1[i];
73     }
74     for (int i = 0; i < w; i++)
75         z[i + q] = x2[i];
76 }
77 void move(int arr[], int size) {
78     int j = 0;
79     for (int i = 0; i < size - 1; i++) {
80         if (arr[i] != arr[i + 1])
81             arr[j++] = arr[i];
82     }
83     arr[j] = arr[size - 1];
84     
85 }

屏幕截图 2025-11-15 160646

 

 

 


posted @ 2025-11-15 16:08  deepsigh  阅读(5)  评论(0)    收藏  举报