实验4
试验任务1
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 printf("sizeof(x) = %d\n", sizeof(x)); 10 11 for (i = 0; i < N; ++i) 12 printf("%p: %d\n", &x[i], x[i]); 13 14 printf("x = %p\n", x); 15 } 16 17 void test2() { 18 int x[M][N] = {{1, 9, 8, 4}, {2, 0, 4, 9}}; 19 int i, j; 20 21 printf("sizeof(x) = %d\n", sizeof(x)); 22 23 for (i = 0; i < M; ++i) 24 for (j = 0; j < N; ++j) 25 printf("%p: %d\n", &x[i][j], x[i][j]); 26 printf("\n"); 27 28 printf("x = %p\n", x); 29 printf("x[0] = %p\n", x[0]); 30 printf("x[1] = %p\n", x[1]); 31 printf("\n"); 32 } 33 34 int main() { 35 printf("测试1: int型一维数组\n"); 36 test1(); 37 38 printf("\n测试2: int型二维数组\n"); 39 test2(); 40 41 return 0; 42 }
问题1
是连续存放的,和&x[0]对应的值是一样的
问题2
是连续存放的,是一样的
试验任务2
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 { 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 16 return 0; 17 } 18 19 void input(int x[],int n) 20 { 21 int i; 22 for(i=0;i<n;i++) 23 scanf("%d",&x[i]); 24 } 25 26 double compute(int x[],int n) 27 { 28 int i; 29 int high,low; 30 double ans; 31 32 high=low=x[0]; 33 ans=0; 34 for(i=0;i<n;i++) 35 { 36 ans+=x[i]; 37 38 if(x[i]>high) 39 high=x[i]; 40 if(x[i]<low) 41 low=x[i]; 42 } 43 ans=(ans-high-low)/(n-2); 44 45 return ans; 46 }
问题
input用于数组的输入
compute首先计算数组所有元素的总和,找出最大最小值,接着计算
ans=(总和-最大-最小)/(n-2)
试验任务三
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 6 int main() { 7 int x[N][N]; 8 int n, value; 9 10 while(printf("Enter n and value: "), scanf("%d%d", &n, &value) != EOF) { 11 init(x, n, value); 12 output(x, n); 13 printf("\n"); 14 } 15 16 return 0; 17 } 18 19 void output(int x[][N], int n) { 20 int i, j; 21 22 for(i = 0; i < n; ++i) { 23 for(j = 0; j < n; ++j) 24 printf("%d ", x[i][j]); 25 printf("\n"); 26 } 27 } 28 29 void init(int x[][N], int n, int value) { 30 int i, j; 31 32 for(i = 0; i < n; ++i) 33 for(j = 0; j < n; ++j) 34 x[i][j] = value; 35 }
问题1
第二维不能省略
问题2
输出数组各元素的值,为数组各元素赋一个值
试验任务4
1 #include <stdio.h> 2 #define N 100 3 void input(int x[],int n) 4 { 5 int i; 6 for(i=0;i<n;i++) 7 scanf("%d",&x[i]); 8 } 9 float median(int x[],int n) 10 { 11 float ans; 12 int i=0,j=0; 13 int t; 14 15 for(i=0;i<n-1;i++) 16 { 17 for(j=0;j<n-1-i;j++) 18 { 19 if(x[j]>x[j+1]) 20 { 21 t=x[j]; 22 x[j]=x[j+1]; 23 x[j+1]=t; 24 } 25 } 26 } 27 28 29 if(n%2 != 0) 30 ans=x[(n-1)/2]; 31 else 32 ans=(x[n/2-1]+x[n/2])/2.0; 33 return ans; 34 } 35 36 int main() 37 { 38 int x[N]; 39 int n; 40 double ans; 41 42 while(printf("Enter n: "), scanf("%d", &n) != EOF) { 43 input(x, n); 44 ans = median(x, n); 45 printf("ans = %g\n\n", ans); 46 } 47 return 0; 48 } 49
实验任务5
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 9 // 函数rotate_to_right声明 10 // 待补足 11 // ××× 12 13 int main() { 14 int x[N][N]; 15 int n; 16 17 printf("输入n: "); 18 scanf("%d", &n); 19 input(x, n); 20 21 printf("原始矩阵:\n"); 22 output(x, n); 23 24 // 函数rotate_to_right调用 25 // 待补足 26 rotate_to_right(x,n); 27 28 printf("变换后矩阵:\n"); 29 output(x, n); 30 31 return 0; 32 } 33 34 // 函数定义 35 // 功能: 输入一个n*n的矩阵x 36 void input(int x[][N], int n) { 37 int i, j; 38 39 for (i = 0; i < n; ++i) { 40 for (j = 0; j < n; ++j) 41 scanf("%d", &x[i][j]); 42 } 43 } 44 45 // 函数定义 46 // 功能: 输出一个n*n的矩阵x 47 void output(int x[][N], int n) { 48 int i, j; 49 50 for (i = 0; i < n; ++i) { 51 for (j = 0; j < n; ++j) 52 printf("%4d", x[i][j]); 53 54 printf("\n"); 55 } 56 } 57 58 // 函数rotate_to_right定义 59 // 功能: 把一个n*n的矩阵x,每一列向右移, 最右边被移出去的一列绕回左边 60 // 待补足 61 // xxx 62 void rotate_to_right(int x[][N],int n) 63 { 64 int i,j; 65 int t,s; 66 for(i=0;i<n;i++) 67 { 68 for(j=0;j<n;j++) 69 { 70 if(j==0) 71 { 72 t=x[i][j]; 73 x[i][j]=x[i][n-1]; 74 75 } 76 else 77 { 78 s=x[i][j]; 79 x[i][j]=t; 80 t=s; 81 } 82 83 } 84 } 85 86 }
实验任务6
1 #include <stdio.h> 2 #define N 100 3 4 void dec_to_n(int x, int n); 5 6 int main() { 7 int x; 8 9 while(printf("ÊäÈëÊ®½øÖÆÕûÊý: "), scanf("%d", &x) != EOF) { 10 dec_to_n(x, 2); 11 dec_to_n(x, 8); 12 dec_to_n(x, 16); 13 14 printf("\n"); 15 } 16 17 return 0; 18 } 19 24 void dec_to_n(int x,int n) 25 { 26 int ans=0; 27 int ret; 28 int m=1; 29 30 31 32 if(n>10) 33 { 34 char hex[100]; 35 int i=0,j; 36 37 while(x>0) 38 { 39 ret=x%n; 40 if(ret<10) 41 { 42 hex[i++]=ret+'0'; 43 } 44 else 45 { 46 hex[i++]=ret-10+'A'; 47 } 48 x/=n; 49 } 50 51 for(j=i-1;j>=0;j--) 52 { 53 printf("%c",hex[j]); 54 } 55 } 56 do 57 { 58 ret=x%n; 59 x=x/n; 60 ans+=ret*m; 61 m*=10; 62 }while(x!=0); 63 64 printf("%d\n",ans); 65 }
实验任务7
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 int is_magic(int x[][N],int n); 8 // 待补足函数is_magic声明 9 // xxx 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 { 60 int ret=1; 61 int s=0,s1=0; 62 int i,j; 63 64 for(j=0;j<n;j++) 65 { 66 s+=x[0][j]; 67 } 68 for(i=1;i<n;i++) 69 { 70 s1=0; 71 for(j=0;j<n;j++) 72 { 73 s1+=x[i][j]; 74 } 75 if(s1!=s) 76 ret=0; 77 } 78 79 for(j=0;j<n;j++) 80 { 81 s1=0; 82 for(i=0;i<n;i++) 83 { 84 s1+=x[i][j]; 85 } 86 if(s1!=s) 87 ret=0; 88 } 89 90 i=0; 91 j=0; 92 s1=0; 93 for(i=0;i<n;i++) 94 { 95 96 s1+=x[i][j]; 97 j++; 98 } 99 if(s1!=s) 100 ret=0; 101 102 103 i=n-1; 104 j=n-1; 105 s1=0; 106 for(i=n-1;i>=0;i--) 107 { 108 109 s1+=x[i][j]; 110 j--; 111 } 112 if(s1!=s) 113 ret=0; 114 115 116 return ret; 117 118 }