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

问题1:一维数组x在内存中连续存放;x和&x[0]的值相同。
问题2:二维数组x在内存中按行连续存放;x、x[0]和&x[0][0]的值相同;x[0]和x[1]相差16;该差值的
含义是一行有4个数的数组所占内存空间。
task2
1 #include <stdio.h> 2 #define N 100 3 // 函数声明 4 void input(int x[], int n); 5 double compute(int x[], int n); 6 int main() { 7 int x[N]; 8 int n, i; 9 double ans; 10 while(printf("Enter n: "), scanf("%d", &n) != EOF) { 11 input(x, n); // 函数调用 12 ans = compute(x, n); // 函数调用 13 printf("ans = %.2f\n\n", ans); 14 } 15 return 0; 16 } 17 // 函数定义 18 void input(int x[], int n) { 19 int i; 20 for(i = 0; i < n; ++i) 21 scanf("%d", &x[i]); 22 } 23 // 函数定义 24 double compute(int x[], int n) { 25 int i, high, low; 26 double ans; 27 high = low = x[0]; 28 ans = 0; 29 for(i = 0; i < n; ++i) { 30 ans += x[i]; 31 if(x[i] > high) 32 high = x[i]; 33 else if(x[i] < low) 34 low = x[i]; 35 } 36 ans = (ans - high - low)/(n-2); 37 return ans; 38 }

问题1:一维数组作为参数时(以input函数为例),形参、实参书写形式分别是:input(int x[], int n);input(x,n)。
问题2:函数input的功能是输入并存储数组x中的n个数值;函数compute的功能是计算数组x中去掉最大值最小值后的平均值。
task3
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 int main() { 7 int x[N][N]; 8 int n, value; 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 // 函数定义 17 void output(int x[][N], int n) { 18 int i, j; 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 // 函数定义 26 void init(int x[][N], int n, int value) { 27 int i, j; 28 for(i = 0; i < n; ++i) 29 for(j = 0; j < n; ++j) 30 x[i][j] = value; 31 }
问题1:两维数组作为函数参数时(以函数output为例),形参、实参书写形式分别是output(int x[][N], int n);output(x, n)。
问题2:两维数组作为函数形参时,第二维大小不能省略不写;
问题3:函数output的功能是打印两维数组x中的所有元素;函数init的功能是将两维数组x中的每个元素赋值为value。
task4
1 #include <stdio.h> 2 #define N 100 3 double median(int x[],int n); 4 void input(int x[],int n); 5 int main() { 6 int x[N]; 7 int n; 8 double ans; 9 while(printf("Enter n: "), scanf("%d", &n) != EOF) { 10 input(x, n); // 函数调用 11 ans = median(x, n); // 函数调用 12 printf("ans = %g\n\n", ans); 13 } 14 return 0; 15 } 16 17 void input(int x[],int n){ 18 for(int i=0;i<n;++i) 19 scanf("%d",&x[i]); 20 for(int i=0;i<n-1;++i) 21 for(int j=0;j<n-1-i;++j) 22 if(x[j]>x[j+1]){ 23 int temp=x[j]; 24 x[j]=x[j+1]; 25 x[j+1]=temp; 26 } 27 28 } 29 double median(int x[],int n){ 30 double avg; 31 if(n%2==0){ 32 avg=(x[n/2-1]+x[n/2])/2.0; 33 } 34 else if(n%2!=0){ 35 avg=x[n/2]; 36 } 37 return avg; 38 }

task5
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 int main() { 8 int x[N][N]; 9 int n; 10 printf("Enter n: "); 11 scanf("%d", &n); 12 input(x, n); 13 printf("原始矩阵:\n"); 14 output(x, n); 15 rotate_to_right(x,n); 16 printf("变换后矩阵:\n"); 17 output(x, n); 18 return 0; 19 } 20 // 函数定义 21 // 功能: 输入一个n*n的矩阵x 22 void input(int x[][N], int n) { 23 int i, j; 24 25 for (i = 0; i < n; ++i) { 26 for (j = 0; j < n; ++j) 27 scanf("%d", &x[i][j]); 28 } 29 } 30 // 函数定义 31 // 功能: 输出一个n*n的矩阵x 32 void output(int x[][N], int n) { 33 int i, j; 34 for (i = 0; i < n; ++i) { 35 for (j = 0; j < n; ++j) 36 printf("%4d", x[i][j]); 37 printf("\n"); 38 } 39 } 40 // 函数rotate_to_right定义 41 // 功能: 把一个n*n的矩阵x,每一列向右移, 最右边一列绕回左边 42 void rotate_to_right(int x[][N],int n){ 43 int temp[n][1]; 44 for(int i=0;i<n;++i) 45 temp[i][0]=x[i][n-1]; 46 for(int i=n-1;i>0;--i) 47 for(int j=0;j<n;++j) 48 x[j][i]=x[j][i-1]; 49 for(int i=0;i<n;++i) 50 x[i][0]=temp[i][0]; 51 }

task6
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("%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 18 void dec_to_n(int x, int n) { 19 int yu, i = 0; 20 int y[N]; 21 int temp = x; 22 23 while (temp != 0) { 24 yu = temp % n; 25 y[i++] = yu; 26 temp = temp / n; 27 } 28 29 30 for (int j = i - 1; j >= 0; j--) { 31 if (y[j] >= 10) { 32 printf("%c", 'A' + y[j] - 10); 33 } 34 else { 35 printf("%d", y[j]); 36 } 37 } 38 printf("\n"); 39 }

task7
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 for(i = 0;i < n; ++i){ 40 for(j = 0;j < n; ++j) 41 printf("%4d",x[i][j]); 42 43 printf("\n"); 44 } 45 } 46 47 int is_magic(int x[][N],int n){ 48 int i,j; 49 int sum; 50 for (i = 0; i < n; i++) { 51 for (j = 0; j < n; j++) { 52 int a = x[i][j]; 53 for (int k = i; k < n; k++) { 54 int b = (k == i) ? (j + 1) : 0; 55 for (int l = b; l < n; l++) { 56 if (x[k][l] == a) { 57 return 0; 58 } 59 } 60 } 61 } 62 } 63 for(i=0;i<n;i++) 64 sum+=x[0][i]; 65 for(i=1;i<n;i++){ 66 int hang=0; 67 for(j=0;j<n;j++){ 68 hang += x[i][j]; 69 } 70 if(sum!=hang){ 71 return 0; 72 } 73 } 74 for(i=0;i<n;i++){ 75 int lie=0; 76 for(j=0;j<n;j++){ 77 lie += x[j][i]; 78 } 79 if(sum!=lie){ 80 return 0; 81 } 82 } 83 int diag1=0; 84 for(i=0;i<n;i++){ 85 diag1+=x[i][i]; 86 } 87 if(sum!=diag1){ 88 return 0; 89 } 90 int diag2=0; 91 for(i=0;i<n;i++){ 92 diag2+=x[i][n-1-i]; 93 } 94 if(sum!=diag2){ 95 return 0; 96 } 97 return 1; 98 }




浙公网安备 33010602011771号