实验4

实验4

task1

源代码:

 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     // 输出数组x占用的内存字节数
 8     printf("sizeof(x) = %d\n", sizeof(x));
 9     // 输出每个元素的地址、值
10     for (i = 0; i < N; ++i)
11         printf("%p: %d\n", &x[i], x[i]);
12     // 输出数组名x对应的值
13     printf("x = %p\n", x);
14 }
15 void test2() {
16     int x[M][N] = { {1, 9, 8, 4}, {2, 0, 4, 9} };
17     int i, j;
18     // 输出二维数组x占用的内存字节数
19     printf("sizeof(x) = %d\n", sizeof(x));
20     // 输出每个元素的地址、值
21     for (i = 0; i < M; ++i)
22         for (j = 0; j < N; ++j)
23             printf("%p: %d\n", &x[i][j], x[i][j]);
24     printf("\n");
25     // 输出二维数组名x, 以及,x[0], x[1]的值
26     printf("x = %p\n", x);
27     printf("x[0] = %p\n", x[0]);
28     printf("x[1] = %p\n", x[1]);
29     printf("\n");
30 }
31 int main() {
32     printf("测试1: int型一维数组\n");
33     test1();
34     printf("\n测试2: int型二维数组\n");
35     test2();
36     return 0;
37 }

输出结果:

 问题1:连续存放;一样

问题2:是;不一样;相差一个int类型长度

task2:

源代码:

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

输出结果:

 观察:形参:指定数组元素类型和数组名;

   实参:直接写数组名

问题:input函数:输出输入的数组;

   compute函数:输出除去极值后的数组的平均值

task3

源代码:

 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 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     return 0;
16 }
17 // 函数定义
18 void output(int x[][N], int n) {
19     int i, j;
20     for (i = 0; i < n; ++i) {
21         for (j = 0; j < n; ++j)
22             printf("%d ", x[i][j]);
23         printf("\n");
24     }
25 }
26 // 函数定义
27 void init(int x[][N], int n, int value) {
28     int i, j;
29     for (i = 0; i < n; ++i)
30         for (j = 0; j < n; ++j)
31             x[i][j] = value;
32 }

输出结果:

 观察:形参:指定数组元素类型和数组名;

   实参:直接写数组名

问题1:第二维

问题2:output函数:输出打印所得矩阵

   init函数:将数组所有值赋给value

task4

源代码:

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

输出结果:

 task5

源代码:

 1 #include <stdio.h>
 2 #define N 100
 3  
 4 // 函数声明
 5 void input(int x[][N], int n);
 6 void output(int x[][N], int n);
 7 // 函数rotate_to_right声明
 8 void rotate_to_right(int x[][N], int n);
 9  
10 int main()
11 {
12     int x[N][N];
13     int n;
14  
15     printf("输入n: ");
16     scanf("%d", &n);
17     input(x, n);
18  
19     printf("原始矩阵:\n");
20     output(x, n);
21  
22     // 函数rotate_to_right调用
23     rotate_to_right(x, n);
24  
25     printf("变换后矩阵:\n");
26     output(x, n);
27  
28     return 0;
29 }
30  
31 // 函数定义
32 // 功能: 输入一个n*n的矩阵x
33 void input(int x[][N], int n)
34 {
35     int i, j;
36  
37     for (i = 0; i < n; ++i)
38     {
39         for (j = 0; j < n; ++j)
40             scanf("%d", &x[i][j]);
41     }
42 }
43  
44 // 函数定义
45 // 功能: 输出一个n*n的矩阵x
46 void output(int x[][N], int n)
47 {
48     int i, j;
49  
50     for (i = 0; i < n; ++i)
51     {
52         for (j = 0; j < n; ++j)
53             printf("%4d", x[i][j]);
54  
55         printf("\n");
56     }
57 }
58  
59 // 函数rotate_to_right定义
60 // 功能: 把一个n*n的矩阵x,每一列向右移, 最右边被移出去的一列绕回左边
61 void rotate_to_right(int x[][N], int n)
62 {
63     for (int i = 0; i < n; i++)
64     {
65         int temp = x[i][n - 1];
66         for (int j = n - 1; j > 0; j--)
67         {
68             x[i][j] = x[i][j - 1];
69         }
70         x[i][0] = temp;
71     }
72 }

