实验四
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 printf("\n测试2: int型二维数组\n"); 29 test2(); 30 return 0; 31 }

问题一:是连续存放 相同
问题二:是 相同 16 差值的含义是二维数组一行所占内存
1 #include<stdio.h> 2 #define N 100 3 void input(int x[ ], int n); 4 double compute(int x[ ], int n); 5 6 7 int main(){ 8 int x[N]; 9 int n,i; 10 double ans; 11 12 13 while(printf("Enter n: "), scanf("%d",&n)!=EOF){ 14 input(x,n); 15 ans=compute(x,n); 16 printf("ans=%.2f\n\n",ans); 17 } 18 return 0; 19 } 20 21 22 void input(int x[ ],int n){ 23 24 25 int i; 26 for (i=0;i<n;++i) 27 scanf("%d",&x[i]); 28 } 29 30 31 double compute(int x[],int n){ 32 int i,high,low; 33 double ans; 34 35 36 high=low=x[0]; 37 ans=0; 38 39 40 for(i=0;i<n;++i){ 41 ans+=x[i]; 42 43 44 if(x[i]>high) 45 high=x[i]; 46 47 48 else if(x[i]<low) 49 low=x[i]; 50 } 51 ans = (ans-high- low)/(n-2); 52 53 54 return ans;

问题一:input的形式参数书写形式为input (int x[], int n) 实际参数书写形式为x n
问题二:input的功能:n代表输入的数字个数 然后input函数读取所输入的n个数字存储到x[i]中
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 }

问题一:形式参数书写形式 output(int x[][N], int n) 实际参数书写形式x,n
问题二:不能省略
问题三:output的功能是将x[i][j]按照n行n列输出 init的功能是将所输入的value值赋给x[i][j]
1 #include <stdio.h> 2 #define N 100 3 // 函数声明 4 // 待补足 5 // xxx 6 void input(int x[],int n); 7 double median(int x[],int n); 8 int main() { 9 int x[N]; 10 int n; 11 double ans; 12 while(printf("Enter n: "), scanf("%d", &n) != EOF) { 13 input(x, n); // 函数调用 14 ans = median(x, n); // 函数调用 15 printf("ans = %g\n\n", ans); 16 } 17 return 0; 18 } 19 // 函数定义 20 // 待补足 21 // xxx 22 void input(int x[],int n){ 23 int i; 24 for(i=0;i<n;++i) 25 scanf("%d",&x[i]); 26 } 27 double median(int x[],int n){ 28 int i,j,t=0; 29 double ans; 30 for(i=0;i<n-1;i++){ 31 for(j=0;j<n-i-1;j++){ 32 if(x[j]<x[j+1]){ 33 t=x[j]; 34 x[j]=x[j+1]; 35 x[j+1]=t; 36 } 37 } 38 } 39 if(n%2==1) 40 return x[n/2]; 41 else 42 return (x[n/2]+x[n/2-1])/2.0; 43 }

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 // 函数rotate_to_right声明 7 // 待补足 8 int rotate_to_right(int x[][N],int n); 9 int main() { 10 int x[N][N]; 11 int n; 12 printf("Enter n: "); 13 scanf("%d", &n); 14 input(x, n); 15 printf("原始矩阵:\n"); 16 output(x, n); 17 // 函数rotate_to_right调用 18 // 待补足 19 rotate_to_right(x,n); 20 printf("变换后矩阵:\n"); 21 output(x, n); 22 return 0; 23 } 24 // 函数定义 25 // 功能: 输入一个n*n的矩阵x 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 // 函数定义 34 // 功能: 输出一个n*n的矩阵x 35 void output(int x[][N], int n) { 36 int i, j; 37 for (i = 0; i < n; ++i) { 38 for (j = 0; j < n; ++j) 39 printf("%4d", x[i][j]); 40 printf("\n"); 41 } 42 } 43 int rotate_to_right(int x[][N],int n){ 44 int i,j,t[N]; 45 for(i=0;i<n;++i){ 46 t[i]=x[i][n-1]; 47 } 48 for (j = n-2; j >= 0; j--) { 49 for (i = 0; i < n; i++) { 50 x[i][j+1] = x[i][j]; 51 } 52 } 53 for (i = 0; i < n; i++) { 54 x[i][0] = t[i]; 55 } 56 }

1 #include <stdio.h> 2 #define N 100 3 void dec_to_n(int x, int n); // 函数声明 4 5 int main() { 6 int x; 7 8 while(printf("输入十进制整数: "), scanf("%d", &x) != EOF) { 9 dec_to_n(x, 2); // 函数调用: 把x转换成二进制输出 10 dec_to_n(x, 8); // 函数调用: 把x转换成八进制输出 11 dec_to_n(x, 16); // 函数调用: 把x转换成十六进制输出 12 13 printf("\n"); 14 } 15 return 0; 16 } 17 void dec_to_n(int x, int n) { 18 int t[N]; 19 int cnt = 0; 20 char b[] = "0123456789ABCDEF"; 21 while (x> 0) { 22 t[cnt++] = x % n; 23 x = x / n; 24 } 25 for (int i = cnt - 1; i >= 0; i--) { 26 if (n == 16) { 27 printf("%c", b[t[i]]); 28 } else { 29 printf("%d", t[i]); 30 } 31 } 32 printf("\n"); 33 }

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 7 int main() { 8 int x[N][N]; 9 int n; 10 11 while(printf("输入n: "), scanf("%d", &n) != EOF) { 12 printf("输入方阵:\n"); 13 input(x, n); 14 15 printf("输出方阵:\n"); 16 output(x, n); 17 18 if(is_magic(x, n)) 19 printf("是魔方矩阵\n\n"); 20 else 21 printf("不是魔方矩阵\n\n"); 22 } 23 24 return 0; 25 } 26 void input(int x[][N], int n) { 27 int i, j; 28 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 37 for (i = 0; i < n; ++i) { 38 for (j = 0; j < n; ++j) 39 printf("%4d", x[i][j]); 40 41 printf("\n"); 42 } 43 } 44 int is_magic(int x[][N], int n) { 45 int i,j; 46 if (n % 2 == 0) return 0; 47 int sum = n * (n*n + 1) / 2; 48 for (i =0; i <n; ++i) { 49 int hangsum =0; 50 for(j=0; j<n; ++j) 51 hangsum +=x[i][j]; 52 if (hangsum != sum) 53 return 0; 54 } 55 for (j=0; j<n; ++j) { 56 int liesum=0; 57 for ( i=0; i<n; ++i) 58 liesum +=x[i][j]; 59 if (liesum != sum) 60 return 0; 61 } 62 int zhuduisum=0; 63 for ( i=0; i<n; ++i) 64 zhuduisum +=x[i][i]; 65 if (zhuduisum != sum) 66 return 0; 67 int fuduisum=0; 68 for (i=0; i<n; ++i) 69 fuduisum +=x[i][n-1 -i]; 70 if (fuduisum != sum) 71 return 0; 72 return 1; 73 }

浙公网安备 33010602011771号