本文へスキップ

アトメル社のAVRマイコンをつかった電子工作および無線を使った電子工作を紹介します。





ホーム >ソフト室 >AVRマイコンで始めるC言語の使い方 > 例題 プログラム制御

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();
}
前ページ次ページ