实验4

test1

 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 < N; ++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 // 输出二维数组x占用的内存字节数
19 printf("sizeof(x) = %d\n", sizeof(x));
20 // 输出每个元素的地址、值
21 for (i = 0; i < M; ++i)
22 for (j = 0; j < N; ++j)
23 printf("%p: %d\n", &x[i][j], x[i][j]);
24 printf("\n");
25 printf("x = %p\n", x);
26 printf("x[0] = %p\n", x[0]);
27 printf("x[1] = %p\n", x[1]);
28 printf("\n");
29 }
30 int main() {
31 printf("测试1: int型一维数组\n");
32 test1();
33 printf("\n测试2: int型二维数组\n");
34 test2();
35 return 0;
36 }

 

问题1:int型一维数组x,在内存中是否是连续存放的?数组名x对应的值,和&x[0]是一样的吗?
  连续存放,一样的
问题2:int型二维数组x,在内存中是否是"按行连续存放"的?数组名x的值、x[0]、&x[0][0],其
值,在字面上,是一样的吗?x[0]和x[1]相差多少?你能猜测/推断出这个差值的意义吗?

  是的,一样的,相差一行的字节数

test2

 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 }

观察:一维数组作为形参时,其书写形式?实参的书写形式?
int x[] 调用已知的一个数组
问题:函数input的功能是?函数compute的功能是?

 将数组的值输入进去,将这个数组中的所有数字去除最高值和最低值,再对剩下的所有数字求平均值

test 3

 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 // 函数定义
24 void init(int x[][N], int n, int value) {
25 int i, j;
26 for(i = 0; i < n; ++i)
27 for(j = 0; j < n; ++j)
28 x[i][j] = value;
29 }

 

问题1:两维数组作为函数形参时,哪一维的大小不能省略?
第二维 列数 不能省略
问题2:函数output功能是?函数init的功能是?
将数组中的每一个元素都赋值为value 将这数组打印出来

test 4

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

 test 5

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

 test 6

 1 #include <stdio.h>                              
 2 #define N 100
 3 void dec_to_n(int x, int n) {
 4     int a[N] = {0};
 5     int i = 0;
 6     if (n == 2) {
 7         while (x!= 0) {
 8             a[i]=x % 2;
 9             x /= 2;
10             i++;
11         }
12     }
13     else if (n == 8) {
14         i = 0;
15         while (x!= 0) {
16             a[i]=x % 8;
17             x /= 8;
18             i++;
19         }
20     }
21     else if (n == 16) {
22         i = 0;
23         while (x!= 0) {
24             int f = x % 16;
25             if (f < 10) {
26                 a[i]=f + '0';
27             } else {
28                 a[i]=f - 10 + 'A';
29             }
30             x /= 16;
31             i++;
32         }
33     }
34     int m = (i - 1) / 2;
35     for (int j = 0; j <= m; j++) {
36         int temp;
37         temp = a[j];
38         a[j] = a[i - 1 - j];
39         a[i - 1 - j] = temp;
40     }
41     if(n==16){
42     for (int k = 0; k < i; k++) {
43         printf("%c", a[k]);
44     }
45     printf("\n");
46 }else if(n==2||n==8){
47     for (int k = 0; k < i; k++) {
48         printf("%d", a[k]);
49     }
50     printf("\n");
51 }
52 }
53     
54 int main() {
55     int x;
56     while (printf("输入十进制整数: "), scanf("%d", &x)!= EOF) {
57         printf("二进制: ");
58         dec_to_n(x, 2);
59         printf("八进制: ");
60         dec_to_n(x, 8);
61         printf("十六进制: ");
62         dec_to_n(x, 16);
63     }
64     return 0;}

 test 7

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

 

 test 8

 1 #include <stdio.h>        
 2 #define N 100
 3 int main() {
 4     int n;
 5     while (printf("请输入数字:"), scanf("%d", &n)!= EOF) {
 6         int x = n * n;
 7         int y = n * n * n;
 8         int a[N], b[N];
 9         int j = 0, k = 0;
10         int tempX = x, tempY = y;
11         // 计算平方的数位
12         while (tempX > 0) {
13             tempX /= 10;
14             j++;
15         }
16         // 计算立方的数位
17         while (tempY > 0) {
18             tempY /= 10;
19             k++;
20         }
21         tempX = x;
22         tempY = y;
23         // 提取平方各数位上的数字
24         for (int i = j - 1; i >= 0; i--) {
25             a[i] = tempX % 10;
26             tempX /= 10;
27         }
28         // 提取立方各数位上的数字
29         for (int i = k - 1; i >= 0; i--) {
30             b[i] = tempY % 10;
31             tempY /= 10;
32         }
33         int result = 0;
34         // 判断是否有重合数字
35         for (int i = 0; i < j; i++) {
36             for (int p = 0; p < k; p++) {
37                 if (a[i] == b[p]) {
38                     result = 1;
39                     break;
40                 }
41             }
42             if (result) break;
43         }
44         if (result) continue;
45         int c[N];
46         // 合并两个数组为数组c
47         for (int i = 0; i < j; i++) {
48             c[i] = a[i];
49         }
50         int index = j;
51         for (int i = 0; i < k; i++) {
52             c[index++] = b[i];
53         }
54         result = 0;
55         // 判断是否占有0 - 9这些数字
56         for (int num = 0; num < 10; num++) {
57             int found = 0;
58             for (int i = 0; i < j + k; i++) {
59                 if (c[i] == num) {
60                     found = 1;
61                     break;
62                 }
63             }
64             if (!found) {
65                 result = 1;
66                 break;
67             }
68         }
69         if (result == 0) break;
70     }
71     printf("符合条件的数字是:%d\n", n);
72     return 0;
73 }

 

 

posted @ 2024-11-10 22:12  陈秋雯2024  阅读(9)  评论(0编辑  收藏  举报