实验4

task1

 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     // 输出数组x占用的内存字节数
 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     // 输出数组名x对应的值 
13     printf("x = %p\n", x); 
14 }
15 void test2() {
16      int x[M][N] = {{1, 9, 8, 4}, {2, 0, 4, 9}};
17      int i, j;
18      // 输出二维数组x占用的内存字节数
19      printf("sizeof(x) = %d\n", sizeof(x));
20      // 输出每个元素的地址、值 
21     for (i = 0; i < M; ++i)
22         for (j = 0; j < N; ++j)
23             printf("%p: %d\n", &x[i][j], x[i][j]);
24      printf("\n");
25     // 输出二维数组名x, 以及,x[0], x[1]的值
26     printf("x = %p\n", x);
27     printf("x[0] = %p\n", x[0]);
28     printf("x[1] = %p\n", x[1]);
29     printf("\n");
30 }
31 int main() {
32     printf("测试1: int型一维数组\n");
33     test1();
34     printf("\n测试2: int型二维数组\n");
35     test2();
36      return 0;
37 }

image

问题1:一维数组x在内存中连续存放;x和&x[0]的值相同。

问题2:二维数组x在内存中按行连续存放;x、x[0]和&x[0][0]的值相同;x[0]和x[1]相差16;该差值的

含义是一行有4个数的数组所占内存空间。

task2

 1 #include <stdio.h>
 2 #define N 100
 3 // 函数声明
 4 void input(int x[], int n);
 5 double compute(int x[], int n);
 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 // 函数定义
18 void input(int x[], int n) {
19     int i;
20     for(i = 0; i < n; ++i)
21         scanf("%d", &x[i]);
22 }
23 // 函数定义
24 double compute(int x[], int n) {
25     int i, high, low;
26     double ans;
27     high = low = x[0];
28     ans = 0;
29      for(i = 0; i < n; ++i) {
30         ans += x[i];
31          if(x[i] > high)
32             high = x[i];
33         else if(x[i] < low)
34             low = x[i];
35     }
36      ans = (ans - high - low)/(n-2);
37     return ans;
38 }

image

问题1:一维数组作为参数时(以input函数为例),形参、实参书写形式分别是:input(int x[], int n);input(x,n)。

问题2:函数input的功能是输入并存储数组x中的n个数值;函数compute的功能是计算数组x中去掉最大值最小值后的平均值。

task3

 

 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 int main() {
 7     int x[N][N];
 8     int n, value;
 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 // 函数定义
17 void output(int x[][N], int n) {
18     int i, j;
19     for(i = 0; i < n; ++i) {
20         for(j = 0; j < n; ++j)
21             printf("%d ", x[i][j]);
22         printf("\n");
23     }
24 }
25 // 函数定义
26 void init(int x[][N], int n, int value) {
27     int i, j;
28     for(i = 0; i < n; ++i)
29         for(j = 0; j < n; ++j)
30             x[i][j] = value;
31 }

image 

问题1:两维数组作为函数参数时(以函数output为例),形参、实参书写形式分别是output(int x[][N], int n);output(x, n)。

 

问题2:两维数组作为函数形参时,第二维大小不能省略不写;

问题3:函数output的功能是打印两维数组x中的所有元素;函数init的功能是将两维数组x中的每个元素赋值为value。

 

task4

 

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

 

image

 

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 int main() {
 8     int x[N][N];
 9     int n;
10     printf("Enter n: ");
11     scanf("%d", &n);
12     input(x, n);
13     printf("原始矩阵:\n");
14     output(x, n);
15      rotate_to_right(x,n);
16      printf("变换后矩阵:\n");
17      output(x, n);
18     return 0;
19 }
20 // 函数定义
21 // 功能: 输入一个n*n的矩阵x
22 void input(int x[][N], int n) {
23      int i, j;
24     
25     for (i = 0; i < n; ++i) {
26         for (j = 0; j < n; ++j)
27             scanf("%d", &x[i][j]);
28     }
29 }
30 // 函数定义
31 // 功能: 输出一个n*n的矩阵x
32 void output(int x[][N], int n) {
33      int i, j;
34     for (i = 0; i < n; ++i) {
35         for (j = 0; j < n; ++j)
36             printf("%4d", x[i][j]);
37         printf("\n");
38     }
39 }
40 // 函数rotate_to_right定义
41 // 功能: 把一个n*n的矩阵x,每一列向右移, 最右边一列绕回左边
42 void rotate_to_right(int x[][N],int n){
43     int temp[n][1];
44     for(int i=0;i<n;++i)
45         temp[i][0]=x[i][n-1];
46     for(int i=n-1;i>0;--i)
47         for(int j=0;j<n;++j)
48             x[j][i]=x[j][i-1];
49     for(int i=0;i<n;++i)
50         x[i][0]=temp[i][0];    
51 }

 

image

 

task6

 

 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     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         printf("\n");
13     }
14     return 0;
15 }
16 
17 
18 void dec_to_n(int x, int n) {
19     int yu, i = 0;
20     int y[N]; 
21     int temp = x; 
22     
23     while (temp != 0) {
24         yu = temp % n;
25         y[i++] = yu;
26         temp = temp / n;
27     }
28     
29     
30     for (int j = i - 1; j >= 0; j--) {
31         if (y[j] >= 10) { 
32             printf("%c", 'A' + y[j] - 10);
33         } 
34         else {
35             printf("%d", y[j]);
36         }
37     }
38     printf("\n");
39 }

 

image

task7

 

 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     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 is_magic(int x[][N],int n){         
48     int i,j;
49     int sum;
50     for (i = 0; i < n; i++) {
51         for (j = 0; j < n; j++) {
52             int a = x[i][j];
53             for (int k = i; k < n; k++) {
54                 int b = (k == i) ? (j + 1) : 0;
55                 for (int l = b; l < n; l++) {
56                     if (x[k][l] == a) {
57                         return 0; 
58                     }
59                 }
60             }
61         }
62     }
63     for(i=0;i<n;i++)
64         sum+=x[0][i];
65     for(i=1;i<n;i++){
66         int hang=0;
67         for(j=0;j<n;j++){    
68             hang += x[i][j];
69         }
70         if(sum!=hang){
71             return 0;
72         }
73     }
74     for(i=0;i<n;i++){
75         int lie=0;
76         for(j=0;j<n;j++){    
77             lie += x[j][i];
78         }
79         if(sum!=lie){
80             return 0;
81         }
82     }
83     int diag1=0;
84     for(i=0;i<n;i++){
85         diag1+=x[i][i];
86     }
87     if(sum!=diag1){
88         return 0;
89     }
90     int diag2=0;
91     for(i=0;i<n;i++){
92         diag2+=x[i][n-1-i];
93     }
94     if(sum!=diag2){
95         return 0;
96     }    
97     return 1;
98 }

 

image

image

image

image

 

 

 

 

 

 

posted @ 2025-11-11 20:00  屑乃  阅读(8)  评论(0)    收藏  举报