实验5

task1.1

 1 #include <stdio.h>
 2 #define N 5
 3 void input(int x[], int n);
 4 void output(int x[], int n);
 5 void find_min_max(int x[], int n, int *pmin, int *pmax);
 6 int main() {
 7     int a[N];
 8     int min, max;
 9     printf("录入%d个数据:\n", N);
10     input(a, N);
11     printf("数据是: \n");
12     output(a, N);
13     printf("数据处理...\n");
14     find_min_max(a, N, &min, &max);
15     printf("输出结果:\n");
16     printf("min = %d, max = %d\n", min, max);
17     return 0;
18 }
19 void input(int x[], int n) {
20     int i;
21     for(i = 0; i < n; ++i)
22         scanf("%d", &x[i]);
23 }
24 void output(int x[], int n) {
25     int i;
26 
27     for(i = 0; i < n; ++i)
28         printf("%d ", x[i]);
29     printf("\n");
30 }
31 void find_min_max(int x[], int n, int *pmin, int *pmax) {
32     int i;
33     
34     *pmin = *pmax = x[0];
35     for(i = 0; i < n; ++i)
36         if(x[i] < *pmin)
37             *pmin = x[i];
38         else if(x[i] > *pmax)
39             *pmax = x[i];
40 }

 

image

 

1. 函数 find_min_max 功能是找出最大值最小值;

2. "指针变量使用时必须指向确定地址"。执行到line45时,指针变量pmin、pmax都指向x[0]的地址。

task1.2

 1 #include <stdio.h>
 2 #define N 5
 3 
 4 void input(int x[], int n);
 5 void output(int x[], int n);
 6 int *find_max(int x[], int n);
 7 
 8 int main(){
 9     int a[N];
10     int *pmax;
11     
12     printf("录入%d个数据:\n", N);
13     input(a, N);
14     
15     printf("数据是: \n");
16     output(a, N);
17     
18     printf("数据处理...\n");
19     pmax = find_max(a, N);
20     
21     printf("输出结果:\n");
22     printf("max = %d\n", *pmax);
23     
24     return 0;
25 }
26 
27 void input(int x[], int n){
28     int i;
29     
30     for(i = 0; i < n; ++i)
31         scanf("%d", &x[i]);
32 }
33 
34 void output(int x[], int n){
35     int i;
36     
37     for(i = 0; i < n; ++i)
38         printf("%d ", x[i]);
39     printf("\n");
40 }
41 
42 int *find_max(int x[], int n) {
43     int max_index = 0;
44     int i;
45     
46     for(i = 0; i < n; ++i)
47         if(x[i] > x[max_index])
48             max_index = i;
49             
50     return &x[max_index];
51 }

 

image

 

1. 函数 find_max 功能是找最大值;返回的是最大值;

2. 函数 find_max 可以写成以下代码;

1 int *find_max(int x[], int n) {
2     int *ptr = &x[0];
3     int i;
4     for(i = 0; i < n; ++i)
5         if(x[i] > *ptr)
6             ptr = &x[i];
7 
8     return ptr;
9 }

task2.1

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 80
 4 
 5 int main() {
 6     char s1[N] = "Learning makes me happy";
 7     char s2[N] = "Learning makes me sleepy";
 8     char tmp[N];
 9     
10     printf("sizeof(s1) vs. strlen(s1): \n");
11     printf("sizeof(s1) = %d\n", sizeof(s1));
12     printf("strlen(s1) = %d\n", strlen(s1));
13     
14     printf("\nbefore swap: \n");
15     printf("s1: %s\n", s1);
16     printf("s2: %s\n", s2);
17     
18     printf("\nswapping...\n");
19     strcpy(tmp, s1);
20     strcpy(s1, s2);
21     strcpy(s2, tmp);
22     
23     printf("\nafter swap: \n");
24     printf("s1: %s\n", s1);
25     printf("s2: %s\n", s2);
26     
27     return 0;
28 }

 

image

 

