实验4

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

 

问题1:

是连续存放的。是一样的。

问题2:

是“按行连续存放”的。是一样的。x【0】和x【1】相差16,该差值为一行数据所占用的内存字节数。

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

问题:

函数input的功能是给数组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 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 }

问题1:

第二维的大小不能省略。

问题2:

函数output的功能是输出数组x[N][N]。

函数init的功能是将value赋值给数组里的元素。

任务4:

源代码

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

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

任务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     
 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     int y[N];
22     char z[N];
23     int i,a,count=0; 
24     if(n==2||n==8){
25         do{
26             a=x%n;
27             x=x/n;
28             y[count]=a;
29             count+=1;
30         }while(x>=1);
31         for(i=count-1;i>=0;--i)
32             printf("%d",y[i]);
33         printf("\n");
34     }
35     if(n==16){
36         do{
37             a=x%n;
38             x=x/n;
39             switch(a)
40             {
41                 case 0:a='0';break;
42                 case 1:a='1';break;
43                 case 2:a='2';break;
44                 case 3:a='3';break;
45                 case 4:a='4';break;
46                 case 5:a='5';break;
47                 case 6:a='6';break;
48                 case 7:a='7';break;
49                 case 8:a='8';break;
50                 case 9:a='9';break;
51                 case 10:a='A';break;
52                 case 11:a='B';break;
53                 case 12:a='C';break;
54                 case 13:a='D';break;
55                 case 14:a='E';break;
56                 case 15:a='F';break;
57             }
58             z[count]=a;
59             count+=1;
60         }while(x>=1);
61         for(i=count-1;i>=0;--i)
62             printf("%c",z[i]);
63         printf("\n");
64     }
65 }

任务7:

源代码

 

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

 

posted @ 2024-11-08 18:42  hydrangea1123  阅读(4)  评论(0编辑  收藏  举报