Experiment4
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 8 printf("sizeof(x) = %d\n", sizeof(x)); 9 10 for (i = 0; i < N; ++i) 11 printf("%p: %d\n", &x[i], x[i]); 12 13 printf("x = %p\n", x); 14 } 15 16 void test2() { 17 int x[M][N] = {{1, 9, 8, 4}, {2, 0, 4, 9}}; 18 int i, j; 19 20 printf("sizeof(x) = %d\n", sizeof(x)); 21 22 for (i = 0; i < M; ++i) 23 for (j = 0; j < N; ++j) 24 printf("%p: %d\n", &x[i][j], x[i][j]); 25 printf("\n"); 26 27 printf("x = %p\n", x); 28 printf("x[0] = %p\n", x[0]); 29 printf("x[1] = %p\n", x[1]); 30 printf("\n"); 31 } 32 33 int main() { 34 printf("测试1: int型一维数组\n"); 35 test1(); 36 37 printf("\n测试2: int型二维数组\n"); 38 test2(); 39 40 return 0; 41 }

问题1:一维数组x在内存中连续存放,x和&x[0]的值相同,都代表第一个元素的地址
问题2:二位数组x在内存中按行连续存放,x,x[0]和&x[0][0]的值相同,x[0]和x[1]相差16,因为N=4,int类型占4个字节,含义:体现了二维数组中一行元素所占用的总内存字节数
Task2:
1 #include <stdio.h> 2 #define N 100 3 void input(int x[],int n); 4 double compute(int x[],int n); 5 6 int main(){ 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 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 }

问题1:
形参:void input(int x[ ],int n)
实参:input(x,n);
问题2:input函数功能:将输入的数依次存放在数组x中
compute函数功能:计算数组x中储存的数去掉一个最大值和最小值后剩余(n-2)个数的平均数
Task3:
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 }

问题1:
形参:void output(int x[ ][N], int n)
void init(int x[ ][N],int n,int value)
实参:init(x,n,value);
output(x,n);
问题二:
二维数组作为函数参数时,第二维大小不能省略,写成x[ ][ ]会报错
问题三:
函数output的功能:按矩阵格式输出二维数组的元素
函数init的功能:将二维数组的所有元素初始化为指定的value值
Task4:
1 #include <stdio.h> 2 #define N 100 3 4 void input(int x[],int n); 5 double median(int x[],int n); 6 void bubble_sort(int x[],int n); 7 8 int main(){ 9 int x[N]; 10 int n; 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 = %.1f\n\n",ans); 17 } 18 return 0; 19 } 20 void input(int x[],int n){ 21 int i; 22 for(i=0;i<n;i++){ 23 scanf("%d",&x[i]); 24 } 25 } 26 void bubble_sort(int x[],int n){ 27 int i,j,t; 28 for(i=0;i<n-1;i++){ 29 for(j=0;j<n-1-i;j++){ 30 if(x[j]>x[j+1]){ 31 t=x[j]; 32 x[j]=x[j+1]; 33 x[j+1]=t; 34 } 35 } 36 } 37 } 38 double median(int x[],int n){ 39 bubble_sort(x,n); 40 if(n%2==1){ 41 return(double)x[n/2]; 42 }else{ 43 return(x[n/2]+x[n/2 + 1])/2.0; 44 } 45 }

Task5:
1 #include <stdio.h> 2 #define N 100 3 4 void input(int x[][N],int n); 5 void output(int x[][N],int n); 6 void rotate_to_right(int x[][N],int n); 7 8 int main(){ 9 int x[N][N]; 10 int n; 11 printf("Enter n:"); 12 scanf("%d",&n); 13 input(x,n); 14 15 printf("原始矩阵:\n"); 16 output(x,n); 17 18 rotate_to_right(x,n); 19 20 printf("变化后的矩阵:\n"); 21 output(x,n); 22 23 return 0; 24 25 } 26 void input(int x[][N],int n){ 27 int i,j; 28 for(i=0;i<n;++i){ 29 for(j=0;j<n;++j) 30 scanf("%d",&x[i][j]); 31 } 32 } 33 void output(int x[][N],int n){ 34 int i,j; 35 for(i=0;i<n;++i){ 36 for(j=0;j<n;++j) 37 printf("%4d",x[i][j]); 38 39 printf("\n"); 40 } 41 } 42 void rotate_to_right(int x[][N],int n){ 43 int i,j,t; 44 for(i=0;i<n;i++){ 45 t = x[i][n-1]; 46 for(j = n-1;j>0;j--){ 47 x[i][j] = x[i][j-1]; 48 } 49 x[i][0] = t; 50 } 51 }

Task6:
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 char map[]={"0123456789ABCDEF"}; 16 char result[N]; 17 int index=0; 18 if(x<0){ 19 result[index++]='0'; 20 }else{ 21 while(x>0){ 22 int t=x%n; 23 result[index++]=map[t]; 24 x/=n; 25 } 26 } 27 for(int i=index-1;i>=0;i--){ 28 printf("%c",result[i]); 29 } 30 printf(" \n"); 31 }

Task7:
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 check_number(int x[][N],int n); 7 8 int main(){ 9 int x [N][N]; 10 int n; 11 while(printf("输入n:"),scanf("%d",&n)!=EOF){ 12 printf("输入方阵:\n"); 13 input(x,n); 14 printf("输出方阵:\n"); 15 output(x,n); 16 17 if(check_number(x,n)){ 18 if(is_magic(x,n)) 19 printf("是魔方矩阵\n\n");} 20 else 21 printf("不是魔方矩阵\n\n"); 22 23 } 24 return 0; 25 26 } 27 void input(int x[][N],int n){ 28 int i,j; 29 for (i=0;i<n;++i){ 30 for(j=0;j<n;++j){ 31 scanf("%d",&x[i][j]);} 32 } 33 } 34 void output(int x[][N],int n){ 35 int i,j; 36 for (i=0;i<n;++i){ 37 for(j=0;j<n;++j) 38 printf("%4d",x[i][j]); 39 printf("\n"); 40 } 41 } 42 int check_number(int x[][N],int n){ 43 int total = n*n; 44 int found[total+1]; 45 int i,j; 46 for(i=1;i<=total;i++){ 47 found[i]=0; 48 } 49 for(i=0;i<n;i++){ 50 for(j=0;j<n;j++){ 51 int num = x[i][j]; 52 if(num<1||num>total){ 53 return 0; 54 } 55 if (found[num]){ 56 return 0; 57 } 58 found[num]=1; 59 } 60 } 61 for(i=1;i<=total;i++){ 62 if(!found[i]){ 63 return 0; 64 } 65 } 66 return 1; 67 } 68 int is_magic(int x[][N],int n){ 69 int i,j; 70 int sum=0; 71 int t; 72 for(j=0;j<n;j++){ 73 sum+=x[0][j]; 74 } 75 for(i=0;i<n;i++){ 76 t=0; 77 for(j=0;j<n;j++){ 78 t+=x[i][j]; 79 } 80 if(t!=sum) 81 return 0; 82 } 83 for (j=0;j<n;j++){ 84 t=0; 85 for(i=0;i<n;i++){ 86 t+=x[i][j]; 87 } 88 if(t!=sum) 89 return 0; 90 } 91 t=0; 92 for(i=0;i<n;i++){ 93 t+=x[i][i]; 94 } 95 if(t!=sum) 96 return 0; 97 t=0; 98 for(i=0;i<n;i++){ 99 t+=x[i][n-1-i]; 100 } 101 if(t!=sum) 102 return 0; 103 else 104 return 1; 105 }




浙公网安备 33010602011771号