task1_1.c

 1 #include <stdio.h>
 2 #define N 4
 3 
 4 int main() {
 5     int a[N] = { 2, 0, 2, 3 };
 6     char b[N] = { '2', '0', '2', '3' };
 7     int i;
 8 
 9     printf("sizeof(int) = %d\n", sizeof(int));
10     printf("sizeof(char) = %d\n", sizeof(char));
11     printf("\n");
12 
13     // 输出int型数组a中每个元素的地址、值 
14     for (i = 0; i < N; ++i)
15         printf("%p: %d\n", &a[i], a[i]);
16 
17     printf("\n");
18 
19     // 输出char型数组b中每个元素的地址、值 
20     for (i = 0; i < N; ++i)
21         printf("%p: %c\n", &b[i], b[i]);
22 
23     printf("\n");
24 
25     // 输出数组名a和b对应的值 
26     printf("a = %p\n", a);
27     printf("b = %p\n", b);
28 
29     return 0;
30 }

1.是连续存放的,每个元素占用4个字节

2.是连续存放的,每个元素占用1个字节

3.是一致的

 

task1_2.c

 1 #include <stdio.h>
 2 #define N 2
 3 #define M 3
 4 
 5 int main() {
 6     int a[N][M] = { {1, 2, 3}, {4, 5, 6} };
 7     char b[N][M] = { {'1', '2', '3'}, {'4', '5', '6'} };
 8     int i, j;
 9 
10     // 输出int型二维数组a中每个元素的地址、值 
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 
15     printf("\n");
16 
17     // 输出int型二维数组名a, 以及,a[0], a[1]的值
18     printf("a = %p\n", a);
19     printf("a[0] = %p\n", a[0]);
20     printf("a[1] = %p\n", a[1]);
21     printf("\n");
22 
23 
24     // 输出char型二维数组b中每个元素的地址、值
25     for (i = 0; i < N; ++i)
26         for (j = 0; j < M; ++j)
27             printf("%p: %c\n", &b[i][j], b[i][j]);
28     printf("\n");
29 
30     // 输出char型二维数组名b, 以及,b[0], b[1]的值
31     printf("b = %p\n", b);
32     printf("b[0] = %p\n", b[0]);
33     printf("b[1] = %p\n", b[1]);
34     printf("\n");
35 
36     return 0;
37 }

 

1.是;4

2.是

3.是;1

4.是

5.相差3乘以单个元素占用内存数的字节,即该二维数组由两个包含三个元素数组的数组组成

 

 

task2.c

 

 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: 用两个一维维数组,实现两个字符串交换\n");
12     test1();
13 
14     printf("\n测试: 用二维数组,实现两个字符串交换\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.", "hey, C, I love u."};
37 
38     printf("交换前: \n");
39     puts(views[0]);
40     puts(views[1]);
41 
42     swap_str(views[0], views[1]);
43 
44     printf("交换后: \n");
45     puts(views[0]);
46     puts(views[1]);
47 }
48 
49 void swap_str(char s1[N], char s2[N]) {
50     char tmp[N];
51 
52     strcpy(tmp, s1);
53     strcpy(s1, s2);
54     strcpy(s2, tmp);
55 }

 

原因:views1和views2是两个不同的一维数组,views[1]和views[2]是二维数组views的两个数组,所以views1和views2及views[1]和views[2]在做参数时都表示地址

 

task3_1.c

 1 #include <stdio.h>
 2 
 3 #define N 80
 4 
 5 int count(char x[]);
 6 
 7 int main() {
 8     char words[N + 1];
 9     int n;
10 
11     while (gets(words) != NULL) {
12         n = count(words);
13         printf("单词数: %d\n\n", n);
14     }
15 
16     return 0;
17 }
18 
19 int count(char x[]) {
20     int i;
21     int word_flag = 0;  // 用作单词标志,一个新单词开始,值为1;单词结束,值为0
22     int number = 0;  // 统计单词个数
23 
24     for (i = 0; x[i] != '\0'; i++) {
25         if (x[i] == ' ')
26             word_flag = 0;
27         else if (word_flag == 0) {
28             word_flag = 1;
29             number++;
30         }
31     }
32 
33     return number;
34 }

 

