实验四
任务一: 问题一:int型一维数组x在内存中是连续存放的。数组名x和&x[0]对应的值相同都是数组的首地址。
任务二:int型一维数组x在内存中是按行连续存放的。x,x[0],&x[0]在字面上其对应的值是一样的。x[0]与x[1]相差16。这个差值是相差十六个字节。
观察:形参:void input(int x[], int n); 实参:input(x, n); 问题:input功能是记录输入的值;compute功能是找到输入值的最大和最小值,并用输入值减去最大和最小值后求平均值。
任务三: 观察:形参:void output(int x[][N], int n); 实参:void init(int x[][N], int n, int value) {} 问题一:第二维不能省略
问题二:output是将x[][]的值按特定格式输出,init功能是将输入的value的值存储在x[][]中。
任务四:
1 #include <stdio.h> 2 #define N 100 3 void input(int x[],int n); 4 double median(int x[],int n); 5 6 7 int main() { 8 int x[N]; 9 int n; 10 double ans; 11 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 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 double median(int x[],int n){ 26 int i, j, minIndex, temp; 27 for (i = 0; i < n - 1; i++) { 28 minIndex = i; 29 for (j = i + 1; j < n; j++) { 30 if (x[j] < x[minIndex]) { 31 minIndex = j; 32 } 33 } 34 if (minIndex!= i) { 35 temp = x[i]; 36 x[i] = x[minIndex]; 37 x[minIndex] = temp; 38 } 39 } 40 41 double ans; 42 if(n%2==0){ 43 ans=(double)(x[n/2-1]+x[n/2])/2; 44 } 45 else if(n%2!=0){ 46 ans=(double)x[(n-1)/2]; 47 48 } 49 return ans; 50 51 }
任务五:
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 void rotate_to_right(int x[][N],int n){ 53 int i,j; 54 for(i=0;i<n;i++){ 55 int temp=x[i][n-1]; 56 x[i][n-1]=x[i][0]; 57 x[i][0]=temp; 58 } 59 }
任务六:
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 void dec_to_n(int x,int n){ 20 int binary[32]; 21 int i=0,j=0; 22 while(x>0){ 23 binary[i]=x%n; 24 x=x/n; 25 i++; 26 } 27 28 29 for(j=i-1;j>=0;j--){ 30 if(n==16&&binary[j]>=10){ 31 printf("%c",binary[j]-10+'A'); 32 } 33 else 34 printf("%d",binary[j]); 35 } 36 printf("\n"); 37 38 39 }
任务七:
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 // 待补足函数is_magic声明 8 // xxx 9 10 int main() { 11 int x[N][N]; 12 int n; 13 14 while(printf("输入n: "), scanf("%d", &n) != EOF) { 15 printf("输入方阵:\n"); 16 input(x, n); 17 18 printf("输出方阵:\n"); 19 output(x, n); 20 21 if(is_magic(x, n)) 22 printf("是魔方矩阵\n\n"); 23 else 24 printf("不是魔方矩阵\n\n"); 25 } 26 27 return 0; 28 } 29 30 // 函数定义 31 // 功能: 输入一个n*n的矩阵x 32 void input(int x[][N], int n) { 33 int i, j; 34 35 for (i = 0; i < n; ++i) { 36 for (j = 0; j < n; ++j) 37 scanf("%d", &x[i][j]); 38 } 39 } 40 41 // 功能: 输出一个n*n的矩阵x 42 void output(int x[][N], int n) { 43 int i, j; 44 45 for (i = 0; i < n; ++i) { 46 for (j = 0; j < n; ++j) 47 printf("%4d", x[i][j]); 48 49 printf("\n"); 50 } 51 } 52 53 54 void is_magic(int x[][N], int n){ 55 int sum_diagonal1 = 0, sum_diagonal2 = 0; 56 int sum_row[100], sum_col[100]; 57 int i,j; 58 for (i = 0; i < n; i++) { 59 sum_row[i] = 0; 60 sum_col[i] = 0; 61 } 62 for (i = 0; i < n; i++) { 63 sum_diagonal1 += x[i][i]; 64 sum_diagonal2 += x[i][n - 1 - i]; 65 for (j = 0; j < n; j++) { 66 sum_row[i] += x[i][j]; 67 sum_col[i] += x[j][i]; 68 } 69 } 70 if (sum_diagonal1!= sum_diagonal2) { 71 return 0; 72 } 73 for (i = 0; i < n; i++) { 74 if (sum_row[i]!= sum_diagonal1 || sum_col[i]!= sum_diagonal1) { 75 return 0; 76 77 } 78 } 79 80 return 1; 81 }