实验四
task1
#include <stdio.h> #define N 4 //定义两个常量,如N=4,M=2 #define M 2 void test1(){ int x[N]={1,9,8,4};//将N初始化,赋予N初始值1,9,8,4 int i; printf("sizeof(x)=%d\n",sizeof(x));//输出数组x占用的内存字节数 for(i=0;i<N;++i){ printf("%p:%d\n",&x[i],x[i]);//输出每个元素的地址、值 //%p是格式控制符,专门用于输出变量存储的内存地址 //第一个x[i]是取该元素内存地址,第二个x[i]则表示具体数值 } printf("x=%p\n",x);//输出数组名x对应的值 } void test2(){ int x[M][N]={{1,9,8,4},{2,0,4,9}};//定义并初始化一个二维数组,定义两行四列,第一行1,9,8,4。第二行2,0,4,9 int i,j; printf("sizeof(x)=%d\n",sizeof(x));//输出二维数组x占用的内存字节数 for(i=0;i<M;++i){ for(j=0;j<N;++j){ printf("%p:%d\n",&x[i][j],x[i][j]);//第一个x[i]是取该元素内存地址,第二个x[i]则表示具体数值 } printf("\n"); } printf("x=%p\n",x);//输出二维数组名x对应的地址=第0行的起始地址 printf("x[0]=%p\n",x[0]);//输出第0行的数组名x[0]对应的地址=第0行第0列元素的起始地址 printf("x[1]=%p\n",x[1]);//输出第1行的数组名x[1]对应的地址=第1行第0列元素的起始地址 printf("\n"); } int main(){ printf("测试1:int型一维数组\n"); test1(); printf("测试2:int型二维数组\n"); test2(); return 0; }
task1 运行截图

ans1:一维数组x在内存中连续存放,x和&x[0]的值完全相同
ans2:二维数组x在内存中连续存放,x[0]和&x[0][0]的值完全相同,x[0]和x[1]相差16,该差值的含义是 相差一行字节(4个)的内存字节数4*4=16
task2
#include <stdio.h> #define N 100//N的值为100,确定数组的最大长度 void input(int x[],int n);//定义函数 double compute(int x[],int n); //定义函数 int main(){ int x[N];//点明数组的使用 int n,i; double ans; while(printf("Enter n:"),scanf("%d",&n)!=EOF){ input(x,n);//函数调用 ans=compute(x,n);//函数调用 printf("ans=%.2f\n\n",ans);//输出保留两位小数 } return 0; } void input(int x[],int n){ int i; for(i=0;i<n;++i) scanf("%d",&x[i]);//将读取到的用户输入的整数存储到数组中,便于后续的计算函数的运用 } double compute(int x[],int n){ int i,high,low; double ans; high=low=x[0];//x[0]=0 ans=0; for(i=0;i<n;++i){ ans+=x[i];//计算ans总结果 if(x[i]>high)//取最大值最小值过程 high=x[i]; else if(x[i]<low) low=x[i]; } ans=(ans-high-low)/(n-2);//计算减去最大值最小值后的平均数 return ans; }
task2 运行截图

ans1:input的形参是int x[],实参书写形式是数组
ans2: input的功能是将用户外部输入的数字储存于数组之中,compute的功能是计算用户输入数字去掉最大值与最小值后的平均值
task 3
#include <stdio.h> #define N 100 //函数声明 void output(int x[][N],int n); void init(int x[][N],int n,int value); int main(){ int x[N][N]; int n,value; while(printf("Enter n and value:"),scanf("%d%d",&n,&value)!=EOF){ init(x,n,value); output(x,n); printf("\n"); } return 0; } void output(int x[][N],int n){ int i,j; for(i=0;i<n;++i){ for(j=0;j<n;++j){ printf("%d",x[i][j]); } printf("\n"); } } void init(int x[][N],int n,int value){ int i,j; for(i=0;i<n;++i){ for(j=0;j<n;++j) x[i][j]=value; } }
task 3运行截图

