1.实验任务1

task1.c

源代码

 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   // 输出数组x占用的内存字节数
 8   printf("sizeof(x) = %d\n", sizeof(x));
 9   // 输出每个元素的地址、值
10   for (i=0; i < M; ++i)
11   printf("%p: %d\n", &x[i], x[i]);
12   // 输出数组名x对应的值
13 printf("x = %p\n", x);
14 }
15 void test2() {
16   int x[M][N] = {{1, 9, 8, 4}, {2, 0, 4, 9}};
17   int i, j;
18 
19   // 输出二维数组x占用的内存字节数
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   // 输出二维数组名x, 以及,x[0], x[1]的值
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 int main() {
33   printf("测试1: int型一维数组\n");
34   test1();
35   printf("\n测试2: int型二维数组\n");
36   test2();
37   return 0;
38 }

 

运行结果截图

4task1.c

 

问题1:是连续存放的。值相同。

问题2:是按行连续存放的。值相同。相差了16。含义是二维数组一行所有元素所占的位置。

2.实验任务2

task2.c

源代码

 1 #include <stdio.h>
 2 #define N 100
 3 // 函数声明
 4 void input(int x[], int n);
 5 double compute(int x[], int n);
 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 // 函数定义
18 void input(int x[], int n) {
19   int i;
20   for(i = 0; i < n; ++i)
21   scanf("%d", &x[i]);
22 }
23 // 函数定义
24 double compute(int x[], int n) {
25   int i, high, low;
26   double ans;
27   high = low = x[0];
28   ans = 0;
29   for(i = 0; i < n; ++i) {
30   ans += x[i];
31   if(x[i] > high)
32     high = x[i];
33    else if(x[i] < low)
34      low = x[i];
35  }
36   ans = (ans - high - low)/(n-2);
37   return ans;
38 }

 

运行结果截图

 4task2.c

 

问题1:形参书写形式:int x[ ],实参书写形式:直接写数组名x。

问题2:input函数功能:输入n个整数,依次存入数组x中。compute函数功能:计算并返回去掉一个最高分,一个最低分后的平均分。

3.实验任务3

task3.c

源代码

 1 #include <stdio.h>
 2 #define N 100
 3 // 函数声明
 4 void output(int x[][N], int n);
 5 void init(int x[][N], int n, int value);
 6 int main() {
 7   int x[N][N];
 8   int n, value;
 9   while(printf("Enter n and value: "), scanf("%d%d", &n, &value) != EOF) {
10     init(x, n, value);  // 函数调用
11     output(x, n);    // 函数调用
12     printf("\n");
13  }
14   return 0;
15 }
16 // 函数定义
17 void output(int x[][N], int n) {
18   int i, j;
19   for(i = 0; i < n; ++i) {
20     for(j = 0; j < n; ++j)
21       printf("%d ", x[i][j]);
22     printf("\n");
23  }
24 }
25 // 函数定义
26 void init(int x[][N], int n, int value) {
27   int i, j;
28   for(i = 0; i < n; ++i)
29     for(j = 0; j < n; ++j)
30  x[i][j] = value;
31 }

 

运行结果截图

4task3.c

 

问题1:形参书写形式:int x[ ][N],实参书写形式:直接写二维数组名x。

问题2:第二维大小不能忽略。

问题3:output的功能是按行列格式输出n×n二维数组的所有元素,init的功能是将n×n二维数组的所有元素统一赋值为参数value。

4.实验任务4

task4.c

源代码

 1 #include <stdio.h>
 2 #define N 100
 3 
 4 // 函数声明
 5 // 待补足
 6 // xxx
 7 void input(int x[],int n);
 8 double median(int x[],int n);
 9 int main() {
10     int x[N];
11     int n;
12     double ans;
13 
14     while(printf("Enter n: "), scanf("%d", &n) != EOF) {
15         input(x, n);
16         ans = median(x, n);
17         printf("ans = %g\n\n", ans);
18     }
19 
20     return 0;
21 }
22 
23 // 函数定义
24 // 待补足
25 // xxx
26 void input(int x[],int n){
27     int i;
28     
29     for(i=0;i<n;i++)
30     {
31         scanf("%d",&x[i]);
32     }
33 }
34 double median(int x[],int n){
35     int i,j,t;
36     for(i=0;i<n-1;i++){
37         for(j=0;j<n-i-1 ;j++){
38             if(x[j]>x[j+1]){
39                 t=x[j];
40                 x[j]=x[j+1];
41                 x[j+1]=t;
42             }
43         }
44     }
45 
46     if( n % 2 == 1)
47         return x[n/2];
48     else
49         return (x[n/2]+x[n/2-1])/2.0;
50 
51 }

 

运行结果截图

4task4.c

 

5.实验任务5

task5.c

源代码

 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 // 函数rotate_to_right声明
 8 // 待补足
 9 // ×××
10 void rotate_to_right(int x[][N],int n);
11 
12 int main() {
13     int x[N][N];
14     int n;
15 
16     printf("输入n: "); 
17     scanf("%d", &n);
18     input(x, n);
19 
20     printf("原始矩阵:\n");
21     output(x, n);
22 
23     // 函数rotate_to_right调用
24     // 待补足
25     rotate_to_right(x,n);
26 
27     printf("变换后矩阵:\n");
28     output(x, n);
29     return 0;
30 }
31 
32 // 函数定义
33 // 功能: 输入一个n*n的矩阵x
34 void input(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             scanf("%d", &x[i][j]);
40     }
41 }
42 
43 // 函数定义
44 // 功能: 输出一个n*n的矩阵x
45 void output(int x[][N], int n) {
46     int i, j;
47 
48     for (i = 0; i < n; ++i) {
49         for (j = 0; j < n; ++j)
50             printf("%4d", x[i][j]);
51 
52         printf("\n");
53     }
54 }
55 
56 // 函数rotate_to_right定义
57 // 功能: 把一个n*n的矩阵x,每一列向右移, 最右边被移出去的一列绕回左边
58 // 待补足
59 // xxx
60 void rotate_to_right(int x[][N],int n){
61     int i,j,k,temp[N];
62     for(i=0;i<n;i++){
63         temp[i]=x[i][n-1];
64     }
65     for(i=n-1;i>0;i--){
66         for(j=0;j<n;j++){
67             x[j][i] = x[j][i-1];
68         }
69     }
70     for(i=0;i<n;i++)
71         x[i][0]=temp[i];
72 }

 