task3_1_2.c

 

 1 /*
 2 从键盘输入一行英文文本,统计英文单词总数
 3 为了简化问题处理,只考虑单词以空格间隔的情形
 4 对教材例5.22代码做了些微改动:
 5 1. 统计单词个数,编写成函数模块;增加了多组输入
 6 2. 去掉了不必要的中间变量
 7 */
 8 
 9 #include <stdio.h>
10 
11 #define N 80
12 
13 int count(char x[]);
14 
15 int main() {
16     char words[N + 1];
17     int n;
18 
19     while (gets(words) != NULL) {
20         n = count(words);
21         printf("单词数: %d\n\n", n);
22     }
23 
2    return 0;
25 }
26 
27 int count(char x[]) {
28     int i;
29     int word_flag = 0;  // 用作单词标志,一个新单词开始,值为1;单词结束,值为0
30     int number = 0;  // 统计单词个数
31 
32     for (i = 0; x[i] != '\0'; i++) {
33         if ((x[i] <65|| x[i] >90&&x[i]<97||x[i]>122)&&x[i]!='\''&&x[i]!='-')
34             x[i] =' ';
35     }for (i=0;x[i]!='\0';i++){
36         if (x[i] == ' ')
37             word_flag = 0;
38         else if (word_flag == 0) {
39             word_flag = 1;
40             number++;
41         }
42     }
43 
44     return number;
45 }

 

task3_2.c

 1 /*
 2 输入一行英文文本,统计最长单词,并打印输出。
 3 为简化问题,只考虑单词之间用空格间隔的情形。
 4 相较于教材例5.24,做了以下改动:
 5 1. 增加了多组输入,因此,一些变量初始化放到了第一层循环里面
 6 2. 微调了代码书写逻辑和顺序
 7 */
 8 
 9 #include <stdio.h>
10 #define N 1000
11 
12 int main() {
13     char line[N];
14     int word_len;   // 记录当前单词长度
15     int max_len;    // 记录最长单词长度
16     int end;        // 记录最长单词结束位置
17     int i;
18 
19     while (gets(line) != NULL) {
20         word_len = 0;
21         max_len = 0;
22         end = 0;
23 
24         i = 0;
25         while (1) {
26             // 跳过连续空格
27             while (line[i] == ' ') {
28                 word_len = 0;  // 单词长度置0,为新单词统计做准备
29                 i++;
30             }
31 
32             // 在一个单词中,统计当前单词长度
33             while (line[i] != '\0' && line[i] != ' ') {
34                 word_len++;
35                 i++;
36             }
37 
38             // 更新更长单词长度,并,记录最长单词结束位置
39             if (max_len < word_len) {
40                 max_len = word_len;
41                 end = i;   // end保存的是单词结束的下一个坐标位置
42             }
43 
44             // 遍历到文本结束时,终止循环
45             if (line[i] == '\0')
46                 break;
47         }
48 
49         // 输出最长单词
50         printf("最长单词: ");
51         for (i = end - max_len; i < end; ++i)
52             printf("%c", line[i]);
53         printf("\n\n");
54     }
55 
56     return 0;
57 }

 

 

 

task4.c

 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_s("%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     double ave;
51     int sum = 0, i ;
52     for (i = 0; i < 5; i++)
53     
54         sum = sum + x[i];
55     ave = (double)sum / n;
56 }
57 void bubble_sort(int x[], int n) {
58     int i, j;
59     int t = 0;
60     for (i=0;i<n-1;i++)
61         for (j = 0; j < n - 1 - i; j++)
62         {
63             if (x[j] <x[j + 1])
64             {
65                 t = x[j];
66                 x[j] = x[j+1];
67                 x[j + 1] = t;
68 
69             }
70         }
71 }

 

 

