实验5

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

结果

 

用指针指向最大数和最小数的地址 实现输出

在原line45行我的line36行 表示将指针有初始 指向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     printf("录入%d个数据:",N);
12     input(a,N);
13     printf("数据是:\n");
14     output(a,N);
15     printf("数据处理...\n");
16     pmax=find_max(a,N);
17     printf("输出结果:\n");
18     printf("max=%d\n",*pmax);
19     
20     return 0;    
21 }
22 void input(int x[],int n){
23     int i;
24     for(i=0;i<n;++i){
25         scanf("%d",&x[i]);
26     }
27     
28 }
29 void output(int x[],int n){
30     int i;
31     for(i=0;i<n;++i)
32         printf("%d ",x[i]);
33     printf("\n");
34 }
35 
36 int *find_max(int x[],int n){
37     int max_index=0;
38     int i;
39     
40     for(i=0;i<n;++i)
41         if(x[i]>x[max_index])
42             max_index=i;
43     
44     return &x[max_index];
45 }

结果

返回的是x[i]的地址i为最大数的索引,赋值给max_index

能够实现

任务2

源代码

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define N 80
 4 int main(){
 5     char s1[N]="Learning makes me happy";
 6     char s2[N]="Learning makes me sleepy";
 7     char tmp[N];
 8     
 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     
13     printf("\n before swap:\n");
14     printf("s1:%s\n",s1);
15     printf("s2:%s\n",s2);
16     
17     printf("\nswapping...\n");
18     strcpy(tmp,s1);
19     strcpy(s1,s2);
20     strcpy(s2,tmp);
21     printf("\nafter swap:\n");
22     printf("s1:%s\n",s1);
23     printf("s2:%s\n",s2);
24     
25     return 0;
26 }

结果

s1存放的字符串起始地址  sizeof计算的是这个字符数组的大小 80 N是不变的

strlen是这个字符串的长度不包括'\0'

不能写s1="巴拉把拉。。。“ 因为s1 是这个字符数组的起始地址 这个赋值错误

是用strcpy进行复制 最终结果是实现了替换

任务2.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     
 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     
13     printf("\n before swap:\n");
14     printf("s1:%s\n",s1);
15     printf("s2:%s\n",s2);
16     
17     printf("\nswapping...\n");
18     tmp=s1;
19     s1=s2;
20     s2=tmp;
21     
22     printf("\nafter swap:\n");
23     printf("s1:%s\n",s1);
24     printf("s2:%s\n",s2);
25     return 0;
26 }

结果

指针变量s1存放的是这个字符串的地址

sizeof(s1)计算出来的是指针变量的大小 取决于我的电脑系统64位

strlen则是计算这个字符串的长度所以结果和第一种一样

能够替换 在指针变量里 这种两种写法都是语法正确的 task2.1是把字符串赋值给s1的地址 错误 task2.2是初始指针地址 否则会变成野指针 

任务3

源代码

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

结果

int (*ptr2)[4];表示数组指针 数组的行指针

int *ptr[4];表示一个含有四个元素的指针数组 存放的都是地址

任务4

源代码

 1 #include<stdio.h>
 2 #define N 80 
 3 void replace(char *str,char old_char,char new_char);
 4 
 5 int main(){
 6     char text[N]="Programming is difficult or not,it is a question.";
 7     
 8     printf("原始文本:\n");
 9     printf("%s\n",text);
10     replace(text,'i','*');
11     printf("处理后的文本:\n");
12     printf("%s\n",text);
13     
14     return 0;
15 }
16 void replace(char *str,char old_char,char new_char){
17     int i;
18     while(*str){
19         if(*str==old_char)
20             *str=new_char;
21         str++;
22         
23     }
24     
25 }

结果

replace的功能是将句子中的i换成*

可以替换

任务5

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

结果

第二次会直接跳到处理之后

如果没有getschar 第二次输入完的回车会被判定为 输入的字符ch 导致直接进入处理后

任务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     char *pid[N]={"31010120000721656x",
 9                   "3301061996x0203301",
10                   "53010220021126571",
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     }
20     return 0;
21 } 
22 
23 int check_id(char *str){
24     int j,i;
25     if(strlen(str)!=18)
26             return 0;
27     for(i=0;i<18;i++){
28         if(i==17&&str[i]=='x'){
29             continue;
30             }
31         if(str[i]<'0'||str[i]>'9')
32             return 0;
33         }
34         return 1;
35 }

结果

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

结果

任务8

结果

 

源代码

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

结果

 

posted @ 2024-12-08 12:50  松松睡不醒  阅读(7)  评论(0编辑  收藏  举报