问题1:数组s1的大小是80字节; sizeof(s1) 计算的是数组s1的大小; strlen(s1) 统计的是字符串有效字符个数;
问题2:line7代码不能替换成以下写法,原因:s1是s1[0]的地址,是常量,不可赋值;

1 char s1[N];
2 s1 = "Learning makes me happy";

问题3:line19-21执行后,字符数组s1和s2中的内容交换了;

task2.2

 

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 80
 4 int main() {
 5     char *s1 = "Learning makes me happy";
 6     char *s2 = "Learning makes me sleepy";
 7     char *tmp;
 8     printf("sizeof(s1) vs. strlen(s1): \n");
 9     printf("sizeof(s1) = %d\n", sizeof(s1));
10     printf("strlen(s1) = %d\n", strlen(s1));
11     printf("\nbefore swap: \n");
12     printf("s1: %s\n", s1);
13     printf("s2: %s\n", s2);
14     printf("\nswapping...\n");
15     tmp = s1;
16     s1 = s2;
17     s2 = tmp;
18     printf("\nafter swap: \n");
19     printf("s1: %s\n", s1);
20     printf("s2: %s\n", s2);
21     return 0; 
22 }   

 

image

 

问题1:指针变量s1中存放的是字符串首字符'L'的地址;sizeof(s1)计算的是指针变量 s1 本身的字节数;strlen(s1)统计的是字符串有效字符个数;

问题2:line6代码能替换成下面的写法;对比task2_1.c中的line6, 二者的语义区别:2_1将字符串赋值给s[0]地址,2_2将字符串赋值给指针变量s1;

1 char *s1;
2 s1 = "Learning makes me happy";

问题3:line19-line21,交换的是两个不同字符串的首字符地址;字符串常量"Learning makes me happy"和字符串常量"Learning makes me sleepy"在内存中未交换;

task3

 

 1 #include <stdio.h>
 2 
 3 int main() {
 4     int x[2][4] = {{1, 9, 8, 4}, {2, 0, 4, 9}};
 5     int i, j;
 6     int *ptr1; 
 7     int(*ptr2)[4]; 
 8     
 9     printf("输出1: 使用数组名、下标直接访问二维数组元素\n");
10     for (i = 0; i < 2; ++i) {
11         for (j = 0; j < 4; ++j)
12             printf("%d ", x[i][j]);
13         printf("\n");
14     }
15     
16     printf("\n输出2: 使用指针变量ptr1(指向元素)间接访问\n");
17     for (ptr1 = &x[0][0], i = 0; ptr1 < &x[0][0] + 8; ++ptr1, ++i) {
18         printf("%d ", *ptr1);
19         
20         if ((i + 1) % 4 == 0)
21             printf("\n");
22     }
23     
24     printf("\n输出3: 使用指针变量ptr2(指向一维数组)间接访问\n");
25     for (ptr2 = x; ptr2 < x + 2; ++ptr2) {
26         for (j = 0; j < 4; ++j)
27             printf("%d ", *(*ptr2 + j));
28         printf("\n");
29     }
30     
31     return 0;
32 }

 

image

 int (*ptr)[4]; 中,标识符ptr表示的语义是指向包含四个int元素的一维数组的指针;

int *ptr[4]; 中,标识符ptr表示的语义是包含四个int指针的数组;
task4
 1 #include <stdio.h>
 2 #define N 80      
 3  
 4 void replace(char *str, char old_char, char new_char); 
 5 
 6 int main() {
 7     char text[N] = "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 *str, char old_char, char new_char) {
22     int i;
23     
24     while(*str) {
25         if(*str == old_char)
26             *str = new_char;
27         str++;
28     }
29 }

image

