实验四
task1
源代码
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 9 // 输出数组x占用的内存字节数 10 printf("sizeof(x) = %d\n", sizeof(x)); 11 12 // 输出每个元素的地址、值 13 for (i = 0; i < N; ++i) 14 printf("%p: %d\n", &x[i], x[i]); 15 16 // 输出数组名x对应的值 17 printf("x = %p\n", x); 18 } 19 20 void test2() { 21 int x[M][N] = {{1, 9, 8, 4}, {2, 0, 4, 9}}; 22 int i, j; 23 24 // 输出二维数组x占用的内存字节数 25 printf("sizeof(x) = %d\n", sizeof(x)); 26 27 // 输出每个元素的地址、值 28 for (i = 0; i < M; ++i) 29 for (j = 0; j < N; ++j) 30 printf("%p: %d\n", &x[i][j], x[i][j]); 31 printf("\n"); 32 33 // 输出二维数组名x, 以及,x[0], x[1]的值 34 printf("x = %p\n", x); 35 printf("x[0] = %p\n", x[0]); 36 printf("x[1] = %p\n", x[1]); 37 printf("\n"); 38 } 39 40 int main() { 41 printf("测试1: int型一维数组\n"); 42 test1(); 43 44 printf("\n测试2: int型二维数组\n"); 45 test2(); 46 47 return 0; 48 }
运行截图

问题
Q1:是,相同
Q2:是,相同,16,一行所占用的内存空间。
task2
源代码
1 #include <stdio.h> 2 #define N 100 3 4 // 函数声明 5 void input(int x[], int n); 6 double compute(int x[], int n); 7 8 int main() { 9 int x[N]; 10 int n, i; 11 double ans; 12 13 while(printf("Enter n: "), scanf("%d", &n) != EOF) { 14 input(x, n); // 函数调用 15 ans = compute(x, n); // 函数调用 16 printf("ans = %.2f\n\n", ans); 17 } 18 19 return 0; 20 } 21 22 // 函数定义 23 void input(int x[], int n) { 24 int i; 25 26 for(i = 0; i < n; ++i) 27 scanf("%d", &x[i]); 28 } 29 30 // 函数定义 31 double compute(int x[], int n) { 32 int i, high, low; 33 double ans; 34 35 high = low = x[0]; 36 ans = 0; 37 38 for(i = 0; i < n; ++i) { 39 ans += x[i]; 40 41 if(x[i] > high) 42 high = x[i]; 43 else if(x[i] < low) 44 low = x[i]; 45 } 46 47 ans = (ans - high - low)/(n-2); 48 49 return ans; 50 }
运行截图

问题
Q1:形参 void input(int x[], int n)
实参 input(x, n)
Q2:input:为数组存入n个数
compute:将数组中最大数和最小数删去后的n-2个数的平均值
task3
源代码
1 #include <stdio.h> 2 #define N 100 3 4 // 函数声明 5 void output(int x[][N], int n); 6 void init(int x[][N], int n, int value); 7 8 int main() { 9 int x[N][N]; 10 int n, value; 11 12 while(printf("Enter n and value: "), scanf("%d%d", &n, &value) != EOF) { 13 init(x, n, value); // 函数调用 14 output(x, n); // 函数调用 15 printf("\n"); 16 } 17 18 return 0; 19 } 20 21 // 函数定义 22 void output(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 printf("%d ", x[i][j]); 28 printf("\n"); 29 } 30 } 31 32 // 函数定义 33 void init(int x[][N], int n, int value) { 34 int i, j; 35 36 for(i = 0; i < n; ++i) 37 for(j = 0; j < n; ++j) 38 x[i][j] = value; 39 }
运行截图

