AVRマイコンで始めるC言語の使い方
例題 プログラム制御
目的
n個の整数型データの中に整数Xの有無を確認するプログラムを作ります。
nは、10とし昇順にデータが配列に入れられているものとします。
配列:data[10] = { 1, 3, 6, 10, 15, 17, 19, 20, 25, 30}
整数:x=6
方針
昇順にデータが配列されていますので、配列の真ん中にあるデータdata[a]と整数xを比較します。xが大きければxは、data[a+1]からdata[10]の間にあります。これを繰り返して整数xが配列dataに含まれているか確認します。今回は、2
分探索法を使います。
含まれている場合は、OKをLCDに表示します。
含まれていない場合は、NGをLCDに表示します。
フローチャート
1.初期値を設定します。
整数値x=6
配列の最大要素数:h=10-1=9
配列の最小要素数:l=0
2.配列の真ん中のデータがxより大きいか比較します。
小さい場合は、配列の下半分内にxがあるので、h=m-1を入れます。
大きい場合は、配列の上半分内にxがあるので、l=m+1を入れます。
3.上記を繰り返し一致した場合は、OKを表示します。
一致しない場合は、NGを表示します。
プログラム
/*
* cstudy16.c
* プログラムの制御
* Created: 2014/08/05
*/
#include <avr/io.h>
#include "hd44780.h"
void InitHard(void);
int main(void)
{
int m, x = 6, l = 0, h = 9;
int data[] ={ 1, 3, 6, 10, 15, 17, 19, 20, 25, 30};
char flg = 0;
InitHard();
lcd_locate(0, 0);
while( l <= h)
{
m = ( l + h)/ 2; // データ配列の中心の要素
if ( x < data[m]) // データ配列の下側にxがある
{
h = m - 1;
}
else if ( x > data[m]) //データ配列の上側にxがある
{
l = m + 1;
}
else // xが見つかった
{
flg = 1;
break;
}
}
switch ( flg) // LCDにデータを表示
{
case 0: // データ無し
lcd_putc( 'N');
lcd_putc( 'G');
break;
case 1: // データ有り
lcd_putc( 'O');
lcd_putc( 'K');
break;
default:
break;
}
while(1)
{
//TODO:: Please write your application code
}
}
void InitHard(void)
{
// port初期化
DDRB = (1 << DDB7) | (1 << DDB6) | (1 << DDB5) | (1 << DDB4) | (1 << DDB3) | (1 << DDB2) | (1 << DDB1) | (1 << DDB0);
// PORTBは出力に設定
PORTB = 0;
DDRD = (1 << DDD7) | (1 << DDD6) | ( 1 << DDD5) | ( 1 << DDD4); // PORTD7~PORT:出力、PORTD3~PORTD0:入力
PORTD = 0;
// LCD初期化
lcd_init();
}