Experiment4

 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     printf("sizeof(x) = %d\n", sizeof(x));
 9 
10     for (i = 0; i < N; ++i)
11         printf("%p: %d\n", &x[i], x[i]);
12 
13     printf("x = %p\n", x); 
14 }
15 
16 void test2() {
17     int x[M][N] = {{1, 9, 8, 4}, {2, 0, 4, 9}};
18     int i, j;
19 
20     printf("sizeof(x) = %d\n", sizeof(x));
21 
22     for (i = 0; i < M; ++i)
23         for (j = 0; j < N; ++j)
24             printf("%p: %d\n", &x[i][j], x[i][j]);
25     printf("\n");
26 
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 }

E4T1图

问题1:一维数组x在内存中连续存放,x和&x[0]的值相同,都代表第一个元素的地址

问题2:二位数组x在内存中按行连续存放,x,x[0]和&x[0][0]的值相同,x[0]和x[1]相差16,因为N=4,int类型占4个字节,含义:体现了二维数组中一行元素所占用的总内存字节数

Task2:

 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     while(printf("Enter n:"),scanf("%d",&n)!=EOF){
11         input(x,n);
12         ans = compute(x,n);
13         printf("ans = %.2f\n\n",ans);
14     }
15     return 0;
16 }
17 void input(int x[],int n){
18     int i;
19     for(i=0;i<n;++i)
20     scanf("%d",&x[i]);
21 }
22 double compute(int x[],int n){
23     int i,high ,low;
24     double ans;
25     high = low = x[0];
26     ans = 0;
27     for(i=0;i<n;++i){
28         ans += x[i];
29         if(x[i]>high)
30         high = x[i];
31         else if(x[i]<low)
32         low = x[i];
33     }
34     ans = (ans-high-low)/(n-2);
35     return ans;
36 }

E4T2图

问题1:

形参:void input(int x[ ],int n)

实参:input(x,n);

问题2:input函数功能:将输入的数依次存放在数组x中

compute函数功能:计算数组x中储存的数去掉一个最大值和最小值后剩余(n-2)个数的平均数

Task3:

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

E4T3图

问题1:

形参:void output(int x[ ][N], int n)

void init(int x[ ][N],int n,int value)

实参:init(x,n,value);

output(x,n);

问题二:

二维数组作为函数参数时,第二维大小不能省略,写成x[ ][ ]会报错

问题三:

函数output的功能:按矩阵格式输出二维数组的元素

函数init的功能:将二维数组的所有元素初始化为指定的value值

Task4:

 

 1 #include <stdio.h>
 2 #define N 100
 3 
 4 void input(int x[],int n);
 5 double median(int x[],int n);
 6 void bubble_sort(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 = %.1f\n\n",ans);
17     }
18     return 0;
19 }
20 void input(int x[],int n){
21     int i;
22     for(i=0;i<n;i++){
23         scanf("%d",&x[i]);
24     }
25 }
26 void bubble_sort(int x[],int n){
27     int i,j,t;
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                 t=x[j];
32                 x[j]=x[j+1];
33                 x[j+1]=t;
34             }
35         }
36     }
37 }
38 double median(int x[],int n){
39     bubble_sort(x,n);
40     if(n%2==1){
41         return(double)x[n/2];
42     }else{
43         return(x[n/2]+x[n/2 + 1])/2.0;
44     }
45 }

E4T4图

Task5:

 

 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     printf("Enter n:");
12     scanf("%d",&n);
13     input(x,n);
14     
15     printf("原始矩阵:\n");
16     output(x,n);
17     
18     rotate_to_right(x,n);
19     
20     printf("变化后的矩阵:\n");
21     output(x,n);
22     
23     return 0;
24     
25 }
26 void input(int x[][N],int n){
27     int i,j;
28     for(i=0;i<n;++i){
29         for(j=0;j<n;++j)
30         scanf("%d",&x[i][j]);
31     }
32 }
33 void output(int x[][N],int n){
34     int i,j;
35     for(i=0;i<n;++i){
36         for(j=0;j<n;++j)
37         printf("%4d",x[i][j]);
38         
39         printf("\n");
40     }
41 }
42 void rotate_to_right(int x[][N],int n){
43     int i,j,t;
44     for(i=0;i<n;i++){
45         t = x[i][n-1];
46     for(j = n-1;j>0;j--){
47         x[i][j] = x[i][j-1];
48     }
49     x[i][0] = t;
50     }
51     }

E4T5图

 Task6:

 

 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     char map[]={"0123456789ABCDEF"};
16     char result[N];
17     int index=0;
18     if(x<0){
19         result[index++]='0';
20     }else{
21         while(x>0){
22             int t=x%n;
23             result[index++]=map[t];
24             x/=n;
25         }
26     }
27     for(int i=index-1;i>=0;i--){
28         printf("%c",result[i]);
29     }
30     printf(" \n");
31 }

E4T6图

Task7:

 

  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 int check_number(int x[][N],int n);
  7 
  8 int main(){
  9     int x [N][N];
 10     int n;
 11     while(printf("输入n:"),scanf("%d",&n)!=EOF){
 12         printf("输入方阵:\n");
 13         input(x,n);
 14         printf("输出方阵:\n");
 15         output(x,n);
 16         
 17         if(check_number(x,n)){
 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 void output(int x[][N],int n){
 35     int i,j;
 36     for (i=0;i<n;++i){
 37         for(j=0;j<n;++j)
 38         printf("%4d",x[i][j]);
 39         printf("\n");
 40     }
 41 }
 42 int check_number(int x[][N],int n){
 43     int total = n*n;
 44     int found[total+1];
 45     int i,j;
 46     for(i=1;i<=total;i++){
 47         found[i]=0;
 48     }
 49     for(i=0;i<n;i++){
 50         for(j=0;j<n;j++){
 51             int num = x[i][j];
 52             if(num<1||num>total){
 53                 return 0;
 54             }
 55             if (found[num]){
 56                 return 0;
 57             }
 58             found[num]=1;
 59         }
 60     }
 61     for(i=1;i<=total;i++){
 62         if(!found[i]){
 63             return 0;
 64         }
 65     }
 66     return 1;
 67 }
 68 int is_magic(int x[][N],int n){
 69     int i,j;
 70     int sum=0;
 71     int t;
 72     for(j=0;j<n;j++){
 73         sum+=x[0][j];
 74     }
 75     for(i=0;i<n;i++){
 76         t=0;
 77         for(j=0;j<n;j++){
 78             t+=x[i][j];
 79         }
 80         if(t!=sum)
 81         return 0;
 82     }
 83     for (j=0;j<n;j++){
 84         t=0;
 85         for(i=0;i<n;i++){
 86         t+=x[i][j];
 87     }
 88     if(t!=sum)
 89     return 0;
 90     }
 91     t=0;
 92     for(i=0;i<n;i++){
 93         t+=x[i][i];
 94     }
 95     if(t!=sum)
 96     return 0;
 97     t=0;
 98     for(i=0;i<n;i++){
 99         t+=x[i][n-1-i];
100     }
101     if(t!=sum)
102     return 0;
103     else
104     return 1;
105 }

E4T7.1

E4T7.2

E4T7.3

 

posted @ 2025-11-13 20:22  郑子鑫  阅读(1)  评论(0)    收藏  举报