1. 函数 replace 的功能是将字符串中的old_char元素替换为new_char元素;
2. line24, 圆括号里循环条件可以改写成 *str != '\0' ;
task5
 1 #include <stdio.h>
 2 #define N 80
 3 
 4 char *str_trunc(char *str, char x);
 5 
 6 int main() {
 7     char str[N];
 8     char ch;
 9     
10     while(printf("输入字符串: "), gets(str) != NULL) {
11         printf("输入一个字符: ");
12          ch = getchar();
13          
14         printf("截断处理...\n");
15         str_trunc(str, ch); 
16         
17         printf("截断处理后的字符串: %s\n\n", str);
18         getchar();
19     }
20     
21     return 0;
22 }
23 
24 char *str_trunc(char *str, char x){
25     char *p = str;
26     while(*p != 0){
27         if(*p == x){
28             *p = 0;
29             break;
30         }          
31         p++;
32     }
33     return str;
34 }

image

去掉main函数line18 getchar(); ,重新编译、运行,此时多组输入测试结果不同在于第二次跳过输入直接输出;line18在这里的作用是
清空输入缓冲区中残留的换行符;
task6
 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 5
 4 
 5 int check_id(char *str); 
 6 
 7 int main(){
 8     char *pid[N] = {"31010120000721656X",
 9                     "3301061996X0203301",
10                     "53010220051126571",
11                     "510104199211197977",
12                     "53010220051126133Y"};
13     int i;
14     
15     for (i = 0; i < N; ++i)
16         if (check_id(pid[i])) 
17             printf("%s\tTrue\n", pid[i]);
18         else
19             printf("%s\tFalse\n", pid[i]);
20             
21     return 0;
22 }
23 
24 int check_id(char *str){
25     if(strlen(str) != 18){
26         return 0;
27     }
28     
29     for(int i = 0; i < 17; i++){
30         if(str[i] < '0' || str[i] > '9'){
31             return 0;
32         }
33     }
34     
35     char last_char = str[17];
36     if(!((last_char > '0' && last_char < '9' ) || last_char == 'X')){
37         return 0;
38     }
39     
40     return 1;
41 }

image

 task7

 1 #include <stdio.h>
 2 #define N 80
 3 void encoder(char *str, int n); 
 4 void decoder(char *str, int n); 
 5 
 6 int main() {
 7     char words[N];
 8     int n;
 9     
10     printf("输入英文文本: ");
11     gets(words);
12     
13     printf("输入n: ");
14     scanf("%d", &n);
15     
16     printf("编码后的英文文本: ");
17     encoder(words, n);
18     printf("%s\n", words);
19     
20     printf("对编码后的英文文本解码: ");
21     decoder(words, n); 
22     printf("%s\n", words);
23     
24     return 0;
25 }
26 
27 void encoder(char *str, int n){
28     while(*str != '\0'){
29         if(*str >= 'a' && *str <= 'z'){
30             *str = (*str - 'a' + n) % 26 + 'a';
31         }
32         else if(*str >= 'A' && *str <= 'Z'){
33             *str = (*str - 'A' + n) % 26 + 'A';
34         }                                      
35         str++;
36     }
37 }
38 
39 void decoder(char *str, int n){
40     while(*str != '\0'){
41         if(*str >= 'a' && *str <= 'z'){
42             *str = (*str - 'a' - n + 26) % 26 + 'a';
43         }
44         else if(*str >= 'A' && *str <= 'Z'){
45             *str = (*str - 'A' - n + 26) % 26 + 'A';
46         }                                      
47         str++;
48     }
49 }

image

 

image

 

image

 task8

 

 

 1 #include <stdio.h>
 2 #include <string.h> 
 3 
 4 int main(int argc, char *argv[]) {
 5     int i, j;
 6     char *temp; 
 7 
 8     
 9     for (i = 1; i < argc - 1; ++i) { 
10         for (j = 1; j < argc - 1 - i; ++j) { 
11             if (strcmp(argv[j], argv[j + 1]) > 0) {
12                 temp = argv[j];
13                 argv[j] = argv[j + 1];
14                 argv[j + 1] = temp;
15             }
16         }
17     }
18 
19     for (i = 1; i < argc; ++i) {
20         printf("hello, %s\n", argv[i]);
21     }
22 
23     return 0;
24 }

image

 

posted @ 2025-12-11 20:41  屑乃  阅读(7)  评论(0)    收藏  举报