实验文档4

关于第四次实践课作业

实验结论

task1.c

验证数组的特性:类型相同、有序存放

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.h>
 3 #define N 4
 4 #define M 2
 5 void test1();
 6 void test2();
 7 int main()
 8 {
 9     printf("测试1:int型一维数组\n");
10     test1();
11     
12     printf("\n测试2:int型二维数组\n");
13     test2();
14 
15     return 0;
16 }
17 void test1() {
18     int x[N] = { 1,9,8,4 };
19     int i;
20     //输入数组x占用的内存字节数
21     printf("sizeof(x)=%d\n", sizeof(x));
22     //输入每个元素的地址,值
23     for (i = 0; i < N; i++) {
24         printf("%p;%d\n", &x[i], x[i]);
25     }
26     //输入数组名x对应的值
27     printf("x=%p\n", x);
28 
29 }
30 void test2() {
31     int x[M][N] = {
32         {1,9,8,4},
33         {2,0,4,9}
34     };
35     int i,j;
36     //输入二维数组x占用的内存字节数
37     printf("sizeof(x)=%d\n", sizeof(x));
38     //输入每个元素的地址,值
39     for (i = 0; i < M; i++) {
40         for (j = 0; j < N; j++) {
41             printf("%p:%d\n", &x[i][j], x[i][j]);
42         }
43         printf("\n");
44     }
45     //输入二维数组x,以及,x[0],x[1]的值
46     printf("x=%p\n", x);
47     printf("x[0]=%p\n", x[0]);
48     printf("x[1]=%p\n", x[1]);
49     printf("\n");
50 }

question1:int型一维数组x,在内存中是否是连续存放的?数组名x对应的值,和&x[0]是一样的吗?

answer1:是,是

question2:int型二维数组x,在内存中是否是"按行连续存放"的?数组名x的值、x[0]、&x[0][0],其 值,在字面上,是一样的吗?x[0]和x[1]相差多少?你能猜测/推断出这个差值的意义吗?

answer2:是,是;x[0]和x[1]相差16个字节,

这个差值代表着列数N*sizeof(数据类型)

 

 

task2.c

验证一维数组作为函数形参的用法

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

question1:一维数组作为形参时,其书写形式?实参的书写形式?

answer1:形参的书写形式是x[]([]必须存在)

       实参的书写形似是x([]不必存在)

question2:函数input的功能是?函数compute的功能是? 

answer2:函数input的功能是从用户端读入数值

     函数compute的功能是在去掉最大值,最小值的情况下

     计算读入数据的平均值

 

 

task3.c

验证二维数组作为函数形参的用法

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 #define N 100
 4 void output(int x[][N], int n);
 5 void init(int x[][N], int n, int value);
 6 int main()
 7 {
 8     int x[N][N];
 9     int n, value;
10     while (printf("Enter n and value:"), scanf("%d %d", &n, &value) != EOF){
11         init(x, n, value);
12         output(x, n);
13         printf("\n");
14     }
15     return 0;
16 }
17 void output(int x[][N], int n) {
18     for (int i = 0; i < n; i++) {
19         for (int j = 0; j < n; j++) {
20             printf("%d ", x[i][j]);
21         }
22         printf("\n");
23     }
24 }
25 void init(int x[][N], int n, int value) {
26     for (int i = 0; i < n; i++) {
27         for (int j = 0; j < n; j++) {
28             x[i][j] = value;
29         }
30     }
31 }

question1:两维数组作为函数形参时,形参的书写形式?实参的书写形式?

answer1:  形参的书写形式是x[][N](必须写出列数)

    实参的书写形式是x(直接给出函数名即可)

question2:两维数组作为函数形参时,哪一维的大小不能省略?

answer2:  第二维(即列数)不能省略

 

question3:函数output功能是?函数init的功能是? 

answer3:  函数output功能是以矩阵的形式逐个输出数组中的值

      函数init的功能是给数组中的每一个元素都赋以value的值

 

 

task4.c

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

 

 

task5.c

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 #define N 100
 4 
 5 void input(int x[][N], int n);
 6 void output(int x[][N], int n);
 7 void rotate_to_right(int x[][N], int n);
 8 int main()
 9 {
10     int x[N][N],n;
11     printf("Enter n:");
12     scanf("%d", &n);
13     input(x, n);
14     printf("原始矩阵:\n");
15     output(x, n);
16     rotate_to_right(x, n);
17     printf("变换后矩阵:\n");
18     output(x, n);
19     return 0;
20 }
21 void rotate_to_right(int x[][N], int n) {
22     for (int i = 0; i < n; i++) {
23         int temp = x[i][n - 1];
24         for (int j = n-1; j > 0; j--) {
25             x[i][j] = x[i][j - 1];
26         }
27         x[i][0] = temp;
28     }
29 }
30 void input(int x[][N], int n) {
31     for (int i = 0; i < n; i++) {
32         for (int j = 0; j < n; j++) {
33             scanf("%d", &x[i][j]);
34         }
35     }
36 }
37 void output(int x[][N], int n) {
38     for (int i = 0; i < n; i++) {
39         for (int j = 0; j < n; j++) {
40             printf("%4d", x[i][j]);
41         }
42         printf("\n");
43     }
44 }
45     

 

 

