1. 实验任务1
task1_1.c
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 22 printf("输出结果:\n"); 23 printf("min=%d,max=%d\n",min,max); 24 25 return 0; 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 int i; 37 38 for(i = 0; i < n; ++i) 39 printf("%d ", x[i]); 40 printf("\n"); 41 } 42 void find_min_max(int x[],int n,int *pmin,int *pmax) 43 { 44 int i; 45 46 *pmin=*pmax=x[0]; 47 48 for(i=1;i<n;++i) 49 if(x[i]<*pmin) 50 *pmin=x[i]; 51 else if(x[i]>*pmax) 52 *pmax=x[i]; 53 }
1. 函数 find_min_max 实现的功能是查找数组元素的最小值和最大值,并将其通过指针变量放到main函数的min max 中
2. "指针变量在使用之前必须指向确定的地址"。执行到line45时,指针变量pmin、pmax 都指向x[0]
task1_2.c
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 { 10 int a[N]; 11 int *pmax; 12 13 printf("录入%d个数据:\n", N); 14 input(a, N); 15 16 printf("数据是: \n"); 17 output(a, N); 18 19 printf("数据处理...\n"); 20 pmax=find_max(a,N); 21 22 printf("输出结果:\n"); 23 printf("max= %d\n",*pmax); 24 25 return 0; 26 27 } 28 void input(int x[], int n) { 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 int i; 37 38 for(i = 0; i < n; ++i) 39 printf("%d ", x[i]); 40 printf("\n"); 41 } 42 int *find_max(int x[], int n) 43 { 44 int max_index = 0; 45 int i; 46 47 for(i = 1; i < n; ++i) 48 if(x[i] > x[max_index]) 49 max_index = i; 50 51 return &x[max_index]; 52 }
1. 函数 find_max 的功能是找出数组元素的最大值,并返回最大值所在地址
2. 把函数 find_max 的实现写成以下代码,可以,通过返回指针变量的值,返回最大值地址
2. 实验任务2
task2_1.c
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[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("\nswaping...\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的大小是4, sizeof(s1) 计算的是字符串所占用的字节数, strlen(s1) 统计的是有效字符数,不包括'\0'
问题2:line6代码,不能替换成以下写法,s1 是字符串数组的起始地址常量
task2_2.c
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("\nswaping...\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中存放的是字符串的初始地址 , sizeof(s1) 计算的是指针变量s1所占用的字节数, strlen(s1) 统计的是s1所指向的字符串所占用的有效字节数
问题2:line6代码能替换成下面的写法,对比task2_1.c中的line7, task2_1中s1是地址常量,不能复制,task2_2中s1是指针变量,该语义是把字符串的初始地址赋值给s1
问题3:line19-line21,交换的是地址,s1 和s2所指向的字符串改变,字符串常量"Learning makes me happy"和字符串常 量"Learning makes me sleepy"在内存存储单元中没有交换
3. 实验任务3
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; 7 int(*ptr2)[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 17 printf("\n输出2:使用指向元素的指针变量ptr1间接访问二维数组元素\n"); 18 for(ptr1=&x[0][0],i=0;ptr1<&x[0][0]+8;++ptr1,++i) 19 { 20 printf("%d",*ptr1); 21 22 if((i+1)%4==0) 23 printf("\n"); 24 } 25 26 printf("\n输出3:使用指向一维数组的指针变量ptr2间接访问二维数组元素\n"); 27 for(i=0,ptr2=x;i<2;++i,++ptr2) 28 { 29 for(j=0;j<4;++j) 30 printf("%d",*(*ptr2+j)); 31 printf("\n"); 32 } 33 34 return 0; 35 }
int (*ptr)[4]; 中,标识符ptr表示的语义是ptr指向一维数组,相当于x[],
int *ptr[4];中,标识符ptr表示的语义是指针数组ptr[4]的起始地址
4. 实验任务4
task4-1.c
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]="c programming is difficult or not,it is a question."; 9 10 11 printf("原始文本:\n"); 12 printf("%s",text); 13 14 replace(text,'i','*');//函数调用,注意字符形参写法,单引号不能少 15 16 printf("处理后文本:\n"); 17 printf("%s\n",text); 18 19 return 0; 20 } 21 void replace(char *str,char old_char,char new_char) 22 { 23 while(*str) 24 { 25 if(*str==old_char) 26 *str=new_char; 27 *str++; 28 } 29 }
1. 函数 replace 的功能是把字符串中出现的old_char 替换为new_char
2. line24, 圆括号里循环条件可以改写成 *str != '\0','\0'存放的编码值即为0;
task4-2.c
1 #include<stdio.h> 2 #define N 80 3 4 void str_trunc(char *str,char x); 5 6 int main() 7 { 8 char str[N]; 9 char ch; 10 11 printf("输入字符串:"); 12 gets(str); 13 14 printf("输入一个字符:"); 15 ch=getchar(); 16 17 printf("截断处理...\n"); 18 str_trunc(str,ch); 19 20 printf("截断处理后的字符串:%s\n",str); 21 22 return 0; 23 } 24 void str_trunc(char *str,char x) 25 { 26 while(*str) 27 { 28 if(*str==x) 29 *str='\0';//blank 1 30 str++;//blank 2 31 } 32 }
5. 实验任务5
task5-1.c
1 #include<stdio.h> 2 #include<string.h> 3 void sort(char *name[],int n); 4 5 int main() 6 { 7 char *course[4]={"C Program", 8 "C++ Object Oriented Program", 9 "Operating System", 10 "Data Structure and Algorithms"}; 11 int i; 12 13 sort(course,4); 14 15 for(i=0;i<4;++i) 16 printf("%s\n",course[i]); 17 18 return 0; 19 } 20 void sort(char *name[],int n) 21 { 22 int i,j; 23 char *tmp; 24 25 for(i=0;i<n-1;++i) 26 for(j=0;j<n-1-i;++j) 27 if(strcmp(name[j],name[j+1])>0) 28 { 29 tmp=name[j]; 30 name[j]=name[j+1]; 31 name[j+1]=tmp; 32 } 33 }
task5-2.c
1 #include<stdio.h> 2 #include<string.h> 3 void sort(char *name[],int n); 4 5 int main() 6 { 7 char *course[4]={"C Program", 8 "C++ Object Oriented Program", 9 "Operating System", 10 "Data Structure and Algorithms"}; 11 int i; 12 13 sort(course,4); 14 15 for(i=0;i<4;++i) 16 printf("%s\n",course[i]); 17 18 return 0; 19 } 20 void sort(char *name[],int n) 21 { 22 int i,j,k; 23 char *tmp; 24 25 for(i=0;i<n-1;++i) 26 { 27 for(j=i+1,k=i,tmp=name[k];j<n;++j) 28 if(strcmp(name[j],name[k])<0) 29 k=j; 30 31 if(k!=i) 32 { 33 name[i]=name[k]; 34 name[k]=tmp; 35 } 36 } 37 }
这两种算法实现中,交换的是指针变量的值
6. 实验任务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 "330106199609203301", 11 "53010220051126571", 12 "510104199X11197977", 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 int check_id(char *str) 25 { 26 int k=0; 27 28 while(*str) 29 { 30 str++; 31 k++; 32 } 33 34 if(k!=18) 35 return 0; 36 37 str=str-k; 38 39 for(k=0;k<18;k++) 40 { 41 if(k==17) 42 { 43 if(*(str+k)!='X'&&(*(str+k)<'0'||*(str+k)>'9')) 44 return 0; 45 } 46 else if(*(str+k)<'0'||*(str+k)>'9') 47 return 0; 48 } 49 50 }
7. 实验任务7
1 #include<stdio.h> 2 #define N 80 3 void encoder(char *str); 4 void decoder(char *str); 5 6 int main() 7 { 8 char words[N]; 9 10 printf("输入英文文本:"); 11 gets(words); 12 13 printf("编译后的英文文本:"); 14 encoder(words); 15 printf("%s\n",words); 16 17 printf("对编译后的英文文本解码:"); 18 decoder(words); 19 printf("%s\n",words); 20 21 return 0; 22 } 23 void encoder(char *str) 24 { 25 while(*str) 26 { 27 if((*str>='a'&&*str<'z')||(*str>='A'&&*str<'Z')) 28 (*str)++; 29 30 else if(*str=='z') 31 *str='a'; 32 else if(*str=='Z') 33 *str='A'; 34 35 str++; 36 } 37 } 38 void decoder(char *str) 39 { 40 while(*str) 41 { 42 if((*str>'a'&&*str<='z')||(*str>'A'&&*str<='Z')) 43 (*str)--; 44 45 else if(*str=='a') 46 *str='z'; 47 else if(*str=='A') 48 *str='Z'; 49 50 str++; 51 } 52 }
8. 实验任务8
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 int main(int argc,char *argv[]) 5 { 6 int i,j,k; 7 char *tmp; 8 9 for(i=1;i<argc;++i) 10 { 11 for(j=i+1,k=i,tmp=argv[k];j<argc;++j) 12 if(strcmp(argv[j],tmp)<0) 13 k=j; 14 if(k!=i) 15 { 16 argv[i]=argv[k]; 17 argv[k]=tmp; 18 } 19 } 20 21 for(i=1;i<argc;++i) 22 printf("hello,%s\n",argv[i]); 23 24 system("pause"); 25 return 0; 26 }
标签:int,s1,编程,C语言,char,str,printf,include,指针 From: https://www.cnblogs.com/zbb07/p/18211635