输出结果:

 task6

源代码:

 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("%d", &x) != EOF) {
 7         dec_to_n(x, 2); // 函数调用: 把x转换成二进制输出
 8         dec_to_n(x, 8); // 函数调用: 把x转换成八进制输出
 9         dec_to_n(x, 16); // 函数调用: 把x转换成十六进制输出
10         printf("\n");
11     }
12     return 0;
13 }
14 // 函数定义
15 // 功能: 把十进制数x转换成n进制,打印输出
16 void dec_to_n(int x, int n) {
17     int num[N];
18     int i = 0;
19     while (x != 0) {
20         num[i] = x % n;
21         x = x / n;
22         i++;
23     }
24     for (int j = i - 1; j >= 0; j--) {
25         if (num[j] < 10) {
26             printf("%d", num[j]);
27         }
28         else {
29             switch (num[j]) {
30             case 10:
31                 printf("A");
32                 break;
33             case 11:
34                 printf("B");
35                 break;
36             case 12:
37                 printf("C");
38                 break;
39             case 13:
40                 printf("D");
41                 break;
42             case 14:
43                 printf("E");
44                 break;
45             case 15:
46                 printf("F");
47                 break;
48             }
49         }
50     }
51     printf("\n");
52 }

输出结果:

 task7

源代码:

 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 // 功能: 输入一个n*n的矩阵x
25 void input(int x[][N], int n) {
26     int i, j;
27     for (i = 0; i < n; ++i) {
28         for (j = 0; j < n; ++j)
29             scanf_s("%d", &x[i][j]);
30     }
31 }
32 // 功能: 输出一个n*n的矩阵x
33 void output(int x[][N], int n) {
34     int i, j;
35     for (i = 0; i < n; ++i) {
36         for (j = 0; j < n; ++j)
37             printf("%4d", x[i][j]);
38         printf("\n");
39     }
40 }
41 // 功能: 判断一个n阶方阵是否为魔方矩阵,如果是,返回1,否则,返回0
42 // 待补足函数is_magic定义
43 int is_magic(int x[][N], int n) {
44     int num1 = 0, num2 = 0, num3 = 0, num4 = 0, num5 = 0;
45     for (int i = 0; i < n; ++i) {
46         num1 += x[i][0];
47     }
48     
49     for (int j = 1; j < n; ++j) {
50         num2 = 0;
51         for (int i = 0; i < n; ++i) {
52             num2 += x[i][j];
53         }
54         if (num2 != num1) {
55             return 0;
56         }
57     }
58     
59     for (int i = 0; i < n; ++i){
60         num3 = 0;
61         for (int j = 0; j < n; ++j) {
62             num3 += x[i][j];
63         }
64         if (num3 != num1) {
65             return 0;
66         }
67     }
68 ;
69     for (int i = 0; i < n; ++i) {
70         num4 += x[i][i];
71     }
72     if (num4 != num1) {
73         return 0;        
74     }
75     
76 
77     for (int i = 0; i < n; ++i) {
78         num5 += x[i][n - i - 1];
79     }
80     if (num5 != num1) {
81         return 0;
82     }
83     return 1;
84 }

输出结果:

 task8

源代码:

 1 #include <stdio.h>
 2 
 3 int main() {
 4     int n;
 5     for (n = 1; n < 1000; n++) {
 6         if (check(n)) {
 7             printf("%d", n);
 8             break;
 9         }
10     }
11     return 0;
12 }
13 
14 int check(int n) {
15     int square = n * n;
16     int cube = n * n * n;
17     int x[10] = {0};
18     int t;
19     while (square > 0) {
20         t = square % 10;
21         x[t]++;
22         square /= 10;
23     }
24     while (cube > 0) {
25         t = cube % 10;
26         x[t]++;
27         cube /= 10;
28     }
29     for (int i = 0; i < 10; i++) {
30         if (x[i] != 1) {
31             return 0;
32         }
33     }
34     return 1;
35 }

输出结果:

 

posted @ 2024-11-05 00:57  KinderECHO  阅读(4)  评论(0编辑  收藏  举报