实验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 }
结果