实验四
任务一
问题一:是连续存放的,x和&x【0】的值完全相同,数组名x就代表数组第一个元素的地址,&x【0】表示的就是第一个元素的地址
问题二:是连续的,三个值完全相等,都表示二维数组的第一个地址。x【0】和x【1】相差16字节,这个差值代表二维数组一行有4个int元素
任务二
问题一:形参:void input(int x[] ,int n);实参:input(x,n)
问题二:input作用是输入n个整数到数组;compute的功能是去掉最高分和最低分,让后求平均分。
任务三
问题一:形参:void output(int x[][N],int n);实参output(x,n)
问题二:第二维大小不能省略,改成x[][]会报错
问题三:output:输出方阵;inti:把矩阵所有元素设为指定值
任务四
代码
1 #define _CRT_SECURE_NO_WARNINGS 1 2 #include <stdio.h> 3 #include <stdlib.h> 4 #define N 100 5 6 void input(int x[], int n); 7 double median(int x[], int n); 8 9 int main() { 10 int x[N]; 11 int n; 12 double ans; 13 while (printf("Enter n: "), scanf_s("%d", &n) != EOF) { 14 input(x, n); 15 ans = median(x, n); 16 printf("ans = %g\n\n", ans); 17 } 18 return 0; 19 } 20 21 void input(int x[], int n) { 22 int i; 23 for (i = 0; i < n; i++) 24 scanf_s("%d", &x[i]); 25 } 26 27 double median(int x[], int n) { 28 int i, j, t; 29 // 排序 30 for (i = 0; i < n - 1; i++) 31 for (j = 0; j < n - i - 1; j++) 32 if (x[j] > x[j + 1]) { 33 t = x[j]; x[j] = x[j + 1]; x[j + 1] = t; 34 } 35 if (n % 2 == 1) 36 return x[n / 2]; 37 else 38 return (x[n / 2 - 1] + x[n / 2]) / 2.0; 39 }
截图
任务五
代码
1 #define _CRT_SECURE_NO_WARNINGS 1 2 #include <stdio.h> 3 #include <stdlib.h> 4 #define N 100 5 6 void input(int x[][N], int n); 7 void output(int x[][N], int n); 8 void rotate_to_right(int x[][N], int n); 9 10 int main() { 11 int x[N][N]; 12 int n; 13 printf("Enter n: "); 14 scanf_s("%d", &n); 15 input(x, n); 16 printf("原始矩阵:\n"); 17 output(x, n); 18 rotate_to_right(x, n); 19 printf("变换后矩阵:\n"); 20 output(x, n); 21 system("pause"); 22 return 0; 23 } 24 25 void input(int x[][N], int n) { 26 int i, j; 27 for (i = 0; i < n; i++) 28 for (j = 0; j < n; j++) 29 scanf_s("%d", &x[i][j]); 30 } 31 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 41 void rotate_to_right(int x[][N], int n) { 42 int i, temp[N]; 43 // 保存最后一列 44 for (i = 0; i < n; i++) 45 temp[i] = x[i][n - 1]; 46 // 列右移 47 for (i = 0; i < n; i++) 48 for (int j = n - 1; j > 0; j--) 49 x[i][j] = x[i][j - 1]; 50 // 最后一列放到第一列 51 for (i = 0; i < n; i++) 52 x[i][0] = temp[i]; 53 }
截图
任务六
代码
1 #define _CRT_SECURE_NO_WARNINGS 1 2 #include <stdio.h> 3 #include <stdlib.h> 4 #define N 100 5 6 void dec_to_n(int x, int n); 7 8 int main() { 9 int x; 10 while (printf("输入十进制整数: "), scanf("%d", &x) != EOF) { 11 dec_to_n(x, 2); 12 dec_to_n(x, 8); 13 dec_to_n(x, 16); 14 printf("\n"); 15 } 16 return 0; 17 } 18 19 void dec_to_n(int x, int n) { 20 int a[N], cnt = 0, i; 21 int num = x; 22 if (num == 0) { 23 printf("0\n"); 24 return; 25 } 26 while (num > 0) { 27 a[cnt++] = num % n; 28 num /= n; 29 } 30 for (i = cnt - 1; i >= 0; i--) { 31 if (a[i] >= 10) 32 printf("%c", 'A' + a[i] - 10); 33 else 34 printf("%d", a[i]); 35 } 36 printf("\n"); 37 }
截图
任务七
代码
1 #define _CRT_SECURE_NO_WARNINGS 1 2 #include <stdio.h> 3 #include <stdlib.h> 4 #define N 100 5 6 void input(int x[][N], int n); 7 void output(int x[][N], int n); 8 int is_magic(int x[][N], int n); 9 10 int main() { 11 int x[N][N]; 12 int n; 13 while (printf("输入n: "), scanf("%d", &n) != EOF) { 14 printf("输入方阵:\n"); 15 input(x, n); 16 printf("输出方阵:\n"); 17 output(x, n); 18 if (is_magic(x, n)) 19 printf("是魔方矩阵\n\n"); 20 else 21 printf("不是魔方矩阵\n\n"); 22 } 23 return 0; 24 } 25 26 void input(int x[][N], int n) { 27 int i, j; 28 for (i = 0; i < n; i++) 29 for (j = 0; j < n; j++) 30 scanf("%d", &x[i][j]); 31 } 32 33 void output(int x[][N], int n) { 34 int i, j; 35 for (i = 0; i < n; i++) { 36 for (j = 0; j < n; j++) 37 printf("%4d", x[i][j]); 38 printf("\n"); 39 } 40 } 41 42 int is_magic(int x[][N], int n) { 43 int sum = n * (n * n + 1) / 2; 44 int i, j, s; 45 // 行 46 for (i = 0; i < n; i++) { 47 s = 0; 48 for (j = 0; j < n; j++) s += x[i][j]; 49 if (s != sum) return 0; 50 } 51 // 列 52 for (j = 0; j < n; j++) { 53 s = 0; 54 for (i = 0; i < n; i++) s += x[i][j]; 55 if (s != sum) return 0; 56 } 57 // 对角线 58 s = 0; 59 for (i = 0; i < n; i++) s += x[i][i]; 60 if (s != sum) return 0; 61 s = 0; 62 for (i = 0; i < n; i++) s += x[i][n - 1 - i]; 63 if (s != sum) return 0; 64 return 1; 65 }
截图
算法思路:先计算出幻和,再分别计算每行每列,以及两条对角线之和并于幻和比较,如果出现不对等就返回0,使结果输出不是魔方矩阵。

浙公网安备 33010602011771号