问题
Q1:实参 output(x, n) 形参void output(int x[][N], int n)
Q2:不能
Q3:output:打印x[i][j],为一个n行n列的矩阵
init:将x[i][j]赋值为value,即将矩阵中的,每一个元素赋值为value
task4
源代码
1 #include <stdio.h> 2 #define N 100 3 4 // 函数声明 5 // 待补足 6 // xxx 7 void input(int x[], int n); 8 double median(int x[], int n); 9 void paixu(int x[],int n); 10 int main() { 11 int x[N]; 12 int n; 13 double ans; 14 15 while (printf("Enter n: "), scanf("%d", &n) != EOF) { 16 input(x, n); // 函数调用 17 ans = median(x, n); // 函数调用 18 printf("ans = %g\n\n", ans); 19 } 20 21 return 0; 22 } 23 void input(int x[], int n) { 24 int i; 25 for (i = 0; i < n; i++) 26 scanf("%d", &x[i]); 27 } 28 double median(int x[], int n) { 29 paixu(x,n); 30 if (n % 2 != 0) 31 return x[(n + 1) / 2-1 ]; 32 else 33 return (x[n / 2 - 1] + x[n / 2])/2.0; 34 } 35 void paixu(int x[],int n) { 36 int y[N]; 37 int i,j; 38 for (i = 0; i <= n - 2; i++) { 39 for (j = 0; j <= n - 2; j++) { 40 if (x[j] > x[j + 1]) { 41 y[0] = x[j]; 42 x[j] = x[j + 1]; 43 x[j + 1] = y[0]; 44 } 45 } 46 } 47 } 48 49 // 函数定义 50 // 待补足 51 // xxx
运行截图

task5
源代码
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 // 函数rotate_to_right声明 9 // 待补足 10 // ××× 11 12 int main() { 13 int x[N][N]; 14 int n; 15 16 printf("输入n: "); 17 scanf("%d", &n); 18 input(x, n); 19 20 printf("原始矩阵:\n"); 21 output(x, n); 22 23 // 函数rotate_to_right调用 24 // 待补足 25 rotate_to_right(x,n); 26 27 printf("变换后矩阵:\n"); 28 output(x, n); 29 30 return 0; 31 } 32 33 // 函数定义 34 // 功能: 输入一个n*n的矩阵x 35 void input(int x[][N], int n) { 36 int i, j; 37 38 for (i = 0; i < n; ++i) { 39 for (j = 0; j < n; ++j) 40 scanf("%d", &x[i][j]); 41 } 42 } 43 44 // 函数定义 45 // 功能: 输出一个n*n的矩阵x 46 void output(int x[][N], int n) { 47 int i, j; 48 49 for (i = 0; i < n; ++i) { 50 for (j = 0; j < n; ++j) 51 printf("%4d", x[i][j]); 52 53 printf("\n"); 54 } 55 } 56 void rotate_to_right(int x[][N],int n) { 57 int i,j; 58 int y[N][1]; 59 for (j = n-1; j >=1; j--) { 60 for (i = 0; i < n; i++) { 61 y[i][0] = x[i][j]; 62 x[i][j] = x[i][j-1]; 63 x[i][j-1] = y[i][0]; 64 } 65 } 66 } 67 68 // 函数rotate_to_right定义 69 // 功能: 把一个n*n的矩阵x,每一列向右移, 最右边一列绕回左边 70 // 待补足 71 // xxx
运行截图

task6
源代码
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 dec_to_n(x, 2); // 函数调用: 把x转换成二进制输出 10 dec_to_n(x, 8); // 函数调用: 把x转换成八进制输出 11 dec_to_n(x, 16); // 函数调用: 把x转换成十六进制输出 12 13 printf("\n"); 14 } 15 16 return 0; 17 } 18 void dec_to_n(int x, int n) { 19 int i = 0, r=1, j; 20 int c[N]; 21 do { 22 r = x / n; 23 c[i] = x % n; 24 x = r; 25 i++; 26 } 27 while (r != 0); 28 for (j = i - 1; j >= 0; j--) { 29 if (c[j] <= 9) 30 printf("%d", c[j]); 31 else 32 printf("%c", 'A' - 10 + c[j]); 33 } 34 printf("\n"); 35 } 36 // 函数定义 37 // 功能: 把十进制数x转换成n进制,打印输出 38 // 补足函数实现 39 // xxx
运行截图

