A-0809-lemon

导航

实验四

实验任务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     printf("sizeof(x) = %d\n", sizeof(x)); 
 9     for (i = 0; i < N; ++i)
10         printf("%p: %d\n", &x[i], x[i]);
11     printf("x = %p\n", x); 
12 }
13 
14 void test2() {
15     int x[M][N] = {{1, 9, 8, 4}, {2, 0, 4, 9}};
16     int i, j;
17     printf("sizeof(x) = %d\n", sizeof(x));
18     for (i = 0; i < M; ++i)
19         for (j = 0; j < N; ++j)
20             printf("%p: %d\n", &x[i][j], x[i][j]);
21     printf("\n");
22     printf("x = %p\n", x);
23     printf("x[0] = %p\n", x[0]);
24     printf("x[1] = %p\n", x[1]);
25     printf("\n");
26 }
27 
28 int main() {
29     printf("测试1: int型一维数组\n");
30     test1();
31 
32     printf("\n测试2: int型二维数组\n");
33     test2();
34 
35     return 0;
36 }
实验任务1

运行截图:

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

A1:是连续存放的,地址位差4;数组名x对应的值与&x[0]是一样的。

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

A2:是的,先行后列;x的值、x[0]、&x[0][0],三者的值在字⾯上是⼀样的。x[0],x[1]相差16;指一行中有4个中间项,地址上差了16个位数。

 

实验任务2

源代码:

 1 #include <stdio.h>
 2 #define N 100
 3 void input(int x[], int n);
 4 double compute(int x[], int n);
 5 
 6 int main() {
 7     int x[N];
 8     int n, i;
 9     double ans;
10 
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 
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 compute(int x[], int n) {
28     int i, high, low;
29     double ans;
30 
31     high = low = x[0];
32     ans = 0;
33 
34     for(i = 0; i < n; ++i) {
35         ans += x[i];
36 
37         if(x[i] > high)
38             high = x[i];
39         else if(x[i] < low)
40             low = x[i];
41     }
42 
43     ans = (ans - high - low)/(n-2);
44 
45     return ans;
46 }
实验任务2

运行截图:

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

A:数组定义形式为函数的形参,数组名作为函数实参;

 

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

A:自己选择n的取值,input可以将键盘上输入的n个数字存储到数组中,保存起来;compute择将数组中的各元素累加,最后除以n取平均值。

 

实验任务3

源代码:

 1 #include <stdio.h>
 2 #define N 100
 3 void output(int x[][N], int n);
 4 void init(int x[][N], int n, int value);
 5 int main() {
 6     int x[N][N];
 7     int n, value;
 8 
 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 void output(int x[][N], int n) {
17     int i, j;
18 
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 void init(int x[][N], int n, int value) {
26     int i, j;
27 
28     for(i = 0; i < n; ++i)
29         for(j = 0; j < n; ++j)
30             x[i][j] = value;
31 }
实验任务3

运行截图:

 

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

A:二维数组中,形参为数组定义形式,但是必须指定列数,数组名作为函数实参;

Q1:两维数组作为函数形参时,哪⼀维的⼤⼩不能省略? 

A1:列数那一维不可以省略;

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

A2:init定义好n×n的二维数组,并将数组中每一个元素赋好值;output则是将二维数组以矩阵的形式打印出来;

 

实验任务4

源代码:

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

运行截图:

 

 

实验任务5

源代码:

 1 #include <stdio.h>
 2 #define N 100
 3 
 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 
 9 int main() {
10     int x[N][N];
11     int n;
12 
13     printf("输入n: "); 
14     scanf("%d", &n);
15     input(x, n);
16 
17     printf("原始矩阵:\n");
18     output(x, n);
19 
20     rotate_to_right(x,n);
21 
22     printf("变换后矩阵:\n");
23     output(x, n);
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 void rotate_to_right(int x[][N], int n){
49     int i,j,r;
50     for(j=0;j<n;++j){
51         r=x[j][n-1];
52         for(i=n-1;i>0;--i){
53             x[j][i]=x[j][i-1];
54         }
55         x[j][0]=r;
56     }
57 
58 }
实验任务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         printf("对应的二进制整数为:\n");
10         dec_to_n(x, 2);  
11         printf("对应的八进制整数为:\n");
12         dec_to_n(x, 8);  
13         printf("对应的十六进制整数为:\n");
14         dec_to_n(x, 16); 
15 
16         printf("\n");
17     }
18 
19     return 0;
20 }
21 void dec_to_n(int x, int n){
22     char map[]="0123456789ABCDEF";
23     char ans[N];
24     int d,r;
25     int i=0;
26     while(1){
27         r=x%n;
28         d=x/n;
29         ans[i++]=map[r];
30 
31         if(d==0)
32             break;
33 
34         x=d;
35     
36     }
37     for(--i;i>=0;--i)
38         printf("%c",ans[i]);
39     printf("\n");
40 }
实验任务6

运行截图:

 

实验总结:本次实验侧重点在于对数组的定义以及应用,在本次实验中打破了我对计算机程序语言常规的惯性思维,例如实验6中的第一反应是

字符串的叠加而并非数组增添元素,但是如果不用数组,对16进制的定义会十分麻烦(通过case11=A,case12=B……)。同时也将我在理论课上

所学到的数组知识进行了实践。

posted on 2025-04-17 00:57  A0809-lemon  阅读(20)  评论(0)    收藏  举报