一些程序函数 C++语言,找数组中弟第K大的数和自己写的子符串截取函数

最近自己写了一些小函数,调试通过了的,VS2010 C++

主要是两个函数:找数组中弟第K大的数和第k小的数,以及子符串截取函数、拼接、颠倒输出、字符串中子串出现的次数。

1、找数组中弟第K大的数和第k小的数

自己写的寻找第k大或第k小的元素,不改变原数组的数据顺序,注意指针一定会改变原来的数据顺序,故用一个动态指针实现。

findkth函数

void findkth(int *a,int n,int k)    //动态指针
{
	int t,i,j,temp;
	int *p1=new int[n];  //申请资源
	for(i=0;i<n;i++)
	    p1[i]=a[i];
	for(i=0;i<n-1;i++)        //记录下标式选择排序法。
	{
		t=i;            
		for(j=i+1;j<n;j++)
		{
			if(p1[j]<p1[t])
				t=j;
		}
		if(t!=i)
		{
			temp=p1[t];
			p1[t]=p1[i];
			p1[i]=temp;
		}
	}
	cout<<"原数组中第"<<k<<"大的数为:"<<p1[n-k]<<endl;
	cout<<"原数组中第"<<k<<"小的数为:"<<p1[k-1]<<endl;
	delete []p1;	//释放资源    	
}

2、自己写的字符串截取函数 my_substr函数 用到自己的mystrlen函数

int mystrlen(char *str)
{
	int len=0;	
	while(*str)
	{
		str++;
		len++;
	}
	return len;
}


char *my_substr(char *str,int start,int len)
{
	int i,length=0;
	char *p=new char[len];
	length=mystrlen(str);
	if(len > (length-start))
		return "";
	for(i=0;i<len;i++)
		p[i]=str[start+i];
	p[i]='\0';
	return p;	
}

3、字符串拼接my_strcat函数

void my_strcat(char *s1,char *s2)
{
	char *p1=s1,*p2=s2;
	while(*p1)
		p1++;
	while(*p2)
		*p1++=*p2++;
	*p1='\0';
}
4、字符串颠倒输出  my_strdown1与my_strdown2

void my_strdown1(char *str) //字符串颠倒输出,递归。
{
	if(*str)
	{
		my_strdown1(str+1);
		printf("%c",*str);
	}
}

void my_strdown2(char *str)  //字符颠倒输出。
{
	char *p=str,*q=str,c;
	while(*q)
		q++;
	q--;
	for(;p<q;)
	{
		c=*p;
		*p=*q;
		*q=c;
		p++;
		q--;
	}
}

5、字符串中子串出现的次数 my_count函数

int my_count(char *mstr,char *sstr) //比较一个字符串中子串出现的次数。指针实现。
{
	/*  方法一ok!
	*/
	//int i,j; 
 //   int str1len=strlen(mstr),str2len=strlen(sstr); 
 //   int count=0; 
 //   for(i=0;i<str1len-str2len+1;i++)  //整个子串在原串种要扫描的次数,如123 abc 123 ,则子串12,要扫描5次。
 //    { 
 //      for(j=0;j<str2len;j++)    
 //      { 
 //        if(sstr[j]!=mstr[i+j]) 
 //          break;    
 //      } 
 //      if(j==str2len)
 //        count++;    
 //    }
 //    return count;

	/*方法二 ok!
	*/
	int num=0;
	char *p1,*p2;
	p1=mstr;
	p2=sstr;
	while(*mstr!='\0')
	{
		//while(((*p1++)==(*p2++)) && (*p1!='\0') && (*p2!='\0'));   //ok
		//while(((*p1)==(*p2)) && (*p1!='\0'))		//ok
		while(((*p1)==(*p2)) && (*p1!='\0') && (*p2!='\0'))   //ok
		{
			p1++;
			p2++;
		}			
		if(*p2=='\0')
			num++;
		p2=sstr;
		p1=mstr++;
	}
	return num;

	/*方法三 ok!
	*/
	/*char *temp;
	int num=0;
	char *p1,*p2;
	p1=mstr;
	p2=sstr;
    while (*p1!='\0') 
    { 
	    temp = p1;
        if(*temp==*p2)
	    { 
		    while((*temp==*p2)&&(*p2!='\0')&&(*temp!='\0')) 
            {
				temp++; 
                p2++; 
            } 
		} 
        p1++; 
        if(*p2=='\0') num++;
        p2=sstr; 
    }
	return num;*/
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值