实验4

TASK 1

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

问题1:数组在内存中是连续存放的;数组名x对应的值是数组中存储的整形数字,而&x[0]表示数组中第一个数的地址

问题2:二维数组按照矩阵形式存放;数组名x的值表示数组中存储的数字,x[0]表示二维数组的第一行,而&x[0][0]表示矩阵中(1,1)的地址;x[0]和x[1]相差16,表示第一行与第二行存储空间相隔16个byte

 

TASK 2

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

观察:作为形参时写作x,作为实参时写作x[i]

问题:input输入的值确定了n的大小,传递给函数compute计算平均值;compute对输入的数据去除最大值和最小值后求平均值

 

TASK 3

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

观察:作为形参时写作x,作为实参时写作x[i][j]

问题1:后一个的大小必须有定义

问题2:output对已知规模和内容的矩阵进行打印,init读取矩阵规模和内容传递给output

 

TASK 4

问题:当n为偶数时输出结果四舍五入了,查看代码没啥问题。。。

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

 

TASK 5

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

 

TASK 6

问题:十六进制的A-F不会改写

 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 
 9     while(printf("输入十进制整数: "), scanf("%d", &x) != EOF) {
10         dec_to_n(x, 2);  
11         dec_to_n(x, 8);  
12         dec_to_n(x, 16); 
13 
14         printf("\n");
15     }
16 
17     return 0;
18 }
19 
20 void dec_to_n(int x,int n)
21 {
22     int count = 0;
23     int t[N],i = 0;
24     while(x > 0)
25         {
26             t[i++] = x%n;
27             
28             x = x/n;
29             count++;
30         }
31     for(i = count-1;i >= 0;i--)
32         {
33             printf("%d",t[i]);
34         }
35         printf("\n");
36 }

 

TASK 7

问题:目前看来是输入任意矩阵都会判定为非魔方矩阵,暂时没找到逻辑错误

 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 int is_magic(int x[][N],int n);
 8 
 9 int main() 
10 {
11     int x[N][N];
12     int n;
13 
14     while(printf("输入n: "), scanf("%d", &n) != EOF) 
15     {
16         printf("输入方阵:\n");  
17         input(x, n); 
18 
19         printf("输出方阵:\n");  
20         output(x, n);   
21 
22         if(is_magic(x, n))
23             printf("是魔方矩阵\n\n");
24         else
25             printf("不是魔方矩阵\n\n");
26     }
27 
28     return 0;
29 }
30 
31 
32 void input(int x[][N], int n) 
33 {
34     int i, j;
35     
36     for (i = 0; i < n; ++i) 
37     {
38         for (j = 0; j < n; ++j)
39             scanf("%d", &x[i][j]);
40     }
41 }
42 
43 
44 void output(int x[][N], int n) 
45 {
46     int i, j;
47 
48     for (i = 0; i < n; ++i) 
49     {
50         for (j = 0; j < n; ++j)
51             printf("%4d", x[i][j]);
52 
53         printf("\n");
54     }
55 }
56 
57 int is_magic(int x[][N],int n)
58 {
59     int i,j;
60     int sum = 0;
61     int hang = 0,lie = 0,zhudjx = 0,fudjx = 0;64     for(j = 0;j < n;++j)
65         sum += x[0][j];
66     
67     for (i = 0; i < n; ++i) 
68     {
69         for (j = 0; j < n; ++j)
70         {
71             hang += x[i][j];
72             lie += x[j][i];
73         }
74         if (hang != sum || lie != sum) 
75         {
76             return 0;
77         }
78     }
79 
80     for (i = 0; i < n; ++i)
81     {
82         zhudjx += x[i][i];
83         fudjx += x[i][n - i - 1];
84     }
85         if (zhudjx != sum || fudjx != sum) 
86         {
87             return 0;
88         }
89     
90         return 1;
91     }

 

posted @ 2024-11-04 09:38  Florence11  阅读(6)  评论(0编辑  收藏  举报