实验五

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

image

 A1:功能是遍历元素 通过对数组元素的间接访问 找到最大最小值所在的地址

 A2:指向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 }
View Code

image

 A1:通过对数组元素的直接访问 找到最大值所在地址

 A2:可以

 

task 2-1

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #define N 80
 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     system("pause");
28     return 0;
29 }
View Code

图片

A1:大小是80 sizeof计算的是数组所占用的字节数 strlen统计的是有效字符的长度

A2:不能 报错“表达式必须是可修改的左值”,左侧是地址而右侧是字符串 不合法

A3:交换

task 2-2

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

图片

A1:s1存放的是字符串的起始地址 sizeof计算的是s1即字符串起始地址的字节数 strlen统计的是字符串的长度

A2:可以 task2-1中s1是字符数组 不能直接赋值 task2-2中是指针变量 可以直接指向字符串起始地址

A3:交换的是两个指针的指向 字符串不交换。

task 3

 1 #include<stdio.h>
 2 int main()
 3 {
 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      printf("\n输出2: 使用指针变量ptr1(指向元素)间接访问\n");
16      for(ptr1=&x[0][0],i=0;ptr1<&x[0][0]+8;++ptr1,++i){
17          printf("%d",*ptr1);//i只是用来换行的
18 
19          if((i+1)%4==0)
20              printf("\n");
21      }
22       printf("\n输出3: 使用指针变量ptr2(指向一维数组)间接访问\n");
23       for(ptr2=x;ptr2<x+2;++ptr2){
24           for(j=0;j<4;++j)
25               printf("%d",*(*ptr2+j));
26           printf("\n");
27       }
28       system("pause");
29       return 0;
30 }
View Code

图片

 A:(*ptr)[4]中 ptr先与*结合 一个指针 表示一个指向大小为4数组的指针;*ptr[4]中 ptr先与[]结合  一个数组 表示含有4个指向int类型的指针


task 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 {
 8     char text[N] = "Programming is difficult or not, it is a question.";
 9     printf("原始文本: \n");
10     printf("%s\n", text);
11     replace(text, 'i', '*');
12     printf("处理后文本: \n");
13     printf("%s\n", text);
14     system("pause");
15     return 0;
16 }
17 void replace(char *str,char old_char,char new_char)
18 {
19     int i;
20     while(*str){
21         if(*str==old_char)
22             *str=new_char;
23         str++;
24     }
25 }
View Code

图片

 A1:replace是用new来替换ole字符

A2:可以

 

task 5

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

图片

 A:在进行第二次时会没有第一次字符串输入;作用是吸收多余的换行符

 

task 6

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

图片

 

task 7

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

图片

 

task 8

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

图片

 

posted @ 2025-12-09 14:49  Novven  阅读(4)  评论(0)    收藏  举报