实验五
task1.
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 14 printf("数据是:\n"); 15 output(a,N); 16 17 printf("数据处理...\n"); 18 find_min_max(a,N,&min,&max); 19 printf("输入结果:\n"); 20 printf("min=%d,max=%d\n",min,max); 21 22 return 0; 23 } 24 void input(int x[],int n) 25 { 26 int i; 27 28 for(i=0;i<n;++i) 29 scanf("%d",&x[i]); 30 } 31 void output(int x[],int n) 32 { 33 int i; 34 for(i=0;i<n;++i) 35 printf("%d ",x[i]); 36 printf("\n"); 37 } 38 void find_min_max(int x[],int n,int *pmin,int *pmax) 39 { 40 int i; 41 42 *pmin=*pmax=x[0]; 43 44 for(i=0;i<n;++i) 45 if(x[i]<*pmin) 46 *pmin=x[i]; 47 else if(*pmax<x[i]) 48 *pmax=x[i]; 49 }
answer1:fine_min_max功能是找出数组中最大值,最小值。
answer2:"指针变量在使用之前必须指向确定的地址"。执行到line45时,指针变量pmin、pmax 分别指向数组第一个元素,遍历数组元素后分别指向最小值,最大值。
task2.
1 #include<stdio.h> 2 #include<string.h> 3 #define N 80 4 int main() 5 { 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 sawp:\n"); 24 printf("s1:%s\n",s1); 25 printf("s2:%s\n",s2); 26 27 return 0; 28 }
answer1:数组s1大小为80字节,sizeof(s1)计算占用内存空间,strlen(s1)统计实际有效字符长度。
answer2:line7不能代换,是初始化错误。
answer3:执行line19-line21后,s1,s2的内容交换。
task3.
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; //指针变量,存放Int类型数据的地址 7 int (*ptr2)[4]; //指针变量,指向包含4个int元素的一维数组 8 9 printf("输出1:使用数组名、下标直接访问二维数组元素\n"); 10 for(i=0;i<2;++i) 11 { 12 for(j=0;j<4;++j) 13 printf("%d ",x[i][j]); 14 printf("\n"); 15 } 16 printf("\n输出2:使用指针变量ptr1(指向元素)间接访问\n"); 17 for(ptr1=&x[0][0],i=0;ptr1<&x[0][0]+8;++ptr1,++i) 18 { 19 printf("%d",*ptr1); 20 21 if((i+1)%4==0) 22 printf("\n"); 23 } 24 printf("\n输出3:使用指针变量ptr2(指向一维数组)间接访问\n"); 25 for(ptr2=x;ptr2<x+2;++ptr2) 26 { 27 for(j=0;j<4;++j) 28 printf("%d ",*(*ptr2+j)); 29 printf("\n"); 30 } 31 32 return 0; 33 }
answer1:int (*ptr)[4]; 中,标识符ptr表示的语义是指向四个一维数组的首地址。
answer2:int *ptr[4];中,标识符ptr表示的语义是指向长度为四的一维整形数组的首地址。
task4.
1 #include<stdio.h> 2 #define N 80 3 void replace(char *str,char old_char,char new_char); 4 int main() 5 { 6 char text[N]="Programming is difficult or not,it is a question."; 7 printf("原始文本:\n"); 8 printf("%s\n",text); 9 10 replace(text,'i','*'); 11 12 printf("处理后文本:\n"); 13 printf("%s\n",text); 14 15 return 0; 16 } 17 void replace(char *str,char old_char,char new_char) 18 { 19 int i; 20 21 while(*str) 22 { 23 if(*str==old_char) 24 *str=new_char; 25 str++; 26 } 27 }
answer1:根据用户输入的字符替换字符串相对应的字符。
answer2:可以替换为*str!='\0'。
task5.
1 #include<stdio.h> 2 #define N 80 3 char *str_trunc(char *str,char x); 4 int main() 5 { 6 char str[N]; 7 char ch; 8 9 while(printf("输入字符串:"),gets(str)!=NULL) 10 { 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 return 0; 21 } 22 char *str_trunc(char *str,char x) 23 { 24 while(*str++) 25 { 26 if(*str==x) 27 *str='\0'; 28 } 29 }
answer:去掉line18,只读入一次所需字符串,其作用是在每次筛选完后继续读入下一个字符串。
task6.
#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 num=0; while(*str) { num++; if(*str<48) return 0; if(*str>57) { if((*str==88)&&(*(str+1)==0)&&(num==18)) return 1; else return 0; } str++; } if(num==18) return 1; }
task7.
#include<stdio.h> #define N 80 void encoder(char *str,int n);; void decoder(char *str,int n); int main() { char words[N]; int n; printf("输入英文文本:"); gets(words); printf("输入n:"); scanf("%d",&n); printf("编码后的英文文本:"); encoder(words,n); printf("%s\n",words); printf("对编码后的英文文本解码:"); decoder(words,n); printf("%s\n",words); return 0; } void encoder(char *str,int n) { int i,j; while(*str) { if((65<=*str)&&(*str<=90)) { if(*str<=90-n) *str+=n; else { i=n-(90-*str)-1; *str='A'+i; } } if((97<=*str)&&(*str<=122)) { if(*str<=122-n) *str+=n; else { j=n-(122-*str)-1; *str='a'+j; } } str++; } } void decoder(char *str,int n) { int i,j; while(*str) { if((65<=*str)&&(*str<=90)) { if(*str>=65+n) *str-=n; else { i=65+n-*str-1; *str='Z'-i; } } if((97<=*str)&&(*str<=122)) { if(*str>=97+n) *str-=n; else { j=97+n-*str-1; *str='z'-j; } } str++; } }
task8.
1 #include <stdio.h> 2 #include<string.h> 3 4 int main(int argc, char *argv[]) { 5 int i,j,k; 6 int *temp; 7 8 for(i = 1; i < argc-1; ++i) 9 { 10 k=i; 11 for(j = i+1;j<argc;++j) 12 if(strcmp(argv[j],argv[k])<0) 13 k=j; 14 if(k!=i) 15 { 16 temp=argv[i]; 17 argv[i]=argv[k]; 18 argv[k]=temp; 19 } 20 } 21 for(i=1;i<argc;++i) 22 printf("hello, %s\n", argv[i]); 23 24 return 0; 25 }
实验总结:复习了以前的知识,并且训练了写代码的速度,关于算法的探究更加深入透彻。