实验4

任务一

(1)源代码

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

(2)运行截图

renwu1

(3)回答问题

1.连续存放 ,二者相同。

2.连续存放,值相同,相差16个字节,为一行元素所占用内存。

任务二

(1)源代码

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

(2)运行截图

4.2

(3)回答问题

1.形参是数组,实参是地址。

2.input用来赋值,compute用来计算最值和去掉最值后的平均值。

任务三

(1)源代码

 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 
 9     while(printf("Enter n and value: "), scanf("%d%d", &n, &value) != EOF) {
10         init(x, n, value); 
11         output(x, n);      
12         printf("\n");
13     }
14     return 0;
15 }
16 void output(int x[][N], int n) {
17     int i, j;
18     for(i = 0; i < n; ++i) {
19         for(j = 0; j < n; ++j)
20             printf("%d ", x[i][j]);
21         printf("\n");
22     }
23 }
24 void init(int x[][N], int n, int value) {
25     int i, j;
26     for(i = 0; i < n; ++i)
27         for(j = 0; j < n; ++j)
28             x[i][j] = value;
29 }
View Code

(2)运行截图

4.3

(3)回答问题

1.形参是二维数组,实参是元素位置。

2.不能忽略。

3.作用是将数组元素都化为所输入的值

任务四

(1)源代码

 1 #include <stdio.h>
 2 #define N 100
 3  void input(int x[],int n);
 4 double median(int x[],int n);
 5 
 6 
 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 void input(int x[],int n)
22 {
23     int i=0;
24     for(;i<n;i++)
25     {
26         scanf("%d",&x[i]);
27     }
28      for(i = 0; i < n-1; i++) {
29         int j;
30         for(j = 0; j < n-1-i; j++) {
31             if(x[j] > x[j+1]) {
32                 int temp = x[j];
33                 x[j] = x[j+1];
34                 x[j+1] = temp;
35             }
36         }
37     }
38 }
39 double median(int x[],int n)
40 {
41     int med;
42     if(n%2==1)
43     {
44         med=(n-1)/2;
45         return x[med];
46     }
47     else
48     {
49         med=n/2;
50         return (x[med]+x[med-1])/2.0;
51     }
52     
53 }
View Code

(2)运行截图

4.4

任务五

(1)源代码

 1 #include <stdio.h>
 2 #include<stdlib.h>
 3 #define N 100
 4 
 5 
 6 void input(int x[][N], int n);
 7 void output(int x[][N], int n);
 8 void rotate_to_right(int x[][N],int n);
 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     system("pause");
25     return 0;
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 void output(int x[][N], int n) {
36     int i, j;
37 
38     for (i = 0; i < n; ++i) {
39         for (j = 0; j < n; ++j)
40             printf("%4d", x[i][j]);
41 
42         printf("\n");
43     }
44 }
45 void rotate_to_right(int x[][N],int n)
46 {
47     int y[N][N];
48     int i,j;
49     for(i=0;i<n;i++)
50     {
51     y[i][1]=x[i][n-1];
52     }
53     for(j=n-1;j>=0;j--)
54     {
55        for(i=0;i<n;i++)
56        {
57            x[i][j]=x[i][j-1];
58        }
59     }
60     for(i=0;i<n;i++)
61     {
62         x[i][0]=y[i][1];
63     }
64 }
View Code

(2)运行截图

4.5

任务六

(1)源代码

 1 #include <stdio.h>
 2 #define N 100
 3 void dec_to_n(int x, int n);
 4 
 5 int main() {
 6     int x;
 7 
 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 
13         printf("\n");
14     }
15 
16     return 0;
17 }
18 void dec_to_n(int x, int n)
19 {
20     char yu[N];
21     int i=0;
22     if(x==0)
23        {
24          printf("0\n");
25          return;
26        }
27     while(x>0)
28        {
29        int y=x%n;
30        if(y>9)
31            yu[i]='A'+(y-10);
32        else
33            yu[i]='0'+y;
34        x=x/n;
35        i++;
36        }
37     for(int j=i-1;j>=0;j--)
38     {
39         printf("%c",yu[j]);
40     }
41     printf("\n");
42 }
View Code

(2)运行截图

renwu6

 任务七

(1)源代码

  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     int x[N][N];
 11     int n;
 12 
 13     while(printf("输入n: "), scanf("%d", &n) != EOF) {
 14         printf("输入方阵:\n");  
 15         input(x, n); 
 16 
 17         printf("输出方阵:\n");  
 18         output(x, n);   
 19 
 20         if(is_magic(x, n))
 21             printf("是魔方矩阵\n\n");
 22         else
 23             printf("不是魔方矩阵\n\n");
 24     }
 25 
 26     return 0;
 27 }
 28 
 29 // 函数定义
 30 // 功能: 输入一个n*n的矩阵x
 31 void input(int x[][N], int n) {
 32     int i, j;
 33     
 34     for (i = 0; i < n; ++i) {
 35         for (j = 0; j < n; ++j)
 36             scanf("%d", &x[i][j]);
 37     }
 38 }
 39 
 40 // 功能: 输出一个n*n的矩阵x
 41 void output(int x[][N], int n) {
 42     int i, j;
 43 
 44     for (i = 0; i < n; ++i) {
 45         for (j = 0; j < n; ++j)
 46             printf("%4d", x[i][j]);
 47 
 48         printf("\n");
 49     }
 50 }
 51 
 52 
 53 int is_magic(int x[][N],int n)
 54 {
 55     int m=n*(n*n+1)/2;
 56     int i,j;
 57     int sum1=0;
 58     int sum2=0;
 59     for(i=0;i<n;i++)
 60     {
 61         int sum=0;
 62        for(j=0;j<n;j++)
 63        {
 64         sum+=x[i][j];
 65        }
 66        if(sum !=m)
 67        {
 68        return 0;
 69        }
 70     }
 71     for(j=0;j<n;j++)
 72     {
 73         int sum=0;
 74        for(i=0;i<n;i++)
 75        {
 76         sum+=x[i][j];
 77        }
 78        if(sum !=m)
 79        {
 80        return 0;
 81        }
 82     }
 83     for(i=0;i<n;i++)
 84     {
 85         sum1+=x[i][i];
 86     }
 87        if(sum1 !=m)
 88        {
 89        return 0;
 90        }
 91     
 92     for(i=0;i<n;i++)
 93     {
 94         sum2+=x[i][n-1-i];
 95     }
 96        if(sum2 !=m)
 97        {
 98        return 0;
 99        }
100     return 1;
101 }
View Code

(2)运行截图

7.1

7.2

7.3

7.4

(3)利用for循环判断各行各列的数值总值是否等于确定值,计算行列时若得到不符合的结果则直接终止,输出不是,否则就一直进行判断。直到判断两个对角线的数值是否符合目标值。

posted @ 2026-05-03 16:04  Ichika0217  阅读(13)  评论(0)    收藏  举报