C语言基础算法---从数组中找最大最小值的基础应用

有一个很基础的算法在做嵌入式开发中经常会使用到,那就是找最值,最常见的是以下两个宏:

#define max(a,b) ((a) > (b) ? (a) : (b))
#define min(a,b) ((a) < (b) ? (a) : (b))

max和min宏分别比较两个值谁大谁小,然后予以返回,很简单。

但如果是比较多个数据的数值,我们就需要数组里对元素的比较算法了,来看看程序实现:

find_buffer_max_min.c

#include 
#include 
#include 
#define NR(x) (sizeof(x)/sizeof(x[0]))
#define u32 unsigned int 
#define u8  unsigned char
//找数组的最小值 
static u32 find_buffer_min(u32 buffer_value_min,u32 size,u32 *buffer)
{
	u8 count = 0 ; 
	u32 min = buffer_value_min ;
	//遍历数组size个字节 
	for(count = 0 ; count < size ; count++)
	{
		//比较当前数组的索引值是否小于当前设定的最小值 
		//如果是的话,将该值赋值给min,依次通过for循环遍历,直到找到最小值 
		if(buffer[count] < min)
			min = buffer[count];
	}
	//返回最小值 
	return min ; 
}
//找数组的最大值 
static u32 find_buffer_max(u32 buffer_value_max,u32 size,u32 *buffer)
{
	u8 count = 0 ; 
	u32 max = buffer_value_max ;
	//遍历数组size个字节 
	for(count = 0 ; count < size ; count++)
	{
		//比较当前数组所在的索引值是否大于当前设定的最大值 
		//如果是的话,将该值赋值给max,依次通过for循环遍历,直到找到最大值 
		if(buffer[count] > max)
			max = buffer[count];
	}
	//返回最大值 
	return max ; 
}


int main(void)
{
	int i = 0 ;
	int buffer[10] = {11111,45465,5454,11211,45778,21144,854,12347,12347,8898};
	int min = find_buffer_min(32767,NR(buffer),buffer);
	int max = find_buffer_max(32767,NR(buffer),buffer);
	printf("min:%d  max:%d\n",min,max);
	return 0 ; 
} 

运行结果:

C语言基础算法---从数组中找最大最小值的基础应用_第1张图片

测试案例看似有点泛泛,可能各位看完也不知道具体用到哪里,接下来我们来看一个具体的应用案例吧!以下程序运行在秉火STM32F103霸道的开发板上,参考官方提供的程序demo,经过个人修改而来。

用DS18B20温度传感器,设置4个窗值,找最大值,由于温度带有小数,所以类型应是浮点型数据:

#include "stm32f10x.h"
#include "bsp_usart.h"
#include "bsp_SysTick.h"
#include "bsp_ds18b20.h"

#define NR(x) (sizeof(x)/sizeof(x[0]))
static float find_buffer_max(float buffer_value_max,u32 size,float *buffer);

int main(void)
{	
	int i = 0;
	float temp_max;
	//设置温度保存的缓存有4个窗值,可以更改 
	float temp_buffer[4] ;
	uint8_t uc, ucDs18b20Id [ 8 ];
	SysTick_Init();
	USART_Config();
	while( DS18B20_Init() )	
		printf("\r\n no ds18b20 exsit \r\n");
	DS18B20_ReadId ( ucDs18b20Id  );          

	for ( uc = 0; uc < 8; uc ++ )            
	 printf ( "%.2x", ucDs18b20Id [ uc ] );
	while(1)
	{	
		//当计数等于测试窗值时,则从4个窗值找温度的最大值 
		if(i == NR(temp_buffer))
		{
			temp_max = find_buffer_max(0.0,NR(temp_buffer),temp_buffer);
			printf"温度的最大值为:%.1f\n",temp_max);
			//清计数器 
			i = 0 ;
		}
		//将当前温度保存到窗值数组
		temp_buffer[i] = DS18B20_GetTemp_MatchRom (ucDs18b20Id); 
		Delay_ms(1000);		
		printf("当前温度值为:%.1f\n",temp_buffer[i]);
		i++ ;
	}	 
}

//找最大值 
static float find_buffer_max(float buffer_value_max,u32 size,float *buffer)
{
	u8 count = 0 ; 
	float max = buffer_value_max ;
	for(count = 0 ; count < size ; count++)
	{
		if(buffer[count] > max)
			max = buffer[count];
	}
	return max ; 
}

运行结果:

C语言基础算法---从数组中找最大最小值的基础应用_第2张图片

 

 

你可能感兴趣的:(C语言-算法与数据结构编程)