第四次作业
实验1
代码
#include<stdio.h> #define N 4 #define M 2 void test1(){ int x[N]={1,9,8,4}; int i; printf("sizeof(x)=%d\n",sizeof(x)); for(i=0;i<N;++i) printf("%p=%d\n",&x[i],x[i]); printf("x=%p\n",x); } void test2(){ int x[M][N]={{1,9,8,4},{2,0,4,9}}; int i,j; printf("sizeof(x)=%d\n",sizeof(x)); for(i=0;i<M;++i) for(j=0;j<N;++j) printf("%p:%d\n",&x[i][j],x[i][j]); printf("\n"); printf("x=%p\n",x); printf("x[0]=%p\n",x[0]); printf("x[1]=%p\n",x[1]); printf("\n"); } int main() { printf("测试1:int型一维数组\n"); test1(); printf("\n测试2:int型一维数组\n"); test2(); return 0; }
运行结果
int型一维数数组x在内存中的排放是连续的,x和&x[0]含义相同,都是数组的首地址;
int型二维数组是按行连续排放的,x,x,[0],&x[0][0]含义相同,代表第一行首地址,x[0]和x[1]相差16个字节,x[1]代表第二行首地址
实验2
代码
#include<stdio.h> #define 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]; ans=0; for(i=0;i<n;++i){ ans+=x[i]; if(x[i]>high) high=x[i]; else if(x[i]<low) low=x[i]; } ans=(ans-high-low)/(n-2); return ans; }
运行图片
input功能是给数组x赋值
compute是计算去除最大值和最小值其他的数的平均值
实验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; }
图片
1.列不能省略
2.output是输出数组所有元素,init是将数组所有元素赋值为value
实验4.
代码
1 #include <stdio.h> 2 #define N 100 3 4 double median(int x[],int n); 5 void input(int x[],int n); 6 7 int main() { 8 int x[N]; 9 int n; 10 11 double ans; 12 13 while(printf("Enter n: "), scanf("%d", &n) != EOF) { 14 input(x, n); 15 ans = median(x, n); 16 printf("ans = %g\n\n", ans); 17 } 18 19 return 0; 20 } 21 22 void input(int x[],int n){ 23 int i,j,temp; 24 for(i=0;i<n;i++){ 25 scanf("%d",&x[i]); 26 } 27 for(j=0;j<n-1;j++) 28 { 29 for(i=0;i<n-j-1;i++) 30 { 31 if (x[i]>x[i+1]) 32 { 33 temp=x[i]; 34 x[i]=x[i+1]; 35 x[i+1]=temp; 36 } 37 } 38 } 39 } 40 41 double median(int x[],int n){ 42 double r; 43 int k; 44 if(n%2==0) 45 46 r=(x[n/2]+x[n/2-1])*1.0/2; 47 48 else 49 r=x[(n-1)/2]; 50 return r; 51 }
图片
实验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 int main() { 10 int x[N][N]; 11 int n; 12 13 printf("输入n: "); 14 scanf("%d", &n); 15 input(x, n); 16 17 printf("原始矩阵:\n"); 18 output(x, n); 19 20 rotate_to_right(x,n); 21 22 printf("变换后矩阵:\n"); 23 output(x, n); 24 25 return 0; 26 } 27 28 // 函数定义 29 // 功能: 输入一个n*n的矩阵x 30 void input(int x[][N], int n) { 31 int i, j; 32 33 for (i = 0; i < n; ++i) { 34 for (j = 0; j < n; ++j) 35 scanf("%d", &x[i][j]); 36 } 37 } 38 39 // 函数定义 40 // 功能: 输出一个n*n的矩阵x 41 void output(int x[][N], int n) { 42 int i, j; 43 44 for (i = 0; i < n; ++i) { 45 for (j = 0; j < n; ++j) 46 printf("%4d", x[i][j]); 47 48 printf("\n"); 49 } 50 } 51 52 // 函数rotate_to_right定义 53 // 功能: 把一个n*n的矩阵x,每一列向右移, 最右边被移出去的一列绕回左边 54 // 待补足 55 // xxx 56 void rotate_to_right(int x[][N],int n){ 57 int left =0,right = n-1; 58 int i,j; 59 int b[N]; 60 for(i=0;i<n;i++){ 61 62 b[i]=x[i][right]; 63 for(j=0;j<n-1;j++) 64 { 65 x[i][right-j]=x[i][right-j-1]; 66 } 67 x[i][left]=b[i]; 68 69 } 70 }
图片
实验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); // 函数调用: 把x转换成二进制输出 11 dec_to_n(x, 8); // 函数调用: 把x转换成八进制输出 12 dec_to_n(x, 16); // 函数调用: 把x转换成十六进制输出 13 14 printf("\n"); 15 } 16 17 return 0; 18 } 19 20 // 函数定义 21 // 功能: 把十进制数x转换成n进制,打印输出 22 // 补足函数实现 23 // xxx 24 void dec_to_n(int x, int n){ 25 char a[100]; 26 int i=0,cnt=0,r=0; 27 while(x!=0){ 28 r=x%n; 29 x=x/n; 30 if(r<10) 31 a[i++]=r+'0'; 32 else 33 a[i++]=(r-10)+'A'; 34 cnt++; 35 } 36 for(i=cnt-1;i>=0;i--) 37 printf("%c",a[i]); 38 printf("\n"); 39 }
图片
任务7
代码
1 int is_magic(int x[][N],int n){ 2 int sum[100]; 3 int t=0; 4 int i,j; 5 for(i=0;i<n;i++){ 6 for(j=0;j<n;j++) 7 sum[t]+=x[i][j]; 8 t++; 9 } 10 for(j=0;j<n;j++){ 11 for(i=0;i<n;i++) 12 sum[t]+=x[i][j]; 13 t++; 14 } 15 for(i=0;i<n;i++) 16 sum[t]+=x[i][i]; 17 t++; 18 for(i=0;i<n;i++) 19 sum[t]+=x[n-1-i][i]; 20 t++; 21 for(i=0;i<t-1;i++) 22 { 23 if(x[i]!=x[i+1]) 24 return 0; 25 } 26 return 1; 27 }
结果图片
任务8
代码
1 #include<stdio.h> 2 #define N 1000 3 int f(int i) 4 { 5 int m,n,l,k; 6 int a[N]; 7 int j,t=0,s; 8 m=i*i; 9 n=i*i*i; 10 do{ 11 l=m%10; 12 a[t++]=l; 13 m=m/10; 14 }while(m!=0); 15 do{ 16 k=n%10; 17 a[t++]=k; 18 n=n/10; 19 }while(n!=0); 20 for(s=0;s<t;s++){ 21 for(j=s+1;j<t;j++) 22 { 23 if(a[s]==a[j]) 24 return 0; 25 } 26 } 27 if(t!=10) 28 return 0; 29 else if(t==10) 30 return 1; 31 } 32 int main() 33 { 34 int i; 35 for(i=0;i<1000;i++) 36 { 37 if(f(i)){ 38 printf("%d\n",i); 39 break; 40 } 41 } 42 return 0; 43 }
图片