实验五
TASK 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 { 10 int a[N]; 11 int min,max; 12 13 printf("录入%d个数据:\n",N); 14 input(a,N); 15 16 printf("数据是:\n"); 17 output(a,N); 18 19 printf("数据处理...\n"); 20 find_min_max(a,N,&min,&max); 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 { 29 int i; 30 31 for(i=0;i<n;++i) 32 scanf("%d",&x[i]); 33 } 34 35 void output(int x[],int n) 36 { 37 int i; 38 39 for(i=0;i<n;++i) 40 printf("%d",x[i]); 41 printf("\n"); 42 } 43 44 void find_min_max(int x[],int n,int *pmin,int *pmax) 45 { 46 int i; 47 *pmin=*pmax=x[0]; 48 for(i=0;i<n;++i) 49 { 50 if(x[i]<*pmin) 51 *pmin=x[i]; 52 else if(x[i]>*pmax) 53 *pmax=x[i]; 54 } 55 }
问题1:find_min_max能够在输入的数据中同时找到最大值和最小值
问题2:作为初始化,pmin和pmax同时指向数组中的第一个元素
TASK 2.1
1 #include <stdio.h> 2 #include <string.h> 3 #define N 80 4 5 int main() 6 { 7 char s1[N] = "Learning makes me happy"; 8 char s2[N] = "Learning makes me sleepy"; 9 char tmp[N]; 10 11 printf("sizeof(s1) vs. strlen(s1): \n"); 12 printf("sizeof(s1) = %d\n", sizeof(s1)); 13 printf("strlen(s1) = %d\n", strlen(s1)); 14 15 printf("\nbefore swap:\n"); 16 printf("s1:%s\n",s1); 17 printf("s2:%s\n",s2); 18 19 printf("\nswapping...\n"); 20 strcpy(tmp,s1); 21 strcpy(s1,s2); 22 strcpy(s2,tmp); 23 24 printf("\nafter swap:\n"); 25 printf("s1:%s\n",s1); 26 printf("s2:%s\n",s2); 27 28 return 0; 29 }
问题1:s1共24字节,sizeof(s1)计算的是s1可以存放的字符串长度,strlen(s1)统计的是s1字符串除去末尾结束标志后的长度
问题2:不能。新的写法会把整个句子传入字符串数组的第一个元素的位置
问题3:内容交换了
TASK 2.2
1 #include<stdio.h> 2 #include<string.h> 3 #define N 80 4 5 int main() 6 { 7 char *s1="Learning makes me happy"; 8 char *s2="Learning makes me sleepy"; 9 char *tmp; 10 11 printf("sizeof(s1) vs. strlen(s1):\n"); 12 printf("sizeof(s1)=%d\n",sizeof(s1)); 13 printf("strlen(s1)=%d\n",strlen(s1)); 14 15 printf("\nbefore swap:\n"); 16 printf("s1:%s\n",s1); 17 printf("s2:%s\n",s2); 18 19 printf("\nswapping...\n"); 20 tmp=s1; 21 s1=s2; 22 s2=tmp; 23 24 printf("\nafter swap:\n"); 25 printf("s1:%s\n",s1); 26 printf("s2:%s\n",s2); 27 28 return 0; 29 }
问题1:指针变量s1存放的是字符串s1的起始地址,sizeof(s1)计算的是s1地址的长度,strlen(s1)计算的是
问题2:可以替换。改写后是用指针变量指向字符串s1存放地址,间接访问到字符串
问题3:交换的是指针变量指向的地址,也就是两个字符串的存放地址。字符串本身在内存中不动
TASK 3
1 #include<stdio.h> 2 3 int main() 4 { 5 int x[2][4] = {{1,9,8,4},{2,0,4,9}}; 6 int i,j; 7 int *ptr1; 8 int(*ptr2)[4]; 9 10 printf("输出1:使用数组名、下标直接访问二维数组元素\n"); 11 for(i = 0;i < 2;++i) 12 { 13 for(j = 0;j < 4;++j) 14 printf("%d",x[i][j]); 15 printf("\n"); 16 } 17 18 printf("\n输出2:使用指针变量ptr1(指向元素)间接访问\n"); 19 for(ptr1 = &x[0][0],i = 0;ptr1 < &x[0][0] + 8;++ptr1,++i) 20 { 21 printf("%d",*ptr1); 22 23 if((i+1)%4 == 0) 24 printf("\n"); 25 } 26 27 printf("输出3:使用指针变量ptr2(指向一维数组)间接访问\n"); 28 for(ptr2 = x;ptr2 < x+2;++ptr2) 29 { 30 for(j = 0;j < 4;++j) 31 printf("%d",*(*ptr2 + j)); 32 printf("\n"); 33 } 34 35 return 0; 36 }
ptr1和ptr2都是通过指针变量间接访问到数组元素,但ptr1是元素指针、ptr2是行指针,在执行时ptr1访问一个一个的元素,ptr2直接访问数组的第一行
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 10 printf("原始文本:\n"); 11 printf("%s\n",text); 12 13 replace(text,'i','*'); 14 15 printf("处理后文本:\n"); 16 printf("%s\n",text); 17 18 return 0; 19 } 20 21 void replace(char *str,char old_char,char new_char) 22 { 23 int i; 24 while(*str) 25 { 26 if(*str == old_char) 27 *str = new_char; 28 str++; 29 } 30 }
问题1:replace函数可以将指定的old_char字符全部找出并替换成指定的new_char
问题2:可以的,因为'\0'的值也是0,在执行时都可以表示在没有到达结束标志前都重复执行替换
TASK 5
1 #include<stdio.h> 2 #define N 80 3 4 char *str_trunc(char *str,char x); 5 6 int main() 7 { 8 char str[N]; 9 char ch; 10 11 while (printf("输入字符串:"),gets(str)!=NULL) 12 { 13 printf("输入一个字符:"); 14 ch = getchar(); 15 16 printf("截断处理...\n"); 17 str_trunc(str,ch); 18 19 printf("截断处理后的字符串:%s\n\n",str); 20 } 21 22 return 0; 23 } 24 25 char *str_trunc(char *str,char x) 26 { 27 char *ptr = str; 28 while(*ptr!='\0') 29 { 30 if(*ptr==x) 31 { 32 *ptr='\0'; 33 break; 34 } 35 ptr++; 36 } 37 38 return str; 39 }
去掉getchar()之后的输出结果呈现出诡异的错位。。。?而且无法用^Z结束进程(如下图)
对比之后可以大致推测出,getchar()的作用是对str[]重新赋值,方便进入下一轮循环
TASK 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 { 27 28 int i; 29 int len = strlen(str); 30 if(len!=18) 31 return 0; 32 for(i=0;i<17;i++) 33 { 34 if(str[i]<'0'||str[i] > '9') 35 return 0; 36 } 37 if((str[17] < '0'||str[17] > '9')&&str[17]!='X') 38 return 0; 39 return 1; 40 }
TASK 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 { 8 char words[N]; 9 int n; 10 11 printf("输入英文文本:"); 12 gets(words); 13 14 printf("输入n:"); 15 scanf("%d",&n); 16 17 printf("编码后的英文文本:"); 18 encoder(words,n); 19 printf("%s\n",words); 20 21 printf("对编码后的英文文本解码:"); 22 decoder(words,n); 23 printf("%s\n",words); 24 25 return 0; 26 } 27 28 void decoder(char *str,int n) 29 { 30 int i; 31 for(i=0;str[i]!='\0';i++) 32 { 33 if(str[i]>'a'&&str[i]<'z') 34 str[i] = (str[i] - 'a' - n + 26)%26 + 'a'; 35 else if(str[i]>'A'&&str[i]<'Z'-n) 36 str[i] = (str[i] - 'A' - n + 26)%26 + 'A'; 37 } 38 } 39 40 void encoder(char *str,int n) 41 { 42 int i; 43 for(i=0;str[i]!='\0';i++) 44 { 45 if(str[i]>'a'&&str[i]<='z') 46 str[i] = (str[i] - 'a' + n)%26 + 'a'; 47 48 else if(str[i]>'A'&&str[i]<='Z') 49 str[i] = (str[i] - 'A' + n)%26 + 'A'; 50 } 51 }
TASK 8
代码写了但是不知道怎么运行。。。所以也没法验证我写的对不对