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

截图1:

 

问题1:

一维数组中x是连续存放的;x对应的值和&x[0]是一样的

问题2:在内存中是按行连续存放的;x与x[0]是一样的,但x[0][0]不同;相差的值是一行元素占用的字节数

源代码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 double compute(int x[],int n){
27     int i,high,low;
28     double ans;
29     
30     high = low = x[0];
31     ans =0;
32     
33     for(i=0;i<n;++i){
34         ans +=x[i];
35         
36         if(x[i]>high)
37             high =x[i];
38         else if (x[i]<low)
39             low =x[i];
40     }
41     
42     ans =(ans-high-low)/(n-2);
43     
44     return ans;
45     
46 }

 

截图2:

 

问题:形参和实参都是整型

input的作用是输入一维数组;compute的作用是计算去掉最大值和最小值后一组数的平均数

 

 

源代码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 vlue:"),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 
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 }

截图3:

 

问题:形参和实参都是整型

二维的不能省略;init的作用是确定数组的大小;output的作用是让数组的每个元素都赋值成value

源代码4:

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

截图4:

 

源代码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("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 //功能: 输入一个n*n的矩阵x
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 //函数定义
38 //功能:输出一个n*n的矩阵x 
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 //功能:把一个n*n的矩阵x,每一列向右移,最右边被移出去的一列绕回左边
52 
53 void rotate_to_right(int x[][N],int n){
54     int i,j,temp;
55     for(j=0;j<n;j++){
56         temp =x[j][n-1];
57         for (i=n-1;i>0;i--){
58             x[j][i]=x[j][i-1];
59         }
60         x[j][0]=temp;
61     }
62     
63 }

截图5:

 

源代码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);  //函数调用:把x转换成二进制输出 
11         dec_to_n(x,8);  //函数调用:把x转换成八进制输出 
12         dec_to_n(x,16);  //函数调用:把x转换成十六进制输出 
13         
14         printf("\n");
15     }
16     
17     return 0;
18     
19 } 
20 //函数定义
21 //功能:把十进制数x转换成n进制,打印输出
22  
23 void dec_to_n(int x,int n){
24     int remainder[50];
25     int t=0;
26     while(x!=0){
27         remainder[t]=x%n;
28         x/=n;
29         t++;
30     }
31     int i;
32     for(i=t-1;i>=0;i--){
33         if(remainder[i]>=10&&n==16){
34             printf("%c",remainder[i]-10+'A');
35         }
36         else{
37             printf("%d",remainder[i]);
38         }
39     }
40     printf("\n");
41     
42 }

 

截图6:

 

源代码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 
10 int main(){
11     int x[N][N];
12     int n;
13     while(printf("输入n: "),scanf("%d",&n)!=EOF){
14         printf("输入方阵:\n");
15         input(x,n);
16         printf("输出方阵:\n");
17         output(x,n);
18         if(is_magic(x,n))
19            printf("是魔方矩阵\n\n");
20         else
21           printf("不是魔方矩阵\n\n");
22     }
23     return 0;
24 }
25 
26 //函数定义
27 //功能:输入一个n*n的矩阵x 
28 void input(int x[][N],int n){
29     int i,j;
30     for(i=0;i<n;i++){
31         for(j=0;j<n;j++)
32            scanf("%d",&x[i][j]);
33     }
34 }
35 
36 //功能:输出一个n*n的矩阵x 
37 void output(int x[][N],int n){
38     int i,j;
39     for(i=0;i<n;i++){
40         for(j=0;j<n;j++)
41           printf("%4d",x[i][j]);
42         printf("\n");
43     }
44 }
45 
46 //功能:判断一个n阶方阵是否为魔方矩阵,如果是,返回1,否则返回0 
47 int is_magic(int x[][N],int n){
48     int i,j,sum_magic=0,sum_hang=0,sum_lie=0,sum_dui1=0,sum_dui2=0;
49         for(j=0;j<n;j++){
50         sum_magic+=x[0][j];
51         }
52         for(i=1;i<n;i++){
53             for(j=0;j<n;j++){
54                  sum_hang+=x[i][j];
55             }
56                   if(sum_hang!=sum_magic){
57                        return 0;
58                   }
59                 sum_hang=0  ;
60         }
61         for(j=0;j<n;j++){
62             for(i=0;i<n;i++){
63                 sum_lie+=x[i][j];
64             }
65             if(sum_lie!=sum_magic){
66                   return 0;
67             }
68              sum_lie=0;
69         }
70         for(i=0;i<n;i++){
71             sum_dui1+=x[i][i];
72         }
73         if(sum_dui1!=sum_magic){
74               return 0;
75         }
76 
77         for(i=0;i<n;i++){
78             sum_dui2+=x[i][n-1-i];
79         }
80         if(sum_dui2!=sum_magic){
81              return 0;
82         }
83        else{
84                return 1;
85        }
86 
87     }

 

 

截图7:

 

posted @ 2024-11-10 17:12  杨启霖  阅读(7)  评论(0编辑  收藏  举报