实验4
test1
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 printf("x = %p\n", x); 26 printf("x[0] = %p\n", x[0]); 27 printf("x[1] = %p\n", x[1]); 28 printf("\n"); 29 } 30 int main() { 31 printf("测试1: int型一维数组\n"); 32 test1(); 33 printf("\n测试2: int型二维数组\n"); 34 test2(); 35 return 0; 36 }
问题1:int型一维数组x,在内存中是否是连续存放的?数组名x对应的值,和&x[0]是一样的吗?
连续存放,一样的
问题2:int型二维数组x,在内存中是否是"按行连续存放"的?数组名x的值、x[0]、&x[0][0],其
值,在字面上,是一样的吗?x[0]和x[1]相差多少?你能猜测/推断出这个差值的意义吗?
是的,一样的,相差一行的字节数
test2
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 }
观察:一维数组作为形参时,其书写形式?实参的书写形式?
int x[] 调用已知的一个数组
问题:函数input的功能是?函数compute的功能是?
将数组的值输入进去,将这个数组中的所有数字去除最高值和最低值,再对剩下的所有数字求平均值
test 3
1 #include <stdio.h> 2 #define N 100 3 void output(int x[][N], int n); 4 void init(int x[][N], int n, int value); 5 int main() { 6 int x[N][N]; 7 int n, value; 8 while(printf("Enter n and value: "), scanf("%d%d", &n, &value) != EOF) { 9 init(x, n, value); 10 output(x, n); 11 printf("\n"); 12 } 13 return 0; 14 } 15 void output(int x[][N], int n) { 16 int i, j; 17 for(i = 0; i < n; ++i) { 18 for(j = 0; j < n; ++j) 19 printf("%d ", x[i][j]); 20 printf("\n"); 21 } 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:两维数组作为函数形参时,哪一维的大小不能省略?
第二维 列数 不能省略
问题2:函数output功能是?函数init的功能是?
将数组中的每一个元素都赋值为value 将这数组打印出来
test 4
1 #include<stdio.h> 2 #include<stdlib.h> 3 #define N 100 4 void input(int x[],int n){ 5 for(int i=0;i<n;i++){ 6 scanf("%d",&x[i]); 7 } 8 } 9 double median(int x[],int n){ 10 double ans; 11 if(n%2==0){ 12 ans=(x[n/2]+x[(n/2)-1])/2.0; 13 }else{ 14 ans=x[(n-1)/2]; 15 } 16 return ans; 17 } 18 int main() { 19 int x[N]; 20 int n; 21 double ans; 22 while(printf("Enter n: "), scanf("%d", &n) != EOF) { 23 input(x, n); 24 for(int i=0;i<n;i++){ 25 for(int j=0;j<n-1-i;j++){ 26 int change; 27 if(x[j]<x[j+1]){ 28 change=x[j]; 29 x[j]=x[j+1]; 30 x[j+1]=change; 31 } 32 } 33 } 34 ans = median(x, n); 35 printf("ans = %g\n\n", ans); 36 } 37 return 0;}
test 5
1 #include <stdio.h> 2 #define N 100 3 void input(int x[][N], int n){ 4 for(int i=0;i<n;i++){ 5 for(int j=0;j<n;j++){ 6 scanf("%d",&x[i][j]); 7 } 8 } 9 } 10 void rotate_to_right(int x[][N],int n){ 11 for(int i=0;i<n;i++){ 12 int temp=x[i][n-1]; 13 for(int j=n-1;j>0;j--){ 14 x[i][j]=x[i][j-1]; 15 } x[i][0]=temp; 16 } 17 18 } 19 void output(int x[][N], int n){ 20 for(int i=0;i<n;i++){ 21 for(int j=0;j<n;j++){ 22 printf("%d\t",x[i][j]); 23 } 24 printf("\n"); 25 } 26 } 27 int main() { 28 int x[N][N]; 29 int n; 30 printf("Enter n: "); 31 scanf("%d", &n); 32 input(x, n); 33 printf("原始矩阵:\n"); 34 for(int i=0;i<n;i++){ 35 for(int j=0;j<n;j++){ 36 printf("%d\t",x[i][j]); 37 } 38 printf("\n"); 39 } 40 rotate_to_right(x,n); 41 printf("变换后矩阵:\n"); 42 output(x,n); 43 return 0;}
test 6
1 #include <stdio.h> 2 #define N 100 3 void dec_to_n(int x, int n) { 4 int a[N] = {0}; 5 int i = 0; 6 if (n == 2) { 7 while (x!= 0) { 8 a[i]=x % 2; 9 x /= 2; 10 i++; 11 } 12 } 13 else if (n == 8) { 14 i = 0; 15 while (x!= 0) { 16 a[i]=x % 8; 17 x /= 8; 18 i++; 19 } 20 } 21 else if (n == 16) { 22 i = 0; 23 while (x!= 0) { 24 int f = x % 16; 25 if (f < 10) { 26 a[i]=f + '0'; 27 } else { 28 a[i]=f - 10 + 'A'; 29 } 30 x /= 16; 31 i++; 32 } 33 } 34 int m = (i - 1) / 2; 35 for (int j = 0; j <= m; j++) { 36 int temp; 37 temp = a[j]; 38 a[j] = a[i - 1 - j]; 39 a[i - 1 - j] = temp; 40 } 41 if(n==16){ 42 for (int k = 0; k < i; k++) { 43 printf("%c", a[k]); 44 } 45 printf("\n"); 46 }else if(n==2||n==8){ 47 for (int k = 0; k < i; k++) { 48 printf("%d", a[k]); 49 } 50 printf("\n"); 51 } 52 } 53 54 int main() { 55 int x; 56 while (printf("输入十进制整数: "), scanf("%d", &x)!= EOF) { 57 printf("二进制: "); 58 dec_to_n(x, 2); 59 printf("八进制: "); 60 dec_to_n(x, 8); 61 printf("十六进制: "); 62 dec_to_n(x, 16); 63 } 64 return 0;}
test 7
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("%d", &n)!= EOF) { 10 printf("输入方阵:\n"); 11 input(x, n); 12 printf("输出方阵:\n"); 13 output(x, n); 14 if(is_magic(x, n)) 15 printf("是魔方矩阵\n\n"); 16 else 17 printf("不是魔方矩阵\n\n"); 18 } 19 return 0; 20 } 21 void input(int x[][N], int n) { 22 int i, j; 23 for (i = 0; i < n; ++i) { 24 for (j = 0; j < n; ++j) 25 scanf("%d", &x[i][j]); 26 } 27 } 28 void output(int x[][N], int n) { 29 int i, j; 30 for (i = 0; i < n; ++i) { 31 for (j = 0; j < n; ++j) 32 printf("%4d", x[i][j]); 33 printf("\n"); 34 } 35 } 36 int is_magic(int x[][N], int n) { 37 int target = 0; 38 int i; 39 for (i = 0; i < n; i++) { 40 target+= x[0][i]; 41 } 42 for (i = 1; i < n; i++) { 43 int row=0; 44 int j; 45 for (j = 0; j < n; j++) { 46 row+= x[i][j]; 47 } 48 if (row!=target) { 49 return 0; 50 } 51 } 52 for (i = 0; i < n; i++) { 53 int wyt= 0; 54 int j; 55 for (j = 0; j < n; j++) { 56 wyt+= x[j][i]; 57 } 58 if (wyt!=target) { 59 return 0; 60 } 61 } 62 int main= 0; 63 for (i = 0; i < n; i++) { 64 main+= x[i][i]; 65 } 66 if (main!=target) { 67 return 0; 68 } 69 int f = 0; 70 for (i = 0; i < n; i++) { 71 f+= x[i][n - 1 - i]; 72 } 73 if (f!=target) { 74 return 0; 75 return 1; 76 } 77 }
test 8
1 #include <stdio.h> 2 #define N 100 3 int main() { 4 int n; 5 while (printf("请输入数字:"), scanf("%d", &n)!= EOF) { 6 int x = n * n; 7 int y = n * n * n; 8 int a[N], b[N]; 9 int j = 0, k = 0; 10 int tempX = x, tempY = y; 11 // 计算平方的数位 12 while (tempX > 0) { 13 tempX /= 10; 14 j++; 15 } 16 // 计算立方的数位 17 while (tempY > 0) { 18 tempY /= 10; 19 k++; 20 } 21 tempX = x; 22 tempY = y; 23 // 提取平方各数位上的数字 24 for (int i = j - 1; i >= 0; i--) { 25 a[i] = tempX % 10; 26 tempX /= 10; 27 } 28 // 提取立方各数位上的数字 29 for (int i = k - 1; i >= 0; i--) { 30 b[i] = tempY % 10; 31 tempY /= 10; 32 } 33 int result = 0; 34 // 判断是否有重合数字 35 for (int i = 0; i < j; i++) { 36 for (int p = 0; p < k; p++) { 37 if (a[i] == b[p]) { 38 result = 1; 39 break; 40 } 41 } 42 if (result) break; 43 } 44 if (result) continue; 45 int c[N]; 46 // 合并两个数组为数组c 47 for (int i = 0; i < j; i++) { 48 c[i] = a[i]; 49 } 50 int index = j; 51 for (int i = 0; i < k; i++) { 52 c[index++] = b[i]; 53 } 54 result = 0; 55 // 判断是否占有0 - 9这些数字 56 for (int num = 0; num < 10; num++) { 57 int found = 0; 58 for (int i = 0; i < j + k; i++) { 59 if (c[i] == num) { 60 found = 1; 61 break; 62 } 63 } 64 if (!found) { 65 result = 1; 66 break; 67 } 68 } 69 if (result == 0) break; 70 } 71 printf("符合条件的数字是:%d\n", n); 72 return 0; 73 }