实验五
任务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 }
问题1:
函数find_min_max的功能是找出一组数据中的最大值和最小值。
问题2:
指针变量pmin、pmax指向x[0]对应的地址。
任务2:
源代码
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 }
问题1:
数组s1的大小是80;sizeof(s1)计算的是数组s1所占的总字节数;strlen(s1)统计的是数组s1中字符所占个数。
问题2:
不能;对字符数组只能对各个元素赋值,不能将一个常量字符串赋值给字符数组。
问题3:
是。
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 }
问题1:
指针变量s1中存放的是该字符串首个字符的地址;sizeof(s1)计算的是指针本身的大小;strlen(s1)统计的是字符个数。
问题2:
可以替换;task2_1.c中的s1是一个地址常量,无法进行赋值操作,对字符数组只能对各个元素赋值,而task2_2.c中则可以将一个常量字符串赋值给字符指针,将常量串首地址赋值给字符指针。
问题3:
交换的是地址;没有交换。
任务3:
源代码
1 #include <stdio.h> 2 3 int main(){ 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 16 printf("\n输出2:使用指针变量ptr1(指向元素)间接访问\n"); 17 for(ptr1 = &x[0][0],i = 0;ptr1 < &x[0][0]+8;++ptr1,++i){ 18 printf("%d",*ptr1); 19 20 if((i+1)%4==0) 21 printf("\n"); 22 } 23 24 printf("\n输出3:使用指针变量ptr2(指向一维数组)间接访问\n"); 25 for(ptr2 = x;ptr2 < x + 2;++ptr2){ 26 for(j = 0;j < 4; ++j) 27 printf("%d",*(*ptr2 +j)); 28 printf("\n"); 29 } 30 31 return 0; 32 }
问题1:
int (*ptr)[4];中,标识符ptr表示的语义是用指针变量ptr来指向二维数组x的行。
问题2:
int *ptr;中,标识符ptr表示的语义是定义了列指针ptr并指向数组元素。
任务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 23 while(*str){ 24 if(*str == old_char) 25 *str = new_char; 26 str++; 27 } 28 }
问题1:
函数replace的功能是将原始文本中的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 char str[N]; 8 char ch; 9 10 while(printf("输入字符串:"),gets(str)!=NULL){ 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 21 return 0; 22 } 23 24 char *str_trunc(char *str,char x){ 25 while(*str != x) 26 str++; 27 *str='\0'; 28 str++; 29 while(*str != '\0'){ 30 *str=' '; 31 str++; 32 } 33 34 return str; 35 }
问题:
去掉后,无法进行多次输入单个字符,无法实现预期结果;line18在这里用于去掉输入一个字符时末尾输入的回车键。
任务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 int length=strlen(str); 27 if(length!=18){ 28 return 0; 29 } 30 31 int i; 32 for(i=0;i<length-1;i++){ 33 if(str[i]<'0'||str[i]>'9') 34 return 0; 35 } 36 37 if(str[17]=='X'||(str[17]>='0'&&str[17]<='9')){ 38 return 1; 39 } 40 41 return 0; 42 }
任务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 10 printf("输入英文文本:"); 11 gets(words); 12 13 printf("输入n:"); 14 scanf("%d",&n); 15 16 printf("编码后的英文文本:"); 17 encoder(words,n); 18 printf("%s\n",words); 19 20 printf("对编码后的英文文本解码:"); 21 decoder(words,n); 22 printf("%s\n",words); 23 24 return 0; 25 } 26 27 void encoder(char *str,int n){ 28 n%=26; 29 while(*str!='\0'){ 30 if(*str>='a'&&*str<='z') 31 *str=(*str-'a'+n)%26+'a'; 32 if(*str>='A'&&*str<='Z') 33 *str=(*str-'A'+n)%26+'A'; 34 str++; 35 } 36 } 37 38 void decoder(char *str,int n){ 39 n%=26; 40 while(*str!='\0'){ 41 if(*str>='a'&&*str<='z') 42 *str='z'-('z'-*str+n)%26; 43 if(*str>='A'&&*str<='Z') 44 *str='Z'-('Z'-*str+n)%26; 45 str++; 46 } 47 }
任务8:
源代码
1 #include <stdio.h> 2 #include <string.h> 3 4 int main(int argc,char *argv[]){ 5 int i,j; 6 char *tmp; 7 8 for(i=1;i<argc;++i){ 9 for(j=1;j<argc-i;++j){ 10 if(strcmp(argv[j],argv[j+1])>0){ 11 tmp=argv[j]; 12 argv[j]=argv[j+1]; 13 argv[j+1]=tmp; 14 } 15 } 16 } 17 18 for(i=1;i<argc;++i) 19 printf("hello,%s\n",argv[i]); 20 21 return 0; 22 }