实验四
任务一
源代码
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("sizeof(x)=%d\n",sizeof(x)); 8 for(i=0;i<N;i++) 9 printf("%p:%d\n",&x[i],x[i]); 10 printf("x=%p\n",x); 11 } 12 void test2(){ 13 int x[M][N]={{1,9,8,4},{2,0,4,9}}; 14 int i,j; 15 printf("sizeof(x)=%d\n",sizeof(x)); 16 for(i=0;i<M;i++) 17 for(j=0;j<N;j++) 18 printf("%p:%d\n",&x[i][j],x[i][j]); 19 printf("\n"); 20 printf("x=%p\n",x); 21 printf("x[0]=%p\n",x[0]); 22 printf("x[1]=%p\n",x[1]); 23 printf("\n"); 24 } 25 int main(){ 26 printf("测试1:int型一维数组\n"); 27 test1(); 28 29 printf("\n测试2:int型二维数组\n"); 30 test2(); 31 return 0; 32 33 }
截图
问题一
是连续存放的,数组名x对应的值,和&x[0]不一样
问题二
是按行连续存放的,数组名x的值,x[0],&x[0][0],其值在字面上不一样,x[0]和x[1]相差8个字节,这个差值的意义是x[0]的存储空间
任务二
源代码
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=%.2f\n\n",ans); 13 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 }
截图
问题
函数input的功能是输入一维数组中n个数据的值
函数compute的功能是计算一组数据中去掉最大值和最小值后的平均值
任务三
源代码
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 void init(int x[][N],int n,int value){ 24 int i,j; 25 for(i=0;i<n;i++) 26 for(j=0;j<n;j++) 27 x[i][j]=value; 28 29 }
截图
问题1
第二维的大小不能省略
问题2
函数output的功能是输出一个方阵,函数init的功能是让二维数组中的值都一样
任务四
源代码
1 #include <stdio.h> 2 #define N 100 3 void 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 15 16 return 0; 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 median(int x[],int n){ 25 int i,j,t; 26 for(j=0;j<=n-2;j++) 27 for(i=0;i<n-j-1;i++){ 28 if(x[i]>x[i+1]){ 29 t=x[i]; 30 x[i]=x[i+1]; 31 x[i+1]=x[i]; 32 } 33 } 34 double ans; 35 if(n%2==0) 36 ans=(x[(n-2)/2]+x[n/2])/2.0; 37 else 38 ans=x[(n-1)/2]; 39 40 return ans; 41 }
截图
任务五
源代码
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 int main(){ 7 int x[N][N]; 8 int n; 9 printf("Enter n: "); 10 scanf("%d",&n); 11 input(x,n); 12 printf("原始方阵:\n"); 13 output(x,n); 14 rotate_to_right(x,n); 15 printf("变换后矩阵:\n"); 16 output(x,n); 17 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 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 } 35 printf("\n"); 36 } 37 38 } 39 void rotate_to_right(int x[][N],int n){ 40 int i,j,t; 41 for(i=0;i<n;i++){ 42 t=x[i][n-1]; 43 for(j=n-1;j>0;j--) 44 x[i][j]=x[i][j-1]; 45 x[i][0]=t; 46 } 47 48 49 }
截图
任务六
源代码
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 printf("\n"); 11 } 12 return 0; 13 } 14 void dec_to_n(int x,int n){ 15 int m[N],i=0,a; 16 do{ 17 a=x%n; 18 if(a<10) 19 m[i]=a+'0'; 20 if(a>=10&&a<=15) 21 m[i]='A'+(a-10); 22 x/=n; 23 i++; 24 }while(x!=0); 25 26 do{ 27 printf("%c",m[i-1]); 28 i--; 29 }while(i>=0); 30 31 printf("\n"); 32 }
截图
任务七
源代码
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 i,j,sum_magic=0,sum_hang=0,sum_lie=0,sum_dui1=0,sum_dui2=0; 38 for(j=0;j<n;j++){ 39 sum_magic+=x[0][j]; 40 } 41 for(i=1;i<n;i++){ 42 for(j=0;j<n;j++){ 43 sum_hang+=x[i][j]; 44 } 45 if(sum_hang!=sum_magic){ 46 return 0; 47 } 48 sum_hang=0 ; 49 } 50 for(j=0;j<n;j++){ 51 for(i=0;i<n;i++){ 52 sum_lie+=x[i][j]; 53 } 54 if(sum_lie!=sum_magic){ 55 return 0; 56 } 57 sum_lie=0; 58 } 59 for(i=0;i<n;i++){ 60 sum_dui1+=x[i][i]; 61 } 62 if(sum_dui1!=sum_magic){ 63 return 0; 64 } 65 66 for(i=0;i<n;i++){ 67 sum_dui2+=x[i][n-1-i]; 68 } 69 if(sum_dui2!=sum_magic){ 70 return 0; 71 } 72 else{ 73 return 1; 74 } 75 76 } 77 78 79 80
截图
任务八
源代码
1 #include <stdio.h> 2 int fu(int n); 3 #define N 100 4 int main(){ 5 int i; 6 for(i=1;i<100;i++){ 7 if(fu(i)) 8 break; 9 } 10 printf("%d",i); 11 return 0; 12 13 } 14 int fu(int i){ 15 int x[N],a,b; 16 a=i*i; 17 b=i*i*i; 18 int j=0; 19 do{ 20 x[j]=a%10; 21 a/=10; 22 j++; 23 }while(a!=0); 24 do{ 25 x[j]=b%10; 26 b/=10; 27 j++; 28 }while(b!=0); 29 if(j<10||j>10) 30 return 0; 31 for(int m=j-1;m>0;m--){ 32 for(int n=0;n<m;n++) 33 if(x[m]==x[n]) 34 return 0; 35 } 36 return 1; 37 }
截图