task5.c

 1 #include <stdio.h>
 2 
 3 #define N 100
 4 #define Y 100
 5 void dec2n(int x, int n); // 函数声明
 6 int main() {
 7     int x;
 8 
 9     printf("输入一个十进制整数: ");
10     while (scanf_s("%d", &x) != EOF) {
11         dec2n(x, 2);  // 函数调用: 把x转换成二进制输出
12         dec2n(x, 8);  // 函数调用: 把x转换成八进制输出
13         dec2n(x, 16); // 函数调用: 把x转换成十六进制输出
14 
15         printf("\n输入一个十进制整数: ");
16     }
17 
18     return 0;
19 }
20 void dec2n(int x, int n) {
21     int i, length = 0;
22     char m[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
23     char s[Y];
24     while (x / n)
25     {
26         int t = x % n;
27         s[length] = m[t];
28         length++;
29         x= x / n;
30     }
31     s[length] = m[x];
32     for (i = length; i >=0; i--)
33     {
34         printf("%c", s[i]);
35     }printf("%\n");
36 
37     return;
38 }

 

 

task6.c

 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 
 9 int main() {
10     int t[][N] = { {21, 12, 13, 24},
11                   {25, 16, 47, 38},
12                   {29, 11, 32, 54},
13                   {42, 21, 33, 10} };
14 
15     printf("原始矩阵:\n");
16     output(t, M); // 函数调用
17 
18     rotate_to_right(t, M); // 函数调用
19 
20     printf("变换后矩阵:\n");
21     output(t, M); // 函数调用
22 
23     return 0;
24 }
25 
26 // 函数定义
27 // 功能: 输出一个n*n的矩阵x
28 void output(int x[][N], int n) {
29     int i, j;
30 
31     for (i = 0; i < n; ++i) {
32         for (j = 0; j < n; ++j)
33             printf("%4d", x[i][j]);
34 
35         printf("\n");
36     }
37 }
38 void rotate_to_right(int x[][N], int n) {
39     int i, j;
40     int k[M];
41     for (i = 0; i < n; i++)
42     {
43         k[i] = x[i][n - 1];
44         for (j = n - 1; j > 0;j--)
45         {
46             x[i][j] = x[i][j-1];
47            
48         } x[i][j] = k[i];
49     }
50 }

 

 

task7_1.c

 1 #include <stdio.h>
 2 #define N 80
 3 
 4 void replace(char x[], char old_char, char new_char); // 函数声明
 5 
 6 int main() {
 7     char text[N] = "c programming is difficult or not, it is a question.";
 8 
 9     printf("原始文本: \n");
10     printf("%s\n", text);
11 
12     replace(text, 'i', '*'); // 函数调用 注意字符形参写法,单引号不能少
13 
14     printf("处理后文本: \n");
15     printf("%s\n", text);
16 
17     return 0;
18 }
19 
20 // 函数定义
21 void replace(char x[], char old_char, char new_char) {
22     int i;
23 
24     for (i = 0; x[i] != '\0'; ++i) // 思考: '\0'是什么,为什么能作为循环结束条件
25         if (x[i] == old_char)
26             x[i] = new_char;
27 }

 

因为'\0'是字符串的结束符,字符串会自动在末尾加结束符,当x[i]未到结束符,表示字符串有效字符

 

task7_2.c

 

 1 #include <stdio.h>
 2 #define N 80
 3 
 4 int main() {
 5     char str[N], ch;
 6     int i;
 7 
 8     printf("输入字符串: ");
 9     gets(str);
10 
11     printf("输入一个字符: ");
12     ch = getchar();
13 
14     printf("截断处理......");
15 
16     i = 0;
17     while (str[i] != '\0') {
18         if (str[i] == ch)
19             str[i]='\0';
20         i++;
21 
22            
23     }
24     
25 
26     printf("\n截断处理后字符串: %s\n", str);
27 
28     return 0;
29 }

 

 

task8.c

 

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 #define N 5
 5 #define M 20
 6 
 7 void bubble_sort(char str[][M], int n); // 函数声明
 8 
 9 int main() {
10     char name[][M] = { "Bob", "Bill", "Joseph", "Taylor", "George" };
11     int i;
12 
13     printf("输出初始名单:\n");
14     for (i = 0; i < N; i++)
15         printf("%s\n", name[i]);
16 
17     printf("\n排序中...\n");
18     bubble_sort(name, N);  // 函数调用 
19 
20     printf("\n按字典序输出名单:\n");
21     for (i = 0; i < N; i++)
22         printf("%s\n", name[i]);
23 
24     return 0;
25 }
26 
27 void bubble_sort(char str[][M], int n) {
28     int i, j;
29     char r, a[100];
30     for (i = 0; i < n-1; i++)
31     {
32         for (j=0;j<n-1-i;j++)
33             if (strcmp(str[j], str[j + 1] )> 0)
34             {
35                 strcpy(a, str[j + 1]);
36                 strcpy(str[j + 1], str[j]);
37                 strcpy(str[j], a);
38             }
39         
40     }
41 }