实验四
实验1
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #define N 4 4 #define M 2 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 void test2() { 14 int x[M][N] = { {1,9,8,4},{2,0,4,9} }; 15 int i, j; 16 printf("sizeof(x)=%d\n", sizeof(x)); 17 for (i = 0; i < M; ++i) 18 for (j = 0; j < N; ++j) 19 printf("%p:%d\n", &x[i][j], x[i][j]); 20 printf("\n"); 21 printf("x=%p\n", x); 22 printf("x[0]=%p\n", x[0]); 23 printf("x[1]=%p\n", x[1]); 24 printf("\n"); 25 } 26 int main() { 27 printf("测试1:int型一维数组\n"); 28 test1(); 29 printf("\n测试2:int型二维数组\n"); 30 test2(); 31 return 0; 32 }

问题一:一维数组x在存放中是连续存放。x和&x[0]相同
问题二:二维数组x在内存中不是按行连续存放,x和x[0][0]和x[0]相同,x[0]和x[1]差16,差值的含义是列也要占据内存字节,而差的16个字节正好是第0行的1,2,3,4列所占的字节。
实验2:
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #define N 100 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 void input(int x[], int n) { 18 int i; 19 for (i = 0; i < n; ++i) 20 scanf("%d", &x[i]); 21 } 22 double compute(int x[], int n) { 23 int i, high, low; 24 double ans; 25 high = low = x[0]; 26 ans = 0; 27 for (i = 0; i < n; ++i) { 28 ans += x[i]; 29 if (x[i] > high) 30 high = x[i]; 31 else if (x[i] < low) 32 low = x[i]; 33 } 34 ans = (ans - high - low) / (n - 2); 35 return ans; 36 }

问题1:形参:x[],n。实参:以第一组数据为例:5;1,9,8,4,2
问题2:input的作用是输入x[]和n的具体值,compute的作用是去掉最高分与最低分求剩余平均值
实验3:
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #define N 100 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 void output(int x[][N], int n) { 17 int i, j; 18 for (i = 0; i < n; ++i) { 19 for (j = 0; j < n; ++j) 20 printf("%d", x[i][j]); 21 printf("\n"); 22 } 23 } 24 void init(int x[][N], int n, int value) { 25 int i ,j; 26 for (i = 0; i < n; ++i) 27 for (j = 0; j < n; ++j) 28 x[i][j] = value; 29 }

问题1:形参:x[][N],n。实参:5,42。
问题2:不可以,机器将无法计算矩阵大小。
问题3:output作用是输出矩阵,init的作用是将value的值赋给矩阵。
实验4:
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #define N 100 4 void input(int x[],int n); 5 double medium(int x[], int n); 6 int i; 7 int main() { 8 int x[N]; 9 int n; 10 double ans; 11 while (printf("Enter n:"), scanf("%d",&n) != EOF) { 12 input(x, n); 13 ans = medium(x, n); 14 printf("ans=%g\n\n", ans); 15 } 16 return 0; 17 } 18 void input(int x[], int n) { 19 20 for (i = 0; i < n; ++i) 21 scanf("%d", &x[i]); 22 } 23 double medium(int x[], int n) { 24 double ans ; 25 int i, j; 26 int t; 27 for(i=0;i<n-1;++i) 28 for (j = 0; j<n-i-1 ;j++) { 29 if (x[j] > x[j + 1]) { 30 t = x[j]; 31 x[j] = x[j + 1]; 32 x[j + 1] = t; 33 } 34 35 } 36 if (n % 2 == 0) 37 ans =(1.0* x[n / 2] + 1.0*x[n / 2 - 1])/2; 38 else if (n % 2 != 0) 39 ans = 1.0*x[(n + 1) / 2 - 1]; 40 return ans; 41 }

实验5:
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #define N 100 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 void input(int x[][N], int n) { 21 int i, j; 22 for (i = 0; i < n; ++i) { 23 for (j = 0; j < n; ++j) 24 scanf("%d", &x[i][j]); 25 } 26 } 27 void output(int x[][N], int n) { 28 int i, j; 29 for (i = 0; i < n; ++i) { 30 for (j = 0; j < n; ++j) 31 printf("%4d", x[i][j]); 32 printf("\n"); 33 } 34 } 35 void rotate_to_right(int x[][N], int n) { 36 int i, j; 37 int t; 38 for (i = 0; i < n; ++i) { 39 t = x[i][n - 1]; 40 for (j = n - 1; j >0; j--) { 41 x[i][j] = x[i][j-1]; 42 43 } 44 x[i][0] = t; 45 printf("%d", x[i][j]); 46 printf("\n"); 47 } 48 49 }

