实验5

任务1_1

 1 #include <stdio.h>
 2 #define N 5
 3 
 4 void input(int x[], int n);
 5 void output(int x[], int n);
 6 void find_min_max(int x[], int n, int *pmin, int *pmax);
 7 
 8 int main() {
 9     int a[N];
10     int min, max;
11 
12     printf("录入%d个数据:\n", N);
13     input(a, N);
14 
15     printf("数据是: \n");
16     output(a, N);
17 
18     printf("数据处理...\n");
19     find_min_max(a, N, &min, &max);
20 
21     printf("输出结果:\n");
22     printf("min = %d, max = %d\n", min, max);
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 void find_min_max(int x[], int n, int *pmin, int *pmax) {
43     int i;
44     
45     *pmin = *pmax = x[0];
46 
47     for(i = 0; i < n; ++i)
48         if(x[i] < *pmin)
49             *pmin = x[i];
50         else if(x[i] > *pmax)
51             *pmax = x[i];
52 }

1.函数 find_min_max 实现的功能是找出N个数据中的最大值和最小值

2.pmax指向x[0]的地址,pmin指向pmax的地址再指向x[0]的地址

 

任务1_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 }

1.函数 find_max 的功能是 找到一组数据中最大值的地址

2. 可以替换代码

 

任务2_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 }

问题1:数组s1的大小是80字节, sizeof(s1) 计算的是数组s1的大小, strlen(s1) 统计的是数组s1的字符串长度

问题2:line7代码,不能替换,因为数组名为一个地址,不能赋值为字符串,数组名在大多数情况下会被当作指向数组首元素的指针,它代表的是一段连续的内存空间,而不是一个简单的可以被直接赋值的变量

char s1[N];

s1 = "Learning makes me happy"; 

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

 

任务2_2

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 80
 4 
 5 int main() {
 6     char *s1 = "Learning makes me happy";
 7     char *s2 = "Learning makes me sleepy";
 8     char *tmp;
 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     tmp = s1;
20     s1 = s2;
21     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 }

问题1:指针变量s1中存放的是一个内存地址,这个地址指向了字符串常量 “Learning makes me happy”在内存中的存储位置, sizeof(s1) 计算的是指针变量s1自身在内存中所占的字节数, strlen(s1) 统计的是从s1所指向的内存地址开始,一直到遇到字符串结束标志 '\0' 为止,所包含字符的个数

问题2:line6代码能替换成下面的写法,对比task2_1.c中的line6, 用文字说明二者的语义区别:2_1中定义了一个字符数组s1,编译器会为这个数组分配N个字节的连续内存空间,字符串 "Learning makes me happy"会被复制到这个数组空间中,2_2中定义了一个字符指针s1,它被初始化为指向一个字符串常量

char *s1;

s1 = "Learning makes me happy"; 

问题3:line19-line21,交换的是指针,字符串常量"Learning makes me happy"和字符串常 量"Learning makes me sleepy"在内存中没有交换 

 

任务3

 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 }

int (*ptr)[4]; 中,标识符ptr表示的语义是一个指针变量

int *ptr[4]; 中,标识符ptr表示的语义是一个存储指针变量的数组

 

任务4

 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 }

 

1. 函数 replace 的功能是将旧的字符串中的某个字符换成新的某个字符

2. line24, 圆括号里循环条件可以改写成 *str != '\0'

 

任务5

 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 {
26     int i;
27     while(*str)
28     {
29         if(*str!=x)
30    str++;
31    else
32    *str='\0';
33    
34     }
35    
36    return str;
37 
38     
39     
40 }

去掉main函数line18 getchar(); ,重新编译、运行,此时多组输入时,换行字符会作为一个字符输入到下一次的输入中,line18 在这里起到的作用是将换行字符存储到输入缓冲区中

 

任务6

#include <stdio.h>
#include <string.h>
#define N 5

int check_id(char *str); 

int main()
{
    char *pid[N] = {"31010120000721656X",
                    "3301061996X0203301",
                    "53010220051126571",
                    "510104199211197977",
                    "53010220051126133Y"};
    int i;

    for (i = 0; i < N; ++i)
        if (check_id(pid[i])) 
            printf("%s\tTrue\n", pid[i]);
        else
            printf("%s\tFalse\n", pid[i]);

    return 0;
}


int check_id(char *str) 
{
   int i;
   if(strlen(str)!=18)
   return 0;
   
       for ( i = 0; i <17; i++)
       {
            if (str[i] < '0' || str[i] > '9') 
            return 0;
            if (str[17] < '0' || str[17] > '9')
    {
        if (str[17]!= 'X') 
            return 0;
    }
    
    }
    return 1;
}
  
   

任务7

 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 
28 void encoder(char *str, int n) 
29 {
30    while(*str)
31    {
32    if (*str >= 'a' && *str <= 'z')
33         {
34             *str = (*str + n - 'a') % 26 + 'a';
35           
36         }
37         else if ((*str >= 'A' && *str <= 'Z'))
38         {
39             *str = (*str + n - 'A') % 26 + 'A';
40   }
41   str++;
42    }
43   
44    
45 }
46 
47 
48 void decoder(char *str, int n) 
49 {
50     while (*str!= '\0')
51     {
52         if ((*str >= 'a' && *str <= 'z'))
53         {
54             *str = (*str - n - 'a' + 26) % 26 + 'a';
55         }
56         else if ((*str >= 'A' && *str <= 'Z'))
57         {
58             *str = (*str - n - 'A' + 26) % 26 + 'A';
59         }
60         str++;
61     }
62 }

任务8

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

 

posted @ 2024-12-07 16:44  宇望舒  阅读(8)  评论(0编辑  收藏  举报