实验4
任务1
源代码
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 printf("sizef9x=%d\n",sizeof(x)); 8 for(i=0;i<N;i++) 9 printf("%p:%d\n",&x[i],x[i]); 10 11 printf("x=%p\n",x); 12 } 13 14 void test2(){ 15 int x[M][N]={{1,9,8,4},{2,0,4,9}}; 16 int i,j; 17 printf("sizeof(x)=%d\n",sizeof(x)); 18 for(i=0;i<M;i++) 19 for(j=0;j<N;j++) 20 printf("%p:%d\n",&x[i][j],x[i][j]); 21 printf("\n"); 22 printf("x=%p\n",x); 23 printf("x[0]=%p\n",x[0]); 24 printf("x[1]=%p\n",x[i]); 25 printf("\n"); 26 } 27 int main(){ 28 printf("测试1:int型一维数组\n"); 29 test1(); 30 31 printf("\n测试2:int型二维数组\n"); 32 test2(); 33 34 return 0; 35 }
问题答案
1:是连续存放的,数组x对于的值是某个数,加了地址符,表示这个数的在内存中的地址
2:是按行连续存放的,数组x是他的名字,x[0]是第一个数,&x[0][0]是这个数组第一个数的地址,是不一样的,x[0]和x[1]相差32,是一行的内存。
任务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 int x[N]; 7 int n,i; 8 double ans; 9 while(printf("Enter n:"),scanf("%d",&n)!=EOF){ 10 input(x,n); 11 ans=compute(x,n); 12 printf("ans=%.2lf\n\n",ans); 13 } 14 return 0; 15 } 16 void input(int x[],int n){ 17 int i; 18 for(i=0;i<n;++i) 19 scanf("%d",&x[i]); 20 } 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 30 if(x[i]>high) 31 high=x[i]; 32 else if(x[i]<low) 33 low=x[i]; 34 } 35 ans=(ans-high-low)/(n-2); 36 return ans; 37 }
问题答案
1:形参的书写代码要加int等数据类型 ,实参则是直接写数据
2:input的功能是输入一组数组,compute的功能是删去最大和最小求剩下的数的平均数
任务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(j=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:形参int x[ ][N],实参只需两个数字。
2:不能省略列,第二维
3:output的功能是输出这个数组,init的功能是将value赋值给这个二维数组每个值
任务4
源代码
1 #include<stdio.h> 2 #define N 100 3 double input(int x[],int n); 4 double median(int x[],int n); 5 int main (){ 6 int x[N]; 7 int n; 8 double ans; 9 while(printf("Enter n:"),scanf("%d",&n)!=EOF){ 10 input(x,n); 11 ans=median(x,n); 12 printf("ans=%g\n\n",ans); 13 } 14 return 0; 15 } 16 double input(int x[],int n){ 17 int i,j,t; 18 for(i=0;i<n;++i) 19 scanf("%d",&x[i]); 20 for(i=0;i<n-1;i++) 21 for(j=0;j<n-i-1;j++) 22 if(x[j]>x[j+1]){ 23 t=x[j]; 24 x[j]=x[j+1]; 25 x[j+1]=t; 26 } 27 } 28 double median(int x[],int n){ 29 if(n%2!=0) 30 return x[n/2]; 31 else{ 32 return (float)(x[n/2-1]+x[n/2])/2.0; 33 } 34 }
问题答案
任务5
源代码
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 void rotate_to_right(int x[][N],int n); 6 7 int main(){ 8 int x[N][N]; 9 int n,i,j; 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 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 void rotate_to_right(int x[][N],int n){ 37 int temp[n],i,j; 38 for(i=0;i<n;i++) 39 temp[i]=x[i][n-1]; 40 for(i=0;i<n;i++){ 41 for(j=n-1;j>0;j--) 42 x[i][j]=x[i][j-1]; 43 } 44 for(i=0;i<n;i++) 45 x[i][0]=temp[i]; 46 }
问题答案
任务6
源代码
1 #include<stdio.h> 2 #define N 100 3 void dec_to_n(int x,int n); 4 int main(){ 5 int x; 6 while(printf("输入十进制整数:"),scanf("%d",&x)!=EOF){ 7 dec_to_n(x,2); 8 dec_to_n(x,8); 9 dec_to_n(x,16); 10 11 printf("\n"); 12 } 13 return 0; 14 } 15 void dec_to_n(int x,int n){ 16 int a[N]; 17 int i=0,j; 18 while(x!=0){ 19 a[i]=x%n; 20 x/=n; 21 i++; 22 } 23 for(j=i-1;j>=0;j--){ 24 if(a[j]>=10&&n==16) 25 printf("%c",a[j]-10+'A'); 26 else 27 printf("%d",a[j]); 28 } 29 printf("\n"); 30 }
问题答案
任务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 a[][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 13 printf("输出方阵:\n"); 14 output(x,n); 15 16 if(is_magic(x,n)) 17 printf("是魔方矩阵\n\n"); 18 else 19 printf("不是魔方矩阵\n\n"); 20 } 21 22 return 0; 23 } 24 void input(int x[][N],int n){ 25 int i,j; 26 for(i=0;i<n;i++){ 27 for(j=0;j<n;j++) 28 scanf("%d",&x[i][j]); 29 } 30 } 31 void output(int x[][N],int n){ 32 int i,j; 33 for(i=0;i<n;i++){ 34 for(j=0;j<n;j++) 35 printf("%4d",x[i][j]); 36 printf("\n"); 37 } 38 } 39 int is_magic(int a[][N],int n){ 40 int i,j,t,s=0,m=0,count=1; 41 int sum[N]; 42 for(i=0;i<n;i++){ 43 t+=a[0][i]; 44 } 45 for(i=0;i<n;i++){ 46 sum[i]=0; 47 for(j=0;j<n;j++){ 48 sum[i]+=a[i][j]; 49 if(i+j==n-1) 50 m+=a[i][j]; 51 if(i==j) 52 s+=a[i][j]; 53 } 54 } 55 for(i=0;i<n;i++){ 56 if(sum[i]==t&&s==t&&m==t) 57 continue; 58 else{ 59 return 0; 60 } 61 } 62 return count; 63 }
问题答案