实验4

任务1

1.1

代码

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

 

运行截图

答问题:

1.是;4;是。

2.是;1;是。

 

 

1.2

代码

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

运行截图

问题回答:

1.是;4;是

2.是;1;是

3.相差16;相差4;是一个一位数组的大小。

 

任务2.

代码

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 #define N 80
 5 
 6 void swap_str(char s1[N], char s2[N]);
 7 void test1();
 8 void test2();
 9 
10 int main() {
11     printf("测试1: 用两个一维char数组,实现两个字符串交换\n");
12     test1();
13 
14     printf("\n测试2: 用二维char数组,实现两个字符串交换\n");
15     test2();
16 
17     return 0;
18 }
19 
20 void test1() {
21     char views1[N] = "hey, C, I hate u.";
22     char views2[N] = "hey, C, I love u.";
23 
24     printf("交换前: \n");
25     puts(views1);
26     puts(views2);
27 
28     swap_str(views1, views2);
29 
30     printf("交换后: \n");
31     puts(views1);
32     puts(views2);
33 }
34 
35 void test2() {
36     char views[2][N] = {"hey, C, I hate u.", 
37                         "hey, C, I love u."};
38 
39     printf("交换前: \n");
40     puts(views[0]);
41     puts(views[1]);
42 
43     swap_str(views[0], views[1]);
44 
45     printf("交换后: \n");
46     puts(views[0]);
47     puts(views[1]);
48 }
49 
50 void swap_str(char s1[N], char s2[N]) {
51     char tmp[N];
52 
53     strcpy(tmp, s1);
54     strcpy(s1, s2);
55     strcpy(s2, tmp);
56 }

运行结果

 问题回答:

加不加[]都可以使用,数组在函数中起到指针的作用。

 

 

任务3

3.1

代码

#include <stdio.h>

#define N 80

int count(char x[]);

int main() {
    char words[N+1];
    int n;

    while(gets(words) != NULL) {
        n = count(words);
        printf("单词数: %d\n\n", n);
    }

    return 0;
}

int count(char x[]) {
    int i;
    int word_flag = 0;  
    int number = 0; 

    for(i = 0; x[i] != '\0'; i++) {
        if(x[i] == ' ')
            word_flag = 0;
        else if(word_flag == 0) {
            word_flag = 1;
            number++;
        }
    }

    return number;
}

 

运行结果

 3.2

代码

 1 #include <stdio.h>
 2 #define N 1000
 3 
 4 int main() {
 5     char line[N];
 6     int word_len;   
 7     int max_len;    
 8     int end;        
 9     int i;
10 
11     while(gets(line) != NULL) {
12         word_len = 0;
13         max_len = 0;
14         end = 0;
15 
16         i = 0;
17         while(1) {
18             while(line[i] == ' ') {
19                 word_len = 0;  
20                 i++;
21             }
22 
23       
24             while(line[i] != '\0' && line[i] != ' ') {
25                 word_len++;
26                 i++;
27             }
28         
29             if(max_len < word_len) {
30                 max_len = word_len;
31                 end = i; 
32             }
33             if(line[i] == '\0')
34                 break;
35         }
36 
37         printf("最长单词: ");
38         for(i = end - max_len; i < end; ++i)
39             printf("%c", line[i]);
40         printf("\n\n");
41     }
42 
43     return 0;
44 }

 

 

运行结果

 

 

 

实验4

代码

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

 

运行结果

 

 

任务5

 代码

 1 #include <stdio.h>
 2 #define N 5
 3 
 4 // 函数声明 
 5 void input(int x[], int n);
 6 void output(int x[], int n);
 7 double average(int x[], int n);
 8 void bubble_sort(int x[], int n);
 9 
10 int main() {
11     int scores[N];
12     double ave;
13     
14     printf("录入%d个分数:\n", N);
15     input(scores, N);
16     
17     printf("\n输出课程分数: \n");
18     output(scores, N);
19     
20     printf("\n课程分数处理: 计算均分、排序...\n");
21     ave = average(scores, N);
22     bubble_sort(scores, N);
23     
24     printf("\n输出课程均分: %.2f\n", ave);
25     printf("\n输出课程分数(高->低):\n");
26     output(scores, N);
27     
28     return 0;
29 }
30 
31 // 函数定义
32 // 输入n个整数保存到整型数组x中 
33 void input(int x[], int n) {
34     int i;
35     
36     for(i = 0; i < n; ++i)
37         scanf("%d", &x[i]); 
38 }
39 
40 // 输出整型数组x中n个元素 
41 void output(int x[], int n) {
42     int i;
43     
44     for(i = 0; i < n; ++i)
45         printf("%d ", x[i]);
46     printf("\n");
47 }
48 
49 double average(int x[], int n) {
50     int i, sum = 0;
51     for (i = 0; i < n; ++i)
52         sum += x[i];
53     return (double)sum / n;
54 }
55 
56 
57 
58 void bubble_sort(int x[], int n) {
59     int i, j, temp;
60     for (i = 0; i < n - 1; ++i) {
61         for (j = 0; j < n - 1 - i; ++j) {
62             if (x[j] < x[j + 1]) {
63                 // 交换元素
64                 temp = x[j];
65                 x[j] = x[j + 1];
66                 x[j + 1] = temp;
67             }
68         }
69     }
70 }