实验6:
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #define N 100 4 void dec_to_n(int x, int n); 5 int main() { 6 int x; 7 while (printf("输入十进制整数: "), scanf("%d", &x) != EOF) { 8 dec_to_n(x, 2); 9 dec_to_n(x, 8); 10 dec_to_n(x, 16); 11 printf("\n"); 12 } 13 return 0; 14 } 15 void dec_to_n(int x, int n) { 16 int i = 0, j, k = 0, h, m = 0, t, b; 17 int a[N], y[N], z[N]; 18 if (n == 2) { 19 if (x == 0) { 20 printf("0"); 21 } 22 while (x > 0) { 23 a[i] = x % 2; 24 x = x / 2; 25 i++; 26 } 27 for (j = i - 1; j >= 0; j--) 28 printf("%d", a[j]); 29 }printf("\n"); 30 if (n == 8) { 31 if (x == 0) { 32 printf("0"); 33 } 34 while (x > 0) { 35 y[k] = x % 8; 36 x = x / 8; 37 k++; 38 } 39 for (h = k - 1; h >= 0; h--) 40 printf("%d", y[h]); 41 }printf("\n"); 42 if (n == 16) { 43 if (x == 0) { 44 printf("0"); 45 } 46 while (x > 0) { 47 z[m] = x % 16; 48 x = x / 16; 49 m++; 50 } 51 for (t = m - 1; t >= 0; t--) { 52 b = z[t]; 53 if (b == 10) { 54 printf("A"); 55 } 56 else if (b == 11) { 57 printf("B"); 58 } 59 else if (b == 12) { 60 printf("C"); 61 } 62 else if (b == 13) { 63 printf("D"); 64 } 65 else if (b == 14) { 66 printf("E"); 67 } 68 else if (b == 15) { 69 printf("F"); 70 } 71 else 72 printf("%d", b); 73 } 74 } 75 }

实验7:
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #define N 100 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 int main() { 8 int x[N][N]; 9 int n; 10 while (printf("输入n:"), scanf("%d", &n) != EOF) { 11 printf("输入方阵:\n"); 12 input(x, n); 13 printf("输出方阵:\n"); 14 output(x, n); 15 if (is_magic(x, n)) 16 printf("是魔方矩阵\n\n"); 17 else 18 printf("是不魔方矩阵\n\n"); 19 } 20 return 0; 21 } 22 void input(int x[][N], int n) { 23 int i, j; 24 for (i = 0; i < n; ++i) { 25 for (j = 0; j < n; ++j) 26 scanf("%d", &x[i][j]); 27 } 28 } 29 void output(int x[][N], int n) { 30 int i, j; 31 for (i = 0; i < n; ++i) { 32 for (j = 0; j < n; ++j) 33 printf("%4d", x[i][j]); 34 printf("\n"); 35 } 36 } 37 int is_magic(int x[][N], int n) { 38 int s; 39 int i, j, k, l, ans1 = 0, ans2 = 0, ans3 = 0, ans4 = 0,ans5=0; 40 int q, w; 41 s = n * (n * n + 1) / 2; 42 for (i = 0; i < n; ++i) { 43 for (j = 0; j < n; ++j) { 44 ans1 = ans1 + x[i][j]; 45 } 46 } 47 for (k = 0; k < n; ++k) { 48 for (l = 0; l < n; ++l) { 49 ans2 = ans2 + x[l][k]; 50 } 51 } 52 for (q = 0; q < n; ++q) 53 ans4 += x[q][q]; 54 for (w = n - 1; w >= 0; w--) 55 ans5 += x[w][w]; 56 if (ans1 / n == s && ans2 / n == s && ans4 == s && ans5 == s) 57 return 1; 58 return 0; 59 }


实验8:
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #define N 100 4 int same(int k[N]); 5 void comput(int x, int a[]); 6 void order(int d[],int m); 7 void tog(int z[], int x1[],int x2[],int q, int w); 8 int cnt(int l); 9 void move(int arr[], int size); 10 int main() { 11 int i=1; 12 int s, m; 13 int p = 0, q = 0; 14 int a[N], b[N]; 15 int c[N]; 16 for (i = 1;; i++) { 17 s = i * i; 18 m = i * i * i; 19 comput(s, a); 20 comput(m, b); 21 order(a, cnt(s)); 22 order(b, cnt(m)); 23 tog(c, a, b, cnt(s),cnt(m)); 24 order(c, cnt(s)+ cnt(m)); 25 move(c, cnt(s) + cnt(m)); 26 if (same(c)) { 27 printf("%d", i); 28 break; 29 } 30 31 32 } 33 } 34 int same(int k[N]) { 35 int x[N] = { 0,1,2,3,4,5,6,7,8,9 }; 36 int i = 0; 37 int j = 0; 38 for (i = 0, j = 0; i < 10&& j < 10; ++i, ++j) { 39 if (k[j] != x[i]) 40 return 0; 41 } 42 return 1; 43 } 44 void comput(int x, int a[]) { 45 int i = 0; 46 while (x != 0) { 47 a[i] = x % 10; 48 x = x / 10; 49 i++; 50 } 51 } 52 void order(int d[], int n) { 53 int i, j, t; 54 for (i = 0; i < n - 1; ++i) 55 for (j = 0; j < n - i - 1; ++j) { 56 if (d[j] > d[j + 1]) { 57 t = d[j]; 58 d[j] = d[j + 1]; 59 d[j + 1] = t; 60 } 61 } 62 } 63 int cnt(int l) { 64 int i=0; 65 while (l != 0) { 66 i++; 67 l = l / 10; 68 }return i; 69 } 70 void tog(int z[], int x1[],int x2[],int q, int w) { 71 for (int i = 0; i < q; i++) { 72 z[i] = x1[i]; 73 } 74 for (int i = 0; i < w; i++) 75 z[i + q] = x2[i]; 76 } 77 void move(int arr[], int size) { 78 int j = 0; 79 for (int i = 0; i < size - 1; i++) { 80 if (arr[i] != arr[i + 1]) 81 arr[j++] = arr[i]; 82 } 83 arr[j] = arr[size - 1]; 84 85 }


浙公网安备 33010602011771号