实验五

任务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     }
53 }
View Code

运行结果:

问题1:运用指针pmin与pmax找出数组x中的最小值和最大值。
问题2:分别指向min与max的地址。 

任务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 }
View Code

运行结果:

 问题1:返回数组x中最大值的地址。
问题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 }
View Code

运行结果:

问题1:s1大小为80个字节,sizeof(s1)计算的是s1所占总字节数,为80,strlen(s1)统计的是字符串实际字符数,为20。
问题2:不能,因s1已声明表数组起始地址,不能被赋给一字符串常量的地址。
问题3:是。

任务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 }
View Code

运行结果:

 问题1:存放s1字符串起始地址。sizeof(s1)计算的是s1所占总字节数,为24,strlen(s1)统计的是字符串实际字符数,为20。
问题2:能,原本是定义的同时对s1初始化,后者是先定义,此时s1为野指针,在对其赋值。
问题3:交换的是s1与s2所储存的地址,内存无交换。

任务3

代码:

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

运行结果:

 任务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 void replace(char *str, char old_char, char new_char) {
21     int i;
22     while(*str) {
23         if(*str == old_char)
24             *str = new_char;
25         str++;
26     }
27 }
View Code

运行结果:

 问题1:将字符串text中的i均替换成*。
问题2:不能。

任务5

代码:

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

运行结果:

 任务6:

代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 5
 4 
 5 int check_id(char *str); 
 6 
 7 int main()
 8 {
 9     char *pid[N] = {"31010120000721656X",
10                     "3301061996X0203301",
11                     "53010220051126571",
12                     "510104199211197977",
13                     "53010220051126133Y"};
14     int i;
15 
16     for (i = 0; i < N; ++i)
17         if (check_id(pid[i])) 
18             printf("%s\tTrue\n", pid[i]);
19         else
20             printf("%s\tFalse\n", pid[i]);
21 
22     return 0;
23 }
24 
25 int check_id(char *str) 
26 {
27     int i;
28     if(strlen(str)!=18)
29     {
30         return 0;
31     }
32     for(i=0;i<17;i++)
33     {
34         if(str[i]<'0'||str[i]>'9')
35         {
36             return 0;
37         }    
38     } 
39     if(str[17]<'0'||str[17]>'9'&&str[17]!='X')
40         {
41             return 0;
42         }
43     return 1;
44 }
View Code

运行结果:

 任务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 {
 8     char words[N];
 9     int n;
10 
11     printf("输入英文文本: ");
12     gets(words);
13 
14     printf("输入n: ");
15     scanf("%d", &n);
16 
17     printf("编码后的英文文本: ");
18     encoder(words, n);  
19     printf("%s\n", words);
20 
21     printf("对编码后的英文文本解码: ");
22     decoder(words, n); 
23     printf("%s\n", words);
24 
25     return 0;
26 }
27 
28 void encoder(char *str, int n) 
29 {
30     while(*str!='\0')
31     {
32         if((*str>='a' && *str<='z')||(*str>='A' && *str<='Z'))
33         {
34             if(*str>='a' && *str<='z')
35             {
36                 *str=((*str-'a'+n)%26)+'A';
37             }
38         }
39         str++;
40     }
41 }
42 
43 void decoder(char *str, int n) 
44 {
45     while(*str!='\0')
46     {
47         if((*str>='a' && *str<='z')||(*str>='A' && *str<='Z'))
48         {
49             if(*str>='a' && *str<='z')
50             {
51                 *str=((*str-'a'+n+26)%26)+'a';
52             }
53             else
54             {
55                 *str=((*str-'A'+n+26)%26)+'A';
56             }
57         }
58         str++;
59     }
60 }
View Code

运行结果:

 任务8

代码:

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

运行结果:

 

posted @ 2025-05-18 15:45  吉筱嘉  阅读(7)  评论(0)    收藏  举报