运行结果

 

 

任务6

 代码

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 5
 4 #define M 20
 5 
 6 // 函数声明
 7 void output(char str[][M], int n);
 8 void bubble_sort(char str[][M], int n);
 9 
10 int main() {
11     char name[][M] = {"Bob", "Bill", "Joseph", "Taylor", "George"};
12 
13     printf("输出初始名单:\n");
14     output(name, N);
15 
16     printf("\n排序中...\n");
17     bubble_sort(name, N); // 函数调用
18 
19     printf("\n按字典序输出名单:\n");
20     output(name, N);
21 
22     return 0;
23 }
24 
25 // 函数定义
26 // 功能:按行输出二维数组中的字符串
27 void output(char str[][M], int n) {
28     int i;
29     for(i = 0; i < n; ++i)
30         printf("%s\n", str[i]);
31 }
32 
33 // 函数定义
34 // 功能:使用冒泡排序算法对二维数组str中的n个字符串按字典序排序
35 void bubble_sort(char str[][M], int n) {
36     int i, j;
37     char temp[M];
38 
39     for (i = 0; i < n - 1; ++i) {
40         for (j = 0; j < n - i - 1; ++j) {
41             // 如果相邻的字符串顺序不对,交换它们
42             if (strcmp(str[j], str[j + 1]) > 0) {
43                 strcpy(temp, str[j]);
44                 strcpy(str[j], str[j + 1]);
45                 strcpy(str[j + 1], temp);
46             }
47         }
48     }
49 }

运行结果

 

 

 

任务7

代码

 1 #include <stdio.h>
 2 
 3 int hasDuplicates(int num);
 4 
 5 int main() {
 6     int input;
 7     char choice;
 8         printf("请输入一个整数(1<= 整数数位 <=100):");
 9         while(scanf("%d",&input)!=EOF){
10 
11         if (hasDuplicates(input)) {
12             printf("YES,输入的整数包含重复出现的数字。\n");
13         } else {
14             printf("NO,输入的整数没有重复出现的数字。\n");
15         }
16     printf("请输入一个整数(1<= 整数数位 <=100):");
17     } 
18 
19     return 0;
20 }
21 
22 
23 int hasDuplicates(int num) {
24     int digitCount[10] = {0}; 
25 
26     while (num > 0) {
27         int digit = num % 10;
28 
29         if (digitCount[digit] > 0) {
30             return 1;
31         }
32 
33         digitCount[digit]++;
34         num /= 10;
35     }
36 
37     return 0; 
38 }

运行结果

 

任务8

 代码

 1 #include <stdio.h>
 2 #define N 100
 3 #define M 4
 4 
 5 void output(int x[][N], int n);
 6 void rotate_to_right(int x[][N], int n);
 7 
 8 int main() {
 9     int t[][N] = {
10         {21, 12, 13, 24},
11         {25, 16, 47, 38},
12         {29, 11, 32, 54},
13         {42, 21, 33, 10}
14     };
15 
16     printf("原始矩阵:\n");
17     output(t, M);
18 
19     rotate_to_right(t, M);
20 
21     printf("变换后矩阵:\n");
22     output(t, M);
23 
24     return 0;
25 }
26 
27 void output(int x[][N], int n) {
28     int i, j;
29     for (i = 0; i < n; ++i) {
30         for (j = 0; j < n; ++j)
31             printf("%4d", x[i][j]);
32         printf("\n");
33     }
34 }
35 
36 void rotate_to_right(int x[][N], int n) {
37     int temp[N];
38     int i, j;
39 
40     for (i = 0; i < n; ++i) {
41         // 将最后一列存储在temp中
42         temp[i] = x[i][n - 1];
43 
44         // 将每一列向右移动
45         for (j = n - 1; j > 0; --j)
46             x[i][j] = x[i][j - 1];
47 
48         // 将存储的列复制到第一列
49         x[i][0] = temp[i];
50     }
51 }

运行结果

 

posted @ 2023-11-15 20:44  starming  阅读(11)  评论(0编辑  收藏  举报