实验四

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

问题一

int型一维数组在内存中连续存放

数组名x和&x[0]对应的值一样

问题二

连续存放

字面上一样

x[0]和x[1]相差850

意义为相差一行

任务二

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

观察:

x[] 实参为整数

input的功能为将实际参数的值存放到形参的地址中,便于运算

compute的功能为去掉最大值,最小值,求一位数组的平均值

任务三

 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 
 7 int main() {
 8     int x[N][N];
 9     int n, value;
10 
11     while(printf("Enter n and value: "), scanf("%d%d", &n, &value) != EOF) {
12         init(x, n, value);  
13         output(x, n);      
14         printf("\n");
15     }
16 
17     return 0;
18 }
19 
20 void output(int x[][N], int n) {
21     int i, j;
22 
23     for(i = 0; i < n; ++i) {
24         for(j = 0; j < n; ++j)
25             printf("%d ", x[i][j]);
26         printf("\n");
27     }
28 }
29 
30 void init(int x[][N], int n, int value) {
31     int i, j;
32 
33     for(i = 0; i < n; ++i)
34         for(j = 0; j < n; ++j)
35             x[i][j] = value;
36 }

问题一:

第二维 列数不能省略

output的功能为输出二维数组

init的功能为为二维数组赋值

任务四

 1 #include <stdio.h>
 2 #define N 100
 3 
 4 void input(int x[],int n);
 5 double median(int x[],int n);
 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 
21 void input(int x[],int n){
22     int i;
23     for(i=0;i<n;i++)
24         scanf("%d",&x[i]);
25 }
26 
27 double median(int x[],int n){
28     int i,j,t;
29     double ans;
30     for(j=0;j<n-1;j++)
31         for(i=0;i<n-1;i++)
32             if(x[i]>x[i+1]){
33                 t=x[i];
34                 x[i]=x[i+1];
35                 x[i+1]=t;
36             }
37     if(n%2==0){
38         ans=(x[n/2]+x[n/2-1])/2.0;
39     }
40     else
41         ans=x[(n-1)/2];\
42         
43     return ans;
44      
45 }

 任务五

 

 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_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_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         printf("\n");
48     }
49 }
50 
51 // 函数定义
52 // 功能: 将 n*n 矩阵 x 循环右移一位
53 void rotate_right(int x[][N], int n) {
54     int temp[N];  
55     int i, j;    
56 
57     for (i = 0; i < n; i++) {
58         temp[i] = x[i][n - 1];  
59     }
60 
61     for (i = 0; i < n; i++) {
62         for (j = n - 1; j > 0; j--) {
63             x[i][j] = x[i][j - 1];  
64         }
65         x[i][0] = temp[i];  
66     }
67 }

任务六

 

 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);  
11         dec_to_n(x, 8);  
12         dec_to_n(x, 16); 
13 
14         printf("\n");
15     }
16 
17     return 0;
18 }
19 
20 // 函数定义
21 // 功能: 把十进制数x转换成n进制,打印输出
22 void dec_to_n(int x,int n){
23     char a[N];
24     int i=0,j;
25     while(x!=0){
26         if(x%n<10){
27             a[i]='0'+x%n;
28             i++;
29         }
30         else{
31             a[i]='A'+(x%n-10);
32             i++;
33         }
34         x/=n;
35     }
36     for(j=i-1;j>=0;j--)
37         printf("%c",a[j]);
38     printf("\n");
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 int is_magic(int x[][N],int n);
 8 
 9 int main() {
10     int x[N][N];
11     int n;
12 
13     while(printf("输入n: "), scanf("%d", &n) != EOF) {
14         printf("输入方阵:\n");  
15         input(x, n); 
16 
17         printf("输出方阵:\n");  
18         output(x, n);   
19 
20         if(is_magic(x, n))
21             printf("是魔方矩阵\n\n");
22         else
23             printf("不是魔方矩阵\n\n");
24     }
25 
26     return 0;
27 }
28 
29 // 函数定义
30 // 功能: 输入一个n*n的矩阵x
31 void input(int x[][N], int n) {
32     int i, j;
33     
34     for (i = 0; i < n; ++i) {
35         for (j = 0; j < n; ++j)
36             scanf("%d", &x[i][j]);
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 
53 // 功能: 判断一个n阶方阵是否为魔方矩阵,如果是,返回1,否则,返回0
54 int is_magic(int x[][N],int n){
55     int i,j,ans=0;
56     
57 
58     for(i=0;i<n;i++){
59         ans+=x[i][0];
60     }
61     
62     for(i=0;i<n;i++){
63         int ansj=0;
64         for(j=0;j<n;j++){
65             ansj+=x[i][j];            
66         }
67         if(ansj!=ans){
68                 return 0;
69             }
70     }
71     
72     for(j=0;j<n;j++){
73         int ansi=0;
74         for(i=0;i<n;i++){
75             ansi+=x[i][j];
76         }
77         if(ansi!=ans){
78                 return 0;
79             }
80     }
81     int ans3=0;
82     for(i=0;i<n;i++){
83         ans3+=x[i][i];        
84     }
85     if(ans3!=ans){
86             return 0;
87         }
88     int ans4=0;
89     for(i=0;i<n;i++){
90         ans4+=x[i][n-1-i];
91     }
92     if(ans4!=ans)
93         return 0;
94     
95     return 1;
96     
97 }

任务八

posted @ 2024-11-06 00:28  糯檽檽米  阅读(5)  评论(0编辑  收藏  举报