task6.c

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 #define N 100
 4 void dec_to_n(int x, int n);
 5 int main()
 6 {
 7     int x;
 8     while (printf("输入十进制整数:"), scanf("%d", &x) != EOF) {
 9         dec_to_n(x, 2);
10         printf("\n");
11         dec_to_n(x, 8);
12         printf("\n");
13         dec_to_n(x, 16);
14         printf("\n\n");
15     }
16     return 0;
17 }
18 void dec_to_n(int x, int n) {
19     int num[N];
20     int i = 0,cnt=0;
21     while (x != 0) {
22         int r = x % n;
23         num[i++] = r;
24         x /= n;
25         cnt++;
26     }
27     for (int i = cnt-1; i >= 0; i--) {
28         if (num[i] < 10) {
29             printf("%d", num[i]);
30         }
31         else {
32             printf("%c", 'A' + num[i] - 10);
33         }
34     }
35 }

 

 Tips: 1. 十进制整数 --> n进制数,算法层面:除以n, 取余数,直到商为0。 算法思路如下图所示。

2. 注意点
① 循环终止条件 —— 商为0;
② 转换后的进制数据,即余数,要倒着写上去 --> 如何处理?
—> 借助数组,把计算出来的余数保存到数组中,并通过计数,记录余数个数,然后,从后往前输出,直到输出第0个元素。
③ 十六进制,当余数是10~15时,对应字符'A'-'F', 如何处理?

 

 

task7.c

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 #define N 100
 4 void input(int x[][N], int n);
 5 void output(int x[][N], int n);
 6 int magic(int x[][N], int n);
 7 int main()
 8 {
 9     int x[N][N];
10     int n;
11     while (printf("Enter n:"), scanf("%d", &n) != EOF) {
12         printf("输入方阵:\n");
13         input(x, n);
14 
15         printf("输出方阵:\n");
16         output(x, n);
17 
18         if (magic(x, n)) {
19             printf("是魔方矩阵\n\n");
20         }
21         else {
22             printf("不是魔方矩阵\n\n");
23         }
24     }
25     return 0;
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("%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         }
39         printf("\n");
40     }
41 }
42 int magic(int x[][N], int n) {
43     int sum[N];
44     int k = 0;
45     for (int i = 0; i < n; i++) {
46         for (int j = 0; j < n; j++) {
47             sum[k] += x[i][j];
48         }
49         k++;
50     }
51     for (int j = 0; j < n; j++) {
52         for (int i = 0; i < n; i++) {
53             sum[k] += x[i][j];
54         }
55         k++;
56     }
57     for (int i = 0; i < n; i++) {
58         sum[k++] += x[i][i];
59     }
60     for (int i = n-1; i >= 0; i--) {
61         sum[k] += x[i][i];
62     }
63     for (int i = 0; i < 2 * n - 2; i++) {
64         if (sum[i] != sum[i + 1]) {
65             return 0;
66         }
67     }
68     return 1;
69 }

 

 

task8.c

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 #include<math.h>
 4 #define N 100
 5 int line(int m);
 6 int main()
 7 {
 8     for (int m = 2;; ++m) {
 9         int ans=line(m);
10         if (ans) {
11             printf("%d", m);
12             return 0;
13         }
14     }
15     
16 }
17 int line(int m) {
18     int x = pow(m, 2);
19     int y = pow(m, 3);
20     int j = 0;
21     int all[N];
22     do {
23         all[j++] = x % 10;
24         x /= 10;
25     } while (x != 0);
26     do {
27         all[j++] = y % 10;
28         y /= 10;
29     } while (y != 0);
30     for (int i = 0; i < j; ++i) {
31         for (int k = 0; k < j - 1 - i; ++k) {
32             if (all[k] > all[k + 1]) {
33                 int temp = all[k];
34                 all[k] = all[k + 1];
35                 all[k + 1] = temp;
36             }
37         }
38     }
39     for (int i = 0; i < j; i++) {
40         if (all[i] != i) {
41             return 0;
42         }
43     }
44     return 1;
45 
46 }

 

实验总结

1.编程时可以通过编写函数使代码的实现更加简单

2.利用sizeof输出变量占用的内存字节数;

利用%p输出变量所在的地址(记得加上取地址符&)

数组中的元素在内存中连续存放,且数组名x对应的值和X[0]的地址一致

3.将16进制中的10~15转换为对应字符‘A’~‘F’可以采用‘A’+x-10的方式

posted @ 2024-11-04 09:39  知返返返  阅读(16)  评论(0编辑  收藏  举报