C经典用法

/*******************************************

说明:

二分查找法的优点:查找速度快 1024个长度的表最长只需10次查表就能得出结果
在用NTC测试温度的方案中,NTC的温度表的长度一般是100-200 有些达到400-500的长度
在这种情况下如果用逐个查表比较的方法来查温度 会导致查表的时间过长,影响程序的
执行效率 这里推出一个优秀的算法来取代这种最笨的做法

应用实例如下:

#define	TempSize  100 //定义表长度
//温度值对应的AD值的表的定义
const int16 TabNtc_100K[TempSize]={0xf00,0xe00,oxd00,......};

int16 *pTmp ; //定义一个字长的指针
	
pTmp = TabNtc_100K ; //指向要温度表的地址
CuTemp = FineTab(pTmp,TempSize,R_NTCAD); //查表得出温度 R_NTCAD为NTC分压得出的AD值


********************************************/
//*************************************
// 函数名称:FineTab  二分查找算法 ->查温度表
// 函数功能:查找数据在表中对应的位置 表中数据从大到小
// 入口参数:表地址、表长度、要查找的数据
// 出口参数:无
// 返 回 值:数据在表中的位置
//*************************************
uint8 FineTab(uint16 *a,uint8 TabLong,uint16 data)//表中数据从大到小
{
	uint8 st,ed,m ;
	uint8 i ;

	st = 0 ;
	ed = TabLong-1 ;
	i = 0  ;

	if(data >= a[st]) return st ;
	else if(data <= a[ed]) return ed ;

	while(st < ed)
	{
		m = (st+ed)/2 ;

		if(data == a[m] ) break ;
		if(data < a[m] && data > a[m+1]) break ;
		
		
		if(data > a[m])	ed = m ;					
		else st = m ;	
		
		if(i++ > TabLong) break ;
	}

	if(st > ed ) return 0 ; 

	return m ;
}


//*************************************
// 函数名称:FineTab  二分查找算法 ->查温度表
// 函数功能:查找数据在表中对应的位置    表中数据从小到大
// 入口参数:表地址、表长度、要查找的数据
// 出口参数:无
// 返 回 值:数据在表中的位置
//***************************************

uint8 FineTab(uint16 *a,uint8 TabLong,uint16 dat)//表中数据从小到大
{
		uint8 st,ed,m ;
		uint8 i ;
	
		st = 0 ;
		ed = TabLong-1 ;
		i = 0  ;
	
		if(dat >= a[ed]) return ed ;
		else if(dat <= a[st]) return st ;
	
		while(st < ed)
		{
			m = (st+ed)/2 ;
	
			if(dat == a[m] ) break ;
			if(dat < a[m+1] && dat > a[m]) break ;
			
			
			if(dat > a[m]) st = m ;	//ed = m ;					
			else ed = m ;//st = m ;	
			
			if(i++ > TabLong) break ;
		}
	
		if(st > ed ) return 0 ; 
	
		return m ;

}
posted @ 2020-08-24 14:33  咸菜白饭  阅读(8)  评论(0)    收藏  举报