实验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 
28     printf("x = %p\n", x);
29     printf("x[0] = %p\n", x[0]);
30     printf("x[1] = %p\n", x[1]);
31     printf("\n");
32 }
33 
34 int main() {
35     printf("测试1: int型一维数组\n");
36     test1();
37 
38     printf("\n测试2: int型二维数组\n");
39     test2();
40 
41     return 0;
42 }
View Code

运行结果截图

屏幕截图 2026-04-29 190912

问题回答

1.一维数组x在内存中连续存放,x和&x[0]的值相同

2.二维数组x在内存中按行连续存放,x~x[0]和&x[0][0]的值相同,x[0]和x[1]相差16,该差值指的是二维数组x中第0行第0列的元素和第1行第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 
24     for(i = 0; i < n; ++i)
25         scanf("%d", &x[i]);
26 }
27 
28 double compute(int x[], int n) {
29     int i, high, low;
30     double ans;
31 
32     high = low = x[0];
33     ans = 0;
34 
35     for(i = 0; i < n; ++i) {
36         ans += x[i];
37 
38         if(x[i] > high)
39             high = x[i];
40         else if(x[i] < low)
41             low = x[i];
42     }
43 
44     ans = (ans - high - low)/(n-2);
45 
46     return ans;
47 }
View Code

运行结果截图

屏幕截图 2026-04-29 193223

问题回答

1.形参:void input(int x[],int n);    实参:input(x,n);

2.input功能:接收输入的n个数字,并存入数组x中

compute功能:去掉数组x的最大和最小元素后,求剩余元素的平均值

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

运行结果截图

屏幕截图 2026-04-29 194610

问题回答

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

2.第二维大小不能省略,如果去掉N报错信息为:x被声明为多维函数时,除了第一维之外,其他所有维度都必须指定长度

3.output功能:实现二维数组按行格式化输出,打印前n行前n列元素

init功能:将数组的前n行前n列元素的值全部初始化为指定值value

任务4

源代码

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

运行结果截图

屏幕截图 2026-04-29 205635

任务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("输入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 void rotate_to_right(int x[][N],int n){
48     int i,j;
49     int temp;
50     
51     for(i=0;i<n;++i){
52         temp=x[i][n-1];
53         for(j=n-1;j>0;--j){
54             x[i][j]=x[i][j-1];
55         }
56         x[i][0]=temp;
57     }
58 }
View Code

运行结果截图

屏幕截图 2026-04-29 215636

任务6

源代码

 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 
19 void dec_to_n(int x,int n){
20     char ans[100];
21     char map[]="0123456789ABCDEF";
22     int r;
23     int i;
24     int cnt=0;
25     
26     if(x==0){
27         printf("0\n");
28         return;
29     }
30     if(x<0){
31         printf("-");
32         x=-x;
33     }
34     
35     do{
36         r=x%n;
37         ans[cnt++]=map[r];
38         x=x/n;
39     }while(x);
40     
41     for(i=cnt-1;i>=0;--i)
42     printf("%c",ans[i]);
43     printf("\n");
44 }
View Code

运行结果截图

屏幕截图 2026-04-29 231542

任务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;
50     int row_sum=0,col_sum=0;
51     int main_diag=0,sub_diag=0;
52     
53     for(i=0;i<n;i++){
54         main_diag+=x[i][i];
55         sub_diag+=x[i][n-i-1];
56     }
57     for(j=0;j<n;j++){
58         row_sum+=x[0][j];
59     }
60     for(i=1;i<n;i++){
61         int current_row=0;
62         for(j=0;j<n;j++){
63             current_row+=x[i][j];
64         }
65         if(current_row!=row_sum)
66         return 0;
67     }
68     for(j=0;j<n;j++){
69         col_sum=0;
70         for(i=0;i<n;i++){
71             col_sum+=x[i][j];
72         }
73         if(col_sum!=row_sum)
74         return 0;
75     }
76     if(main_diag!=row_sum||sub_diag!=row_sum)
77     return 0;
78     
79     return 1;
80 }
View Code

运行结果截图

屏幕截图 2026-04-30 125834

判断方法

满足三个条件:①行列阶数相等②每行元素之和、每列元素之和相等③两条对角线上元素之和等于行列和

posted @ 2026-04-30 13:10  thinkbout  阅读(9)  评论(0)    收藏  举报