实验四
实验任务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 }
运行截图:

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 }
运行截图:

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 }
运行截图:

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 }
运行截图:

实验任务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 }
运行截图:

实验任务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中的第一反应是
字符串的叠加而并非数组增添元素,但是如果不用数组,对16进制的定义会十分麻烦(通过case11=A,case12=B……)。同时也将我在理论课上
所学到的数组知识进行了实践。
posted on 2025-04-17 00:57 A0809-lemon 阅读(20) 评论(0) 收藏 举报
浙公网安备 33010602011771号