实验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 }
![4.1]()
问题1:是连续存放的,值相同。
问题2:是按行连续存放的。x、x【0】、&x【0】【0】的值相同。x【0】和x【1】相差16个字节,含义是二维数组中一行占用的总字节数。
实验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 }
![4.2]()
问题1:形参的书写形式是int x [ ]和int n,实参的书写形式是x,n.
问题2:Input的功能是将输入的n个证书存入到数组x中。compute的功能是计算在去掉最大值和最小值后剩余数的平均值。
实验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 }
![4.3]()
问题1:形参的书写形式为int x[ ][N],int n,实参的书写形式为x,n。
问题2:不能省略
问题3:output的功能是输出一个n行n列的二维数组。而init的功能是将二维数组中所有元素的值都赋值为value。
实验4源代码、截图
1 #include <stdio.h>
2 #define N 100
3
4 void input(int x[], int n);
5 double median(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 = median(x, n);
15 printf("ans = %g\n\n", ans);
16 }
17
18 return 0;
19 }
20
21 void input(int x[], int n){
22 int i;
23 for(i = 0; i < n; i++){
24 scanf("%d", &x[i]);
25 }
26 }
27
28 double median(int x[], int n){
29 int i, j, k;
30 for(i = 0; i < n-1; i++) {
31 for(j = 0; j < n-1-i; j++) {
32 if(x[j] > x[j+1]) {
33 k = x[j];
34 x[j] = x[j+1];
35 x[j+1] = k;
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 }
![4.4]()
实验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 system("pause");
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 void rotate_to_right(int x[][N], int n){
49 int i, j, k;
50 for(i = 0; i < n; i++){
51 k = x[i][n-1];
52 for(j = n-1; j > 0; j--){
53 x[i][j] = x[i][j-1];
54 }
55
56 x[i][0] = k;
57 }
58 }
![4.5]()
实验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, i, cnt = 0;
23
24 do{
25 r = x % n;
26 ans[cnt++] = map[r];
27 x =x / n;
28 }while(x);
29
30 for(i = cnt-1; i >= 0; i--){
31 printf("%c", ans[i]);
32 }
33 printf("\n");
34 }
![4.6]()
实验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 k = n * (n * n + 1) / 2;
51 int c1, c2, c3 = 0, c4 = 0;
52
53 for(i = 0; i < n; i++){
54 c1 =0;
55 for(j = 0; j < n; j++){
56 c1 = c1 + x[i][j];
57 }
58 if(c1 != k)
59 return 0;
60
61 }
62
63 for(j = 0; j < n; j++){
64 c2 = 0;
65 for(i = 0; i < n; i++){
66 c2 = c2 + x[i][j];
67 }
68 if(c2 != k)
69 return 0;
70
71 }
72
73 for(i = 0; i < n; i++){
74 c3 = c3 + x[i][i];
75 }
76 if(c3 != k)
77 return 0;
78
79 for(i = 0; i < n; i++){
80 c4 = c4 + x[i][n-1-i];
81 }
82 if(c4 != k)
83 return 0;
84
85 return 1;
86
87 }
![4.7.1]()
![4.7.2]()