ans1:output的形参是intx[][N],实参是数组x[i][j]
ans2:不可以省略,如果省略便会导致不知数组范围,导致编译器无法识别并进行。
ans3:output作用为输出数组x[i][j]数值,init的作用为将value的值赋予数组,便于函数output的运行。
task 4
#include <stdio.h> #define N 100 double median(int x[],int n); void input(int x[],int n); int main(){ int x[N]; int n; double ans; while(printf("Enter n:"),scanf("%d",&n)!=EOF){ input(x,n); ans=median(x,n); printf("ans=%g\n\n",ans); } return 0; } void input(int x[],int n){ int i,j,t; for(i=0;i<n;++i){ scanf("%d",&x[i]); } for(i=0;i<n;++i){ for(j=0;j<n;++j){ if(x[j]>x[j+1]){ t=x[j]; x[j]=x[j+1]; x[j+1]=t; } } } } double median(int x[],int n){ double ans; if(n%2==1){ ans=x[(n+1)/2]; } else{ ans=(x[n/2]+x[n/2-1])/2.0; } return ans; }
task 4运行截图

task 5
#include <stdio.h> #define N 100 void input(int x[][N],int n); void output(int x[][N],int n); void rotate_to_right(int x[][N],int n); int main(){ int x[N][N]; int n; printf("Enter n:"); scanf("%d",&n); input(x,n); printf("原始矩阵:\n"); output(x,n); rotate_to_right(x,n); printf("变换后的矩阵:\n"); output(x,n); return 0; } void input(int x[][N],int n){ int i,j; for(i=0;i<n;++i){ for(j=0;j<n;++j){ scanf("%d",&x[i][j]); } } } void output(int x[][N],int n){ int i,j; for(i=0;i<n;++i){ for(j=0;j<n;++j){ printf("%4d",x[i][j]); } printf("\n"); } } void rotate_to_right(int x[][N],int n){ int t[N][N],i,j; for(i=0;i<n;++i){ t[i][0]=x[i][n-1]; for(j=n-2;j>=0;--j){ x[i][j+1]=x[i][j]; } x[i][0]=t[i][0]; } }
task 5 运行截图

task 6
#include <stdio.h> #define N 100 void dec_to_n(int x,int n); int main(){ int x; while(printf("输入十进制整数:"),scanf("%d",&x)!=EOF){ dec_to_n(x,2); dec_to_n(x,8); dec_to_n(x,16); printf("\n"); } return 0; } void dec_to_n(int x,int n){ int ans[N]; int i=0,j; while(x!=0){ ans[i]=x%n; x=x/n; ++i; } for(j=i-1;j>=0;--j){ if(ans[j]>=10){ printf("%c",'A'+ans[j]-10); } else{ printf("%d",ans[j]); } } printf("\n"); }
task 6 运行截图

task 7
#include <stdio.h> #define N 100 #include <math.h> #define _CRT_SECURE_NO_WARNINGS void input(int x[][N],int n); void output(int x[][N],int n); int is_magic(int x[][N],int n); int main(){ int x[N][N]; int n; while(printf("输入n:"),scanf("%d",&n)!=EOF){ printf("输入方阵:\n"); input(x,n); printf("输出方阵:\n"); output(x,n); if(is_magic(x,n)){ printf("是魔方矩阵\n\n"); } else{ printf("不是魔方矩阵\n\n"); } } return 0; } void input(int x[][N],int n){ int i,j; for(i=0;i<n;++i){ for(j=0;j<n;++j){ scanf("%d",&x[i][j]); } } } void output(int x[][N],int n){ int i,j; for(i=0;i<n;++i){ for(j=0;j<n;++j){ printf("%4d",x[i][j]); } printf("\n"); } } int is_magic(int x[][N],int n){ int i,j; int sum1,sum2,sum3=0,sum4=0; if(n%2==0){ return 0; } //判断有没有重复元素 int y[N*N+1]={0}; for(i=0;i<n;++i){ for(j=0;j<n;++j){ int a=x[i][j]; if(y[a]!=0){ return 0; } else if(a<1||a>(n*n)){ return 0; } y[a]=1; } } int ans=0; for(j=0;j<n;++j){ ans+=x[0][j]; } //行 for(i=1;i<n;++i){ int sum1=0; for(j=0;j<n;++j){ sum1+=x[i][j]; } if(sum1!=ans){ return 0; } } //列 for(j=0;j<n;++j){ int sum2=0; for(i=0;i<n;++i){ sum2+=x[i][j]; } if(sum2!=ans) return 0; } //主对角线 for(i=0;i<n;++i){ sum3+=x[i][i]; } if(sum3!=ans){ return 0; } //副对角线 for(i=0;i<n;++i){ sum4+=x[i][n-1-i]; } if(sum4!=ans){ return 0; } return 1; }
task 7 运行截图




浙公网安备 33010602011771号