实验四

Task 1:

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

捕获

 

问题一:一维数组在内存中是连续存放的。x和&x[0]相同
问题二:二维数组在内存中是按行连续存放的。x、x[0]和&x[0][0]的值相同。x[0]和x[1]相差0x10,差值含义代表第二行相对于第一行的起始地址偏移了4个int类型的大小。
 
Task 2:

 

 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 }

捕获.PNG2

 

问题一:input的形参:int x[ ] ,int n。实参:x,n。

问题二:input的作用:输入参数x[ ]和n,并存储。compete的作用:实际计算,先去除极值,再计算平均值。

 

Task 3:

 

 1 #include <stdio.h>
 2 #define N 100
 3 // 函数声明
 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     
11     while(printf("Enter n and value: "), scanf("%d%d", &n, &value) != EOF) {
12         init(x, n, value); // 函数调用
13         output(x, n); // 函数调用
14         printf("\n");
15     }
16      
17     return 0;
18 } 
19 // 函数定义
20 void output(int x[][N], int n) {
21     int i, j;
22     
23     for(i = 0; i < n; ++i) {
24         for(j = 0; j < n; ++j)
25             printf("%d ", x[i][j]);
26         printf("\n");
27     }
28 } 
29 // 函数定义
30 void init(int x[][N], int n, int value) {
31     int i, j;
32     
33     for(i = 0; i < n; ++i)
34         for(j = 0; j < n; ++j)
35             x[i][j] = value;
36 }

捕获.PNG3

捕获.PNG4

 

 问题一:output的形参:int x[ ] [N],int n。实参:x,n。

问题二:(会报错)

问题三:output:输入n*n的二维数组。init:将二维数组转化为value的形式

Task 4:

 

 

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

image

 

Task 5:

 

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

 

 

 

 

 

image

Task 6:

 

 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);
 8         dec_to_n(x, 8);
 9         dec_to_n(x, 16);
10         printf("\n");
11     }
12     return 0;
13 }
14 void dec_to_n(int x, int n) {
15     int a, i = 0;
16     char t[N];
17     int b = x;
18     if (b == 0) {
19         printf("0");
20         return;
21     }
22     while (b != 0) {
23         a = b % n;
24         if (a<10){
25             t[i]=a+'0';
26         }
27         else{
28             t[i]=a-10+'A';
29         }
30         i ++;
31         b = b / n;
32     }
33     int j;
34         for (j = i - 1;j >= 0;j--) {
35         printf("%c", t[j]);
36 
37     }
38     printf("\n");
39 }

 

image

Task 7:(不会,抄的)

 

 1 #include <stdio.h>
 2 #define N 100
 3 void input(int x[][N], int n);
 4 void output(int x[][N], int n);
 5 int main() {
 6     int x[N][N];
 7     int n;
 8     while(printf("输入n: "), scanf("%d", &n) != EOF) {
 9         printf("输入方阵:\n");
10         input(x, n); printf("输出方阵:\n");
11         output(x, n); 
12         if(is_magic(x, n))
13         printf("是魔方矩阵\n\n");
14         else
15         printf("不是魔方矩阵\n\n");
16     }
17     return 0;
18 }
19 void input(int x[][N], int n) {
20     int i, j;
21     for (i = 0; i < n; ++i) {
22         for (j = 0; j < n; ++j)
23         scanf("%d", &x[i][j]);
24     }
25 }
26 void output(int x[][N], int n) {
27     int i, j;
28     for (i = 0; i < n; ++i) {
29         for (j = 0; j < n; ++j)
30         printf("%4d", x[i][j]);
31         printf("\n");
32     }
33 }
34 int is_magic(int x[][N], int n) {
35     int target = n * (n * n + 1) / 2;
36     int i, j;
37     int row_sum, col_sum, diag1_sum = 0, diag2_sum = 0;
38     for (i = 0; i < n; ++i) {
39         diag1_sum += x[i][i];
40         diag2_sum += x[i][n - 1 - i];
41     }
42     if (diag1_sum != target || diag2_sum != target)
43         return 0;
44     for (i = 0; i < n; ++i) {
45         row_sum = 0;
46         for (j = 0; j < n; ++j) {
47             row_sum += x[i][j];
48         }
49         if (row_sum != target)
50             return 0;
51     }
52     for (j = 0; j < n; ++j) {
53         col_sum = 0;
54         for (i = 0; i < n; ++i) {
55             col_sum += x[i][j];
56         }
57         if (col_sum != target)
58             return 0;
59     }
60     return 1;
61 }

 

 

 

 

image

 

posted @ 2025-11-10 17:21  超级累的长颈鹿  阅读(3)  评论(0)    收藏  举报