C語(yǔ)言基礎(chǔ)算法---從數(shù)組中找最大最小值的實(shí)際應(yīng)用
掃描二維碼
隨時(shí)隨地手機(jī)看文章
最近幾天有文章的讀者反饋,本平臺(tái)發(fā)布的文章只是講了一些基礎(chǔ)知識(shí),并沒(méi)有談到具體應(yīng)用,根據(jù)各位的反饋,我也做了相應(yīng)的思考,所以咱們還是需要理論和實(shí)踐結(jié)合來(lái)寫比較好。等時(shí)機(jī)成熟,也會(huì)將具體的應(yīng)用編寫成一本全新的書籍。
前面寫的測(cè)試案例看似有點(diǎn)泛泛,可能各位看完也不知道具體用到哪里,接下來(lái)我們來(lái)看一個(gè)具體的應(yīng)用案例吧!以下程序運(yùn)行在秉火STM32F103霸道的開(kāi)發(fā)板上,參考官方提供的程序demo,經(jīng)過(guò)個(gè)人修改而來(lái)。
用DS18B20溫度傳感器,設(shè)置4個(gè)窗值,找最大值,由于溫度帶有小數(shù),所以類型應(yīng)是浮點(diǎn)型數(shù)據(jù):
#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;
//設(shè)置溫度保存的緩存有4個(gè)窗值,可以更改
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)
{
//當(dāng)計(jì)數(shù)等于測(cè)試窗值時(shí),則從4個(gè)窗值找溫度的最大值
if(i == NR(temp_buffer))
{
temp_max = find_buffer_max(0.0,NR(temp_buffer),temp_buffer);
printf"溫度的最大值為:%.1f\n",temp_max);
//清計(jì)數(shù)器
i = 0 ;
}
//將當(dāng)前溫度保存到窗值數(shù)組
temp_buffer[i] = DS18B20_GetTemp_MatchRom (ucDs18b20Id);
Delay_ms(1000);
printf("當(dāng)前溫度值為:%.1f\n",temp_buffer[i]);
i++ ;
}
return 0 ;
}
//找最大值
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 ;
}
運(yùn)行結(jié)果:
根據(jù)現(xiàn)實(shí)的工程應(yīng)用情況,我們可能會(huì)對(duì)一個(gè)傳感器的數(shù)據(jù)進(jìn)行長(zhǎng)時(shí)間的觀察就需要用到這樣的方法。
又如,像光強(qiáng)值,加熱值,聲音值等模擬量也是可以用這樣的方法。
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!





