实验4 C语言数组应用编程

实验任务1:

task1.c

源代码:

 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 }   

运行结果:

 

回答问题:

1.是,通常是一样的(当数组作为函数参数时,数组名将退化为指针,此时可能有差异)

2.是,不一样(X表示整个二维数组,X[0]表示二维数组的第一行,&X[0][0]表示二维数组第一行第一列的地址),16个字节,反应二维数组每一行之间的内存间隔,有利于计算行的地址

 

 

实验任务2:

task2.c

源代码:

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

运行结果:

回答问题:

1.input:将用户输入的n个值输入到数组中

2.compute:去掉n个值中最大值和最小值,然后求平均数

 

 

实验任务3:

task2.c

源代码:

 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 }

运行结果:

回答问题:

1.第二维

2.output:输出n阶矩阵;init:定义二维数组的每一个值均为用户输入的value

 

 

实验任务4:

task4.c

源代码:

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

运行结果:

 

 

 

实验任务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_s("%d", &n);
14 
15     input(x, n);
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     for (int i = 0; i < n; ++i) {
29         for (int j = 0; j < n; ++j)
30             scanf_s("%d", &x[i][j]);
31     }
32 }
33 
34 void output(int x[][N], int n) {
35     for (int i = 0; i < n; ++i) {
36         for (int j = 0; j < n; ++j)
37             printf("%4d", x[i][j]);
38         printf("\n");
39     }
40 }
41 
42 void rotate_to_right(int x[][N], int n)
43 {
44     int i, j, a;
45 
46     for (i = 0; i < n; ++i)
47     {
48         a = x[i][n - 1];
49         for (j = n - 1; j > 0; --j)
50         {
51             x[i][j] = x[i][j - 1];
52         }
53         x[i][0] = a;
54     }
55 }

运行结果:

 

 

实验任务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     while (printf("输入十进制整数: "), scanf_s("%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 void dec_to_n(int x, int n) {
18     int b;
19     char a[N];
20     int index = 0;
21 
22     if (x == 0) {
23         printf("0 ");
24         return;
25     }
26 
27     while (x > 0) {
28         b = x % n;
29         if (b < 10) {
30             a[index++] = b + '0';
31         }
32         else {
33             a[index++] = b - 10 + 'A';
34         }
35         x /= n;
36     }
37     int i;
38     for (i = index - 1; i >= 0; i--) {
39         printf("%c", a[i]);
40     }
41     printf("\n");
42 }

运行结果:

 

 

实验任务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_s("%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     for (i = 0; i < n; ++i) {
31         for (j = 0; j < n; ++j)
32             scanf_s("%d", &x[i][j]);
33     }
34 }
35 
36 void output(int x[][N], int n) {
37     int i, j;
38     for (i = 0; i < n; ++i) {
39         for (j = 0; j < n; ++j)
40             printf("%4d", x[i][j]);
41         printf("\n");
42     }
43 }
44 
45 int is_magic(int x[][N], int n) {
46     int i, j, d0 = 0;
47     int d3 = 0, d4 = 0;
48 
49     for (i = 0; i < n; i++) {
50         for (j = 0; j < n; j++) {
51             if (x[i][j] < 1 || x[i][j] > n * n)
52                 return 0;
53         }
54     }
55 
56     for (i = 0; i < n; i++) {
57         for (j = 0; j < n - 1; j++) {
58             for (int m = j + 1; m < n; m++) {
59                 if (x[i][j] == x[i][m])
60                     return 0;
61             }
62         }
63     }
64 
65     for (int f = 0; f < n; f++) {
66         d0 += x[0][f];
67     }
68 
69     for (i = 0; i < n; i++) {
70         int d1 = 0;
71         for (j = 0; j < n; j++) {
72             d1 += x[i][j];
73         }
74         if (d1 != d0)
75             return 0;
76     }
77 
78     for (i = 0; i < n; i++) {
79         int d2 = 0;
80         for (j = 0; j < n; j++) {
81             d2 += x[j][i];
82         }
83         if (d2 != d0)
84             return 0;
85     }
86 
87     for (i = 0; i < n; i++)
88         d3 += x[i][i];
89     if (d3 != d0)
90         return 0;
91 
92     for (i = 0; i < n; i++)
93         d4 += x[i][n - 1 - i];
94     if (d4 != d0)
95         return 0;
96 
97     return 1;
98 }

运行结果:

 

posted @ 2024-11-10 17:56  陈沫*  阅读(6)  评论(0编辑  收藏  举报