指针参考程序编程题:1.编写程序,用指针实现读入一行数列,求数列的和,平均值,最大值、最小值,并且打印它们。#includestdio.h#includelimits.hvoidmain(){intarray[80],*p;intn,i,sum=0,max=INT_MIN,min=INT_MAX;/*符号常量INT_MIN和INT_MAX分别表示int型的最小值和最大值,在limits.h中定义*/printf(请确定要输入的整数个数n);scanf(%d,&n);printf(请输入%d个整数,n);p=array;for(i=0;in;i++){scanf(%d,p);if(*pmax)max=*p;if(*pmin)min=*p;sum=sum+*p;p++;}printf(输入的%d个整数为,n);/*输出所有整数*/p=array;for(i=0;in;i++)printf(%d,*p++);putchar('\n');printf(以上整数的累加和为%d\n,sum);printf(以上整数的平均值为%.2f\n,(float)sum/n);printf(以上整数的最大值为%d\n,max);printf(以上整数的最小值为%d\n,min);}2.编写字符串插入函数char*strins(char*s1,char*s2),将字符串s2的内容插入到字符串s1之前,参数s1,s2为指向字符串的指针。函数执行后,返回值为结果字符串的首地址(即s1),参数s1为结果字符串中原来子串s1的首地址,参数s2不变。例如:s1=”world”,s2=”hello”,结果字符串为”helloworld”,s1指向字符‘h’。在main函数中输入两个字符串,调用该函数完成字符串的插入,并输出结果。#includestdio.hchar*strins(char*s1,char*s2){intlen1=0,len2=0;char*p1,*p2;p1=s1;while(*p1++)//计算s1的长度len1++;p2=s2;while(*p2++)//计算s2的长度len2++;//把s1中的每个字符顺次向后移动len2个位置,包括结束符'\0'p1=s1+len1;//指向s1的结束符'\0'do{*(p1+len2)=*p1;}while(p1--!=s1);/*至少要移动一次,因此用do~while循环*///把s2拷贝插入到s1的前面p1=s1;p2=s2;while(*p2)*p1++=*p2++;returns1;}voidmain(){charstr1[80],str2[80],*p;printf(inputfirststring:);gets(str1);printf(inputsecondstring:);gets(str2);printf(原来的字串s1:);puts(str1);p=strins(str1,str2);printf(插入后的字符串:);puts(str1);/*这里puts(str1)和puts(p)的输出结果一样,因为p指针实际上就是指向str1的第一个元素*/puts(p);}3.编写字符串函数char*substr(char*str1,char*str2),判断字符串str2是否为str1的子串,如果是,则返回str1中首次出现子串str2的起始位置,否则,返回NULL值。例如:str1=”Iamastudent”,str2=”stu”,函数执行后,返回值指向字符‘s’,参数s1,s2不变。在main函数中输入两个字符串,调用该函数判断第二个字符串是否为第一个字符串的子串,并输出结果。#includestdio.hchar*substr(char*str1,char*str2);voidmain(){chars1[80],s2[20],*p;printf(inputstring1:\n);gets(s1);printf(inputstring2:\n);gets(s2);/*s2为要验证的字串*/p=substr(s1,s2);if(p!=NULL){printf(\n第二个字符串是第一个字符串的子串!\n);printf(p指针指向字符%c!\n,*p);}elseprintf(\n第二个字符串不是第一个字符串的子串,p为空指针!\n);}char*substr(char*str1,char*str2){char*p,*q,*s;for(s=str1;*s!='\0';s++){if(*s==*str2)/*str1中是否有和str2首字符相同的字符*/{for(p=s,q=str2;*p&&*q;p++,q++)/*判断接下去的几个字符是否相同*/{if(*p!=*q)/*不相同*/break;}if(*q=='\0')/*所有字符都相同*/returns;/*是子串,返回指向第一个字符的指针*/}}returnNULL;/*没有匹配的字符串,返回空指针*/}4.编写字符串函数intlenstr(char*str),求字符串str的长度。在main函数中输入一个字符串,调用该函数计算字符串的长度,并输出结果。#includestdio.hintlenstr(char*str);voidmain(){chars[80];printf(请输入一个字符串以回车结束:\n);gets(s);printf(该字符串的长度为%d\n,lenstr(s));}intlenstr(char*str){char*p;intlen=0;for(p=str;*p;p++)len++;returnlen;}5.编写字符串函数char*cutstr(char*str,intn),将字符串str中前面的n个字符删除,后续字符前移。函数执行后,参数str,n不变,如果成功,返回值为str首地址,如果未成功,返回值为NULL。例如:str=”Iamastudent”,n=2,函数执行后str=”amastudent”。在main函数中输入一个字符串和一个正整数n,调用该函数将字符串前面的n个字符删除,后续字符前移,并输出结果。#includestdio.h#includestring.hchar*cutstr(char*str,unsignedintn);voidmain(){chars[80],*p;unsignedintn;printf(请输入一个字符串以回车结束:\n);gets(s);printf(请输入要删除前面的字符个数:);scanf(%d,&n);p=cutstr(s,n);printf(删除前面%d个字符后字符串为:%s\n,n,p);//这里p用s替代结果一样}char*cutstr(char*str,unsignedintn){char*p;if(strlen(str)n)/*要删除的字符数大于字符串中实际字符个数*/*str='\0';else{for(p=str+n;*p;p++)/*后续字符前移*/*(p-n)=*p;*(p-n)='\0';/*串结束标志*/}returnstr;}6.编写一个排序函数sort,将数组按照从大到小的顺序排序,其中有两个形式参数,一个为指向数组的指针p,另一个为数组的元素个数n。在main函数中输入10个整数存入数组data[10]中,调用该函数对data进行排序,并输出最后的排序结果。#includestdio.hvoidsort(int*a,intn)//无返回值,在原数组上排序{inti,j,temp;for(i=0;in-1;i++)/*冒泡排序*/for(j=0;jn-i-1;j++)if(*(a+j)*(a+j+1)){temp=*(a+j);*(a+j)=*(a+j+1);*(a+j+1)=temp;}}voidmain(void){intdata[10];inti;printf(请输入10个整数:\n);for(i=0;i10;i++)scanf(%d,&data[i]);sort(data,10);printf(降序排序后的数组为:\n);for(i=0;i10;i++)printf(%d,data[i]);printf(\n);}选做题:编写程序,用指针实现读入字符串s,字符串s1,字符串s2,如果s1是字符串s的子串,则用s2替换s中的s1,并且打印结果字符串。例如s=”abcde123fghijk123mn45”,s1=”123”,s2=”88”,程序执行后s=”abcde88fghijk88mn45”#includestdio.h#includestring.h//利用前面设计的函数//char*strins(char*s1,char*s2)将字符串s2的内容插入到字符串s1之前//char*cutstr(char*str,intn),将字符串str中前面的n个字符删除,后续字符前移//以及c库函数char*strstr(char*s1,char*s2)从字符串s1中寻找子串s2第一次出现的位置,返回指向第一次出现s2的指针,如果没找到返回NULLchar*strins(char*s1,char*s2){intlen1=0,len2=0;char*p1,*p2;p1=s1;while(*p1++)//计算s1的长度len1++;p2=s2;while(*p2++)//计算s2的长度len2++;//把s1中的每个字符顺次向后移动len2个位置,包括结束符'\0'p1=s1+len1;//指向s1的结束符'\0'do{*(p1+len2)=*p1;}while(p1--!=s1);/*至少要移动一次,因此用do~while循环*///把s2拷贝插入到s1的前面p1=s1;p2=s2;while(*p2)*p1++=*p2++;returns1;}char*cutstr(char*str,unsignedintn){char*p;if(strlen(str)n)/*要删除的字符数大于字符串中实际字符个数*/*str='\0';else{for(p=str+n;*p;p++)/*后续字符前移*/*(p-n)=*p;*(p-n)='\0';/*串结束标志*/}returnstr;}voidmain(){chars1[80],s2[20],s3[20],*p,*q;unsignedintlen2,len3;puts(请输入字符串s1以回车结束:);gets(s1);puts(请输入字符串s2以回车结束:);gets(s2);puts(请输入字符串s3以回车结束:);gets(s3);len2=strlen(s2);len3=strlen(s3);q=s1;do{p=strstr(q,s2);//在q指向的字符串中查找s2第一次出现的位置if(p!=NULL)//s2是q的子串,此时p指向该子串第一次出现的位置{//用s3替换s2cutstr(p,len2);//删除p指针开始的子串s2strins(p,s3);//将s3插入p指针指定的位置}q=p+len3;//继续查找}while(p!=NULL);//直到q指向的串中没有能够匹配的子串printf(用字符串s3替换掉子串s2后新的s1串为\n);puts(s1);}