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

3.问题回答:
(1)是连续存放;相同
(2)是按行连续存放;差16字节;差值表示二维数组一行占用的内存字节数
实验任务2:
1.源代码:
1 #include <stdio.h> 2 #define N 100 3 void input(int x[], int n); 4 double compute(int x[], int n); 5 int main() { 6 int x[N]; 7 int n, i; 8 double ans; 9 while (printf("Enter n: "), scanf_s("%d", &n) != EOF) { 10 input(x, n); 11 ans = compute(x, n); 12 printf("ans = %.2f\n\n", ans); 13 } 14 return 0; 15 } 16 void input(int x[], int n) { 17 int i; 18 for (i = 0; i < n; ++i) 19 scanf_s("%d", &x[i]); 20 } 21 double compute(int x[], int n) { 22 int i, high, low; 23 double ans; 24 high = low = x[0]; 25 ans = 0; 26 for (i = 0; i < n; ++i) { 27 ans += x[i]; 28 if (x[i] > high) 29 high = x[i]; 30 else if (x[i] < low) 31 low = x[i]; 32 } 33 ans = (ans - high - low) / (n - 2); 34 return ans; 35 }
2.运行结果截图:

3.问题回答:
(1)形参:void input(int x[ ] ,int n);实参:input(x,n)、
(2)input:输入n个整数到数组x中;compute:这组数去掉最大值和最小值取平均值
实验任务3:
1.源代码:
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_s("%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 // 函数定义2 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 }
2.运行结果截图:

3.问题回答:
(1)形参:output (int x[ ][N], int n);实参:output (x, n)
(2)不能省略,必须确定第二维长度,不然会报错
(3)output:按行输出n*n的二维数组元素;init:将这些元素赋值为指定值value
实验任务4:
1.源代码:
1 #include <stdio.h> 2 #define N 100 3 void input(int x[], int n); 4 double middle(int x[], int n); 5 int main() { 6 int x[N]; 7 int n; 8 double ans; 9 while (printf("Enter n: "), scanf_s("%d", &n) != EOF) { 10 input(x, n); 11 ans = middle(x, n); 12 printf("ans = %g\n\n", ans); 13 } 14 return 0; 15 } 16 17 void input(int x[], int n) { 18 int i; 19 for (i = 0; i < n; i++) { 20 scanf_s("%d", &x[i]); 21 } 22 } 23 double middle(int x[], int n) { 24 int i, j, temp; 25 for (i = 0; i < n - 1; i++) { 26 for (j = 0; j < n - i - 1; j++) { 27 if (x[j] > x[j + 1]) { 28 temp = x[j]; 29 x[j] = x[j + 1]; 30 x[j + 1] = temp; 31 } 32 } 33 } 34 if (n % 2 == 1) { 35 return x[n / 2]; 36 } 37 else { 38 return (x[n / 2 - 1] + x[n / 2]) / 2.0; 39 } 40 }
2.运行结果截图:

实验任务5:
1.源代码:
1 #include <stdio.h> 2 #define N 100 3 void input(int x[][N], int n); 4 void output(int x[][N], int n); 5 void rotate_to_right(int x[][N], int n); 6 int main() { 7 int x[N][N]; 8 int n; 9 printf("Enter n: "); 10 scanf_s("%d", &n); 11 input(x, n); 12 13 printf("原始矩阵:\n"); 14 output(x, n); 15 rotate_to_right(x, n); 16 17 printf("变换后矩阵:\n"); 18 output(x, n); 19 return 0; 20 } 21 void input(int x[][N], int n) { 22 int i, j; 23 24 for (i = 0; i < n; ++i) { 25 for (j = 0; j < n; ++j) 26 scanf_s("%d", &x[i][j]); 27 } 28 } 29 void output(int x[][N], int n) { 30 int i, j; 31 32 for (i = 0; i < n; ++i) { 33 for (j = 0; j < n; ++j) 34 printf("%4d", x[i][j]); 35 36 printf("\n"); 37 } 38 } 39 void rotate_to_right(int x[][N], int n) { 40 int i, j; 41 int temp[N]; 42 for (i = 0; i < n; i++) { 43 temp[i] = x[i][n - 1]; 44 } 45 for (j = n - 1; j > 0; j--) { 46 for (i = 0; i < n; i++) { 47 x[i][j] = x[i][j - 1]; 48 } 49 } 50 for (i = 0; i < n; i++) { 51 x[i][0] = temp[i]; 52 } 53 }
2.运行结果截图:

实验任务6:
1.源代码:
1 #include <stdio.h> 2 #define N 100 3 void dec_to_n(int x, int n); // 函数声明 4 int main() { 5 int x; 6 7 while(printf("输入十进制整数: "), scanf("%d", &x) != EOF) { 8 dec_to_n(x, 2); // 函数调用: 把x转换成二进制输出 9 dec_to_n(x, 8); // 函数调用: 把x转换成八进制输出 10 dec_to_n(x, 16); // 函数调用: 把x转换成十六进制输出 11 12 printf("\n"); 13 } 14 15 return 0; 16 } 17 18 void dec_to_n(int x,int n){ 19 if(x==0){ 20 printf("0\n"); 21 return; 22 } 23 char YS[N]; 24 int i = 0; 25 int fs = 0; 26 if(x < 0){ 27 fs = 1; 28 x=-x; 29 } 30 while(x > 0){ 31 int ys =x % n; 32 if(ys < 10) 33 YS[i++]=ys+'0'; 34 else 35 YS[i++]=ys+'A'-10; 36 x = x/n; 37 } 38 if(fs) 39 printf("-"); 40 int j=i-1; 41 for(j;j>=0;j--) 42 printf("%c",YS[j]); 43 printf("\n"); 44 }
2.运行效果截图:

实验任务7:
1.源代码
1 #include <stdio.h> 2 #define N 100 3 void input(int x[][N], int n); 4 void output(int x[][N], int n); 5 int is_magic(int x[][N], int n); 6 int main() { 7 int x[N][N]; 8 int n; 9 while (printf("输入n: "), scanf_s("%d", &n) != EOF) 10 { 11 printf("输入方阵:\n"); 12 input(x, n); 13 14 printf("输出方阵:\n"); 15 output(x, n); 16 17 if (is_magic(x, n)) 18 printf("是魔方矩阵\n\n"); 19 else 20 printf("不是魔方矩阵\n\n"); 21 } 22 return 0; 23 } 24 void input(int x[][N], int n) { 25 int i, j; 26 for (i = 0; i < n; ++i) { 27 for (j = 0; j < n; ++j) 28 scanf_s("%d", &x[i][j]); 29 } 30 } 31 void output(int x[][N], int n) { 32 int i, j; 33 for (i = 0; i < n; ++i) { 34 for (j = 0; j < n; ++j) 35 printf("%4d", x[i][j]); 36 printf("\n"); 37 } 38 } 39 int is_magic(int x[][N], int n) { 40 int magic_sum = n * (n * n + 1) / 2; 41 int sum_row = 0, sum_col = 0, sum_diag1 = 0, sum_diag2 = 0; 42 int i, j; 43 for (i = 0; i < n; i++) { 44 sum_row = 0; 45 for (j = 0; j < n; j++) { 46 sum_row += x[i][j]; 47 } 48 if (sum_row != magic_sum) { 49 return 0; 50 } 51 } 52 for (j = 0; j < n; j++) { 53 sum_col = 0; 54 for (i = 0; i < n; i++) { 55 sum_col += x[i][j]; 56 } 57 if (sum_col != magic_sum) { 58 return 0; 59 } 60 } 61 for (i = 0; i < n; i++) { 62 sum_diag1 += x[i][i]; 63 } 64 if (sum_diag1 != magic_sum) { 65 return 0; 66 } 67 for (i = 0; i < n; i++) { 68 sum_diag2 += x[i][n - 1 - i]; 69 } 70 if (sum_diag2 != magic_sum) { 71 return 0; 72 } 73 return 1; 74 }
2.运行结果截图:

3.解释说明:
先算出魔方矩阵的标准幻和,再依次检查每行、每列、两条对角线的和是否都等于这个幻和,全部符合就是魔方矩阵,返回1,否则就不是,返回0

浙公网安备 33010602011771号