实验四

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

eb5bdd5e4bbad91f9796abe4a626244d

问题1:是连续存放的,x和x【0】的值相同。

问题2:是按行连续存放的,x、x【0】和&x【0】【0】的值相同。

x[0]和x【1】相差16,含义是二维数组中一行元素所占的总字节数。

实验任务2:

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

23B2946897D57C1A22D93DB46B36C082

问题1:

形参形式:int[]

实参形式:调用时直接写数组名x

问题2:

input的功能是接收用户输入的n个整数,存入一维数组x中。

compute的功能是计算下中所有元素的总和,找出数组中的最大值和最小值,从总和中减去最大值和最小值再除以(n-2)

实验任务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 
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 }

F797018E124A149AF67DC9D18197A489

问题1:

形参书写形式:int[][N]第一维的长度可以省略

实参书写形式:调用output(x,n)时,二维数组的实参直接写数组名x

问题2:

第二维不能省略

问题3:

output的功能是输出二维数组的前n行n列元素,每行元素以空格分隔,输出完一行后换行

init的功能是将二维数组的前n行n列的所有元素,全部初始化为value指定的值。

实验任务4:

 1 #include <stdio.h>
 2 #define N 100
 3 void input(int x[],int n);
 4 double median(int x[],int n);
 5 
 6 int main() {
 7     int x[N];
 8     int n;
 9     double ans;
10 
11     while(printf("Enter n: "), scanf("%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 void input(int x[],int n)
20 {
21     int i;
22     for(i=0;i<n;++i)
23     {scanf("%d",&x[i]);
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 
38  if(n%2==1)
39 {return x[n/2];}
40  else{
41     return(x[n/2-1]+x[n/2])/2.0;
42     
43 }
44 }

7062BFFFD6116DF810B8842E4F39D708

实验任务5:

 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 void rotate_to_right(int x[][N],int n);
 7 
 8 int main() {
 9     int x[N][N];
10     int n;
11 
12     printf("输入n: "); 
13     scanf("%d", &n);
14     input(x, n);
15 
16     printf("原始矩阵:\n");
17     output(x, n);
18     rotate_to_right(x,n);
19     printf("变换后矩阵:\n");
20     output(x, n);
21 
22     return 0;
23 }
24 
25 void input(int x[][N], int n) {
26     int i, j;
27     
28     for (i = 0; i < n; ++i) {
29         for (j = 0; j < n; ++j)
30             scanf("%d", &x[i][j]);
31     }
32 }
33 
34 void output(int x[][N], int n) {
35     int i, j;
36 
37     for (i = 0; i < n; ++i) {
38         for (j = 0; j < n; ++j)
39             printf("%4d", x[i][j]);
40 
41         printf("\n");
42     }
43 }
44 void rotate_to_right(int x[][N],int n)
45 {
46     int i,j;
47     int temp;
48     int last_col[N];
49     for (i=0;i<n;++i)
50     {last_col[i]=x[i][n-1];
51         }
52     for(j=n-2;j>=0;--j)
53     {for(i=0;i<n;++i)
54     {x[i][j+1]=x[i][j];
55     }
56     }
57     for (i=0;i<n;++i)
58     {x[i][0]=last_col[i];
59     }
60 }

B6D1C6ACDCC726BE1615CD0F5B27E1B2

实验任务6:

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

A20690A64A2C9C2643D7F0C066A02FF4

实验任务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 is_magic(int x[][N], int n);
 6 
 7 int main() {
 8     int x[N][N];
 9     int n;
10 
11     while(printf("输入n: "), scanf("%d", &n) != EOF) {
12         printf("输入方阵:\n");
13         input(x, n);
14 
15         printf("输出方阵:\n");
16         output(x, n);
17 
18         if(is_magic(x, n))
19             printf("是魔方矩阵\n\n");
20         else
21             printf("不是魔方矩阵\n\n");
22     }
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 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         }
41         printf("\n");
42     }
43 }
44 
45 int is_magic(int x[][N], int n) {
46     int i, j;
47     int sum, target;
48 
49     target = n * (n * n + 1) / 2;
50 
51     for (i = 0; i < n; ++i) {
52         sum = 0;
53         for (j = 0; j < n; ++j) {
54             sum += x[i][j];
55         }
56         if (sum != target)
57             return 0;
58     }
59     for (j = 0; j < n; ++j) {
60         sum = 0;
61         for (i = 0; i < n; ++i) {
62             sum += x[i][j];
63         }
64         if (sum != target)
65             return 0;
66     }
67 
68     sum = 0;
69     for (i = 0; i < n; ++i) {
70         sum += x[i][i];
71     }
72     if (sum != target)
73         return 0;
74 
75     sum = 0;
76     for (i = 0; i < n; ++i) {
77         sum += x[i][n - 1 - i];
78     }
79     if (sum != target)
80         return 0;
81 
82     return 1;
83 }

7E8225A8B9FF021A80A3F9945A6C053A

 

posted @ 2026-05-05 20:32  韦志杨  阅读(10)  评论(0)    收藏  举报