运行结果截图

4task5.c

 

6.实验任务6

task6.c

源代码

 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);  // 函数调用: 把x转换成二进制输出
 8     dec_to_n(x, 8);  // 函数调用: 把x转换成八进制输出
 9     dec_to_n(x, 16); // 函数调用: 把x转换成十六进制输出
10     printf("\n");
11     }
12 return 0;
13 }
14 // 函数定义
15 // 功能: 把十进制数x转换成n进制,打印输出
16 // 补足函数实现
17 // xxx
18 void dec_to_n(int x,int n){
19     char map[]="0123456789ABCDEF";
20     char ans[N];
21     int d,r;
22     int cnt=0;
23     while(1){
24         r=x%n;
25         d=x/n;
26         ans[cnt++]=map[r];
27         if(d==0)
28             break;
29         x=d;
30     }
31     for(--cnt;cnt>=0;--cnt)
32         printf("%c",ans[cnt]);
33         printf("\n");
34 }

 

运行结果截图

task6

 

7.实验任务7

task7.c

源代码

 

 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 // 待补足函数is_magic声明
 7 int is_magic(int x[][N], int n);
 8 
 9 int main() {
10     int x[N][N];
11     int n;
12     while(printf("输入n: "), scanf("%d", &n) != EOF) {
13         printf("输入方阵:\n");
14         input(x, n);
15         printf("输出方阵:\n");
16         output(x, n);
17         if(is_magic(x, n))
18             printf("是魔方矩阵\n\n");
19         else
20             printf("不是魔方矩阵\n\n");
21     }
22     return 0;
23 }
24 
25 // 函数定义
26 // 功能: 输入一个n*n的矩阵x
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 
35 // 功能: 输出一个n*n的矩阵x
36 void output(int x[][N], int n) {
37     int i, j;
38     for (i = 0; i < n; ++i) {
39         for (j = 0; j < n; ++j)
40             printf("%4d", x[i][j]);
41         printf("\n");
42     }
43 }
44 
45 // 功能: 判断一个n阶方阵是否为魔方矩阵,如果是,返回1,否则,返回0
46 int is_magic(int x[][N], int n)
47 {
48     int i,j,sum,magic_sum;
49     magic_sum = n*(n*n+1)/2;
50 
51     for(i=0;i<n;i++)
52     {
53         sum=0;
54         for(j=0;j<n;j++)
55             sum+=x[i][j];
56         if(sum!=magic_sum)
57             return 0;
58     }
59 
60     for(j=0;j<n;j++)
61     {
62         sum=0;
63         for(i=0;i<n;i++)
64             sum+=x[i][j];
65         if(sum!=magic_sum)
66             return 0;
67     }
68 
69     sum=0;
70     for(i=0;i<n;i++)
71         sum+=x[i][i];
72     if(sum!=magic_sum)
73         return 0;
74 
75     sum=0;
76     for(i=0;i<n;i++)
77         sum+=x[i][n-1-i];
78     if(sum!=magic_sum)
79         return 0;
80 
81     return 1;
82 }

 

运行结果截图

4task.7.1.c

4task7.2.c

4task7.3.c

4task7.4.c

 

算法思路说明:先计算标准幻和: n*(n²+1)/2 。依次检查:每行元素之和是否等于幻和;每列元素之和是否等于幻和;主对角线元素之和是否等于幻和; 副对角线元素之和是否等于幻和。全部满足则判定为魔方矩阵,返回1;任意一项不满足则返回0。

五.实验总结:这次实验主要围绕C语言数组、函数传参和冒泡排序展开,还结合了魔方矩阵判断的代码练习,收获很实在。首先搞懂了一维、二维数组怎么定义、初始化和用下标访问,二维数组在存方阵时特别好用,像魔方矩阵就是典型应用。然后重点掌握了数组做函数参数的写法,声明、定义、调用格式要统一,二维数组必须指定第二维大小,函数里能直接改原数组内容。