task7
源代码
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 // 待补足函数is_magic声明 8 // xxx 9 int is_magic(int x[][N],int n); 10 11 int main() { 12 int x[N][N]; 13 int n; 14 15 while (printf("输入n: "), scanf("%d", &n) != EOF) { 16 printf("输入方阵:\n"); 17 input(x, n); 18 19 printf("输出方阵:\n"); 20 output(x, n); 21 22 if (is_magic(x, n)) 23 printf("是魔方矩阵\n\n"); 24 else 25 printf("不是魔方矩阵\n\n"); 26 } 27 28 return 0; 29 } 30 31 // 函数定义 32 // 功能: 输入一个n*n的矩阵x 33 void input(int x[][N], int n) { 34 int i, j; 35 36 for (i = 0; i < n; ++i) { 37 for (j = 0; j < n; ++j) 38 scanf("%d", &x[i][j]); 39 } 40 } 41 42 // 功能: 输出一个n*n的矩阵x 43 void output(int x[][N], int n) { 44 int i, j; 45 46 for (i = 0; i < n; ++i) { 47 for (j = 0; j < n; ++j) 48 printf("%4d", x[i][j]); 49 50 printf("\n"); 51 } 52 } 53 54 55 // 功能: 判断一个n阶方阵是否为魔方矩阵,如果是,返回1,否则,返回0 56 // 待补足函数is_magic定义 57 // xxx 58 int is_magic(int x[][N],int n) { 59 int i,j; 60 int sum=0; 61 for (i = 0; i <= n - 1; i++) { 62 sum = 0; 63 for (j = 0; j <= n - 1; j++) 64 sum += x[i][j]; 65 if (sum != n * (n * n + 1) / 2) 66 return 0; 67 } 68 for (j = 0; j <= n - 1; j++) { 69 sum = 0; 70 for (i = 0; i <= n - 1; i++) 71 sum += x[i][j]; 72 if (sum != n * (n * n + 1) / 2) 73 return 0; 74 } 75 sum = 0; 76 for (i = 0, j = 0; i+j <= 2*n - 2; i++, j++) 77 sum += x[i][j]; 78 if (sum != n * (n * n + 1) / 2) 79 return 0; 80 sum = 0; 81 for (i = n - 1, j = 0; i>=0; i--, j++) 82 sum += x[i][j]; 83 if (sum != n * (n * n + 1) / 2) 84 return 0; 85 86 87 return 1; 88 }
运行截图

思路说明
对每一行每一列以及两个对角线求和,判断是否符合条件,如果有一个不符合直接结束,返回0,如果没找到,则继续运行直到所有都计算过,返回1。
task8
源代码
1 #include <stdio.h> 2 #include<math.h> 3 #define N 100 4 5 long long pa(int n); 6 void paixu(int x[], int n); 7 long long zhuan(int x[], int n); 8 9 int main() { 10 int i; 11 for (i = 47; i <= 99; i++) { 12 if (pa(i) == 9876543210) { 13 printf("%d", i); 14 return 0; 15 } 16 } 17 } 18 19 long long pa(int n) { 20 int i; 21 long long th; 22 int x[N]; 23 th = pow(n, 2) + pow(n, 3)*10000; 24 for (i = 0; i <= 9; i++) { 25 x[i] = th % 10; 26 th /= 10; 27 } 28 paixu(x, 10); 29 return zhuan(x, 10); 30 } 31 long long zhuan(int x[], int n) { 32 int i; 33 long long sum=0; 34 for (i = n - 1; i >= 0; i--) { 35 sum += x[i]*pow(10, i); 36 } 37 return sum; 38 } 39 void paixu(int x[], int n) { 40 int y[N]; 41 int i, j; 42 for (i = 0; i <= n - 2; i++) { 43 for (j = 0; j <= n - 2; j++) { 44 if (x[j] > x[j + 1]) { 45 y[0] = x[j]; 46 x[j] = x[j + 1]; 47 x[j + 1] = y[0]; 48 } 49 } 50 } 51 }
运行截图
思路说明
经分析,这个数的平方为四位数,立方为六位数,再计算可知,应该大于等于47,小于等于99。
先创建主循环i从47到99,将i平方和i立方的数拆分存入数组x,再对x进行从小到大的排序,并把它反向输出,即从大到小输出,最后于9876543210比较。


浙公网安备 33010602011771号