ファジ ィ制御用 プ ログ ラ ミング言語 の 開発とその応用
古 川 万 寿 夫 三 浦 健 史 松 田 孝 史 ( 平成 6 年 1 0月 26 日 受理)
The Programming Language for Fuzzy Control and It's Application
By Masuo Furukawa Takeshi Miura and Takashi Matsuda
Wed e s i gne dt h epr o gr a mml ngl a ng ua g ef o rf uz z yc o nt r o lu s l ngmi c r opr o c e s s o r .Thi s l a ng ua g ep em i t st ode s c r ib ei f ‑ t he nr ul ei n t ot hepr o gr a mf o r f uz z yc o n t r o l .Thi sl a ng ua g ei s e a s yt ound e r s t a ndf orf uz z yc o nt r o le ng l ne e r .Wede ve l o p edt heFu zz yt oCt r a ns l a t orwhi c h t r a ns l a t e st hi spr o gr a mml ngl a ng u a g ei n t o C l a n g u a ge .Thepr o gr a m g e ne r a t e db yt he t r a ns l a t o ri sc o mpi l e db yCc o mpi l e rt oa ppl yt ot a r g e tf orf uz z yc o nt r o l .
1. は じ め に
1 9 65 年にカ リフォルニア大学のザデー教授 ( LA.Zade h) によって, 「 ファジィ集合」が 提唱 された ( 1 ).ファジィ集合 は境界があいまいな集合であ り,人間の主観的判断や あい まいさを定量的に取 り扱 うために提案 された.
当時は,科学に主観性 を導入 したとして批判 されたが ,1 97 0 年代後半か ら人工知能やエ キスパー トシステムの研究が さかんにな り,現実問題に含 まれ る主観性や あいまい さにも 目が向けられ るようになってきた. 1 98 0 年にはデンマークのシュ ミッ ト社 によるセメン ト キル ンのファジィ制御が実用化 され ( 2 ),1 987 年 には仙台の地下鉄の 自動運転 にファジィ 制御が用い られ る( 3 ) な ど,ファジィ制御の有用性が示 された.
ファジィ制御は 「もし,制御対象 X が A の状態な らば,出力 Y を B にせ よ.」のよ うな, 直感的に理解ができるi f〜t he n ‑ルール を用いて行 う制御である.現在,ほ とん どのファ ジイ制御は,マイクロプ ロセ ッサを用いて行われている. ファジィ制御の長所のひ とつは, 制御則 を直感的に理解できることである.ところが,ファジィ制御を C 言語な どの汎用プ ログラミング言語で実現す る と,プログラムを一 目見ただけでは制御則 を直感的に理解で きないこと,汎用言語に関す る知識が必要となること,ファジィ推論のアル ゴ リズムをプ ログラムにすべて記述 しなければならないので開発 に時間がかか ることな どの不利な点が
*平成 6 年 6 月第 1 0 回ファジィシステムシンポジウムにて発表
* *電気工学科 講師
* * *京都大学工学部 在学中
* * * *九J ) 廿工業大学工学部 在学中
3 4 古川万寿夫 ・三浦健史 ・松田孝史
ある.
もし ,i f〜t he n ‑ルール形式でプログラミングできる言語があれば,ファジィ制御をお こな うためのプ ログラムを短時間で開発することができ,かつ直感的に理解 しやすいプロ グラムを作ることができる.
本研究では,マイクロプロセ ッサによるファジィ制御のプログラムを i f〜t he n‑ ・ ルール で記述できるファジイ制御用プログラミング言語を設計 した.このプログラミング言語で 記述 した ソースプログラムをC 言語に変換す る トランス レータを yacc を用いて試作 し た.そ して, トランス レータの出力 した C 言語 ソースプログラムを市販のCコンパイラで コンパイル し,オブジェク トプログラムを生成す ることができた.
2. マイクロプロセッサを用いたファジィ制御
現在,ほとん どのファジィ制御は,マイクロプロセ ッサを用いて行われている.ファ ジィ制御をマイク′ ロプロセ ッサを用いておこな う場合,C 言語などの汎用言語を用いてプ ログラミングをする.
一般にパ ソ=. ンでは,実行プログラムをハー ドディスクもしくはフロッピーディスクで 起動 し制御をお とな う.ワンボー ドマイコンの場合は,実行プログラムを ROM 化 して制 御 を夷現する.このようにパ ソコンとワンボー ドマイコンではプログラムの格納方法が異 なるが,パ ソコンや ワンボー ドマイコンを用いた制御はマイクロプロセ ッサを用いた制御 であるとい う点では同じである.
マイクロプロセ ッサを用いたファジィ制御のインターフェイスは ,A/D 変換器 と D/
A 変換器が用い られることが多い. A/D 変換器は,センサからのデータをディジタル値 に変換 してマイクロプロセ ッサ‑入力する.一方 ,D/A 変換器は,マイクロプロセ ッサ か らの出力をアナログ値に変換 して出力する.
マイクロプロセ ッサは ,A/D 変換器からのデータを入力 し,ファジィ推論をお こな う そ して,ファジィ推論により決められた制御量を D/A 変換器‑出力 し,アクチュエー タ を制御する.
このことか ら,ファジィ制御をおこな うプ ログラムは,ファジィ推論に必要な i f〜t he n
‑ルールやメンバーシップ関数の設定だけでなく ,A/D 変換器 と D/A 変換器の最大入 出力債,そ して Ⅰ / 0ポー トのア ドレスなどのインターフェイスのパラメータも設定できな ければならない.
本プログラミング言語は ,i f〜t he n ‑ルール とメンバーシップ関数のほかに,最大入出 力値および Ⅰ / 0ポー トのア ドレス甲設定ができる.
3. ファジィ制御用プログラミング言語
3‑1 仕 様
以下に,本プログラミング言語の仕様を示す.
・ 推論方式は PA F‑ MI N 合成法
・ 非ファジイ化は面積重心法
・ メンバーシップ関数は三角型が使 用できる
・ 入出力の変数は合わせて最大 5 個
表 1 予約語
入出力設定部
ルハ◆ ‑シ . J 7 ' i f 〜t he n. ‑ 関数設定部 ルール設定部
・i n p ut‑. me m be rs hi p ‑ ・r ul e o ut put l a bel i f
f s l e ft t he n
po rt ‑ce nt e r is
まで
/+入出力設定知 事 / ラベルの数は最大 7 個まで i n p ut(
t e J Z l p e
ratur e : f s = 40,p o rt = O x 7 0d 6;
予約語 とまった く同 じ名前の変教 ) や ラベルは使 えない
・ 変数や ラベルの長 さは最長 32 文 字まで
・ 表 1 に予約語 を示す J
' '/ * ' 'と ' '* / " で囲むことで注釈 行を記述できる
3‑2 妃述形式
プ ログラム 記述形式の説明のため,気温 を入力 とし, ダイ アル値 を出力 とす るエア コンのファジィ制御 を考えることにす る.
図 1 にこの ファジィ制御 を本プ ログラミ ング言語で記述 した 1 入力 1 出力 ファジィ 制御 の ソースプ ログラムを示す .. 本プ ログ ラミング言語 の ソースプ ログラムは,入出 力設定部,メンバー シ ップ関数設定部お よ
び if〜 then ‑ル」ル設定部の三つで構成す
る.以下に,各設定部 の記述形式について 述べる.
(1)入出力設定部
o ut p t ) tt l
di al: f S = 2 0,po rt =0 Ⅹ 7 0 d O;
)
/
*
メンバーシップ関数設定部* /
D e E n be rs hi p ( i n p ut【
t e 【 n pe r at u re(
l a bel = P B : l ef t =3 4 , ce nt e r = 40 , ri g ht = 4 0 1 a be l = P M : 1 ef t =2 7 , ce nt e r ‑ ‑ 3 4, ri g ht = 4 0 1 a b el = P S: l ef t =2 0 , c e nt e r =27 , ri g ht =3 4 l a bel = Z R: l e f t = 13 , c e nt e r =20 . ri g ht =2 7 1 a bel = NS: l e f t =6 , c e nt e r=1 3 , ri g ht =2 0 l a bel = N M : 1 e f t =0 , c e nt e r =6 , ri g ht =1 3 l a bel = NB: l e f t =0 , c e nt e r =0, ri g ht =6
]o ut p ut【
di al(
l a bel = P B : l e f t =1 6 . c c nt e r =20 , ri g ht = 2 0 1 a bel = P M : l e ft =1 3 . c e nt e r =1 6 , ri g ht = 2 0 l a b el = PS: l ef t =1 0 , c e nt e r =1 3 , ri g ht =1 6 l a b el = ZR: l ef t =7 . ce nt e r =1 0 , ri g ht =1 3 l a bel = NS: l ef t =4 , ce nt e r=7 , ri g ht =1 0 l a bel = N M : l e f t =0 , c e nt e r =4. ri g ht =7 1 a bel = NB: 1 e f t =O , c e nt e r =0, ri g ht =4
)
]/*i ∫ ‑t he n
ルール設定部*/入 出力 設 定 部 で は,入 出力変 数 の定義 ,r ul e. ! 入出力倍 の最大値 の設定お よび入出力 ポー
トのア ドレスの設定 をお こな う.図 1 の入 出力設定部 は,入力 変数 名 が temperature , 出力変数名が dial になっている.
こ こ で 用 い て い る 予 約 語 は ・ ' ' )
input 叩, 対 output 竹, 〟 fs 竹 , 〟 port ' 'の 四つである." input" は入力の設定部であ
iftezz)peratl︼reisPBthendialis
NB;ifteznperatureisPMthendialis
NN;if , temperatureisPSthendialisNS・; iftemperatureisZRthendialisZR; iftemperatureisNSthendialisPS; iftemperatureisNNthendialisPM,I iftemperatureisNBthendialisPB; 図 1 ェアコンのファジィ制御プ占グラム
ることを , ''output ''は出力の設定部であることを宣言する . '' fs" は , "fullscale" の略で,入出力値の最大値を設定する. ''port" は ,入出力ポートのアドレスを指定する. (2)メンバーシップ関数設定部 メンバーシップ関数設定部では,ラベルの定義と各ラベルに対するメンバーシップ関数 の形状を記述する . 図 1 のメンバーシップ関数設定部は,入出力設定部で定義した temperature,dial の変数に対してそれぞれ 7 つのメンバーシップ関数を割り付けた場合 である . ここでは , ''membership" , ''1abel" , " lef t"," center" , " right" という五つ の予約語が使われている . " membership" は , メンバーシップ関数の設定部を明示するた めの宣言である . " label" はラベルの定義をし , " left '' ,‑ ' 'cente r"そし で'right" は ,三角型メンバーシップ関数の形状を設定する. (3) if〜then‑ ルール設定部 if〜then ・・・ルール設定部では,ファ ジィ制御の制御別を if〜then・ ‑形式で記述する.
3 6 古川万寿夫 ・三浦健史 ・松田孝史
こ こで使 わ れ る予 約 語 は , " rule " , "
if" , ' ' then' '," is ' '," and" の五つで あ る." rule" は if〜 then・ ‑ルール設定部である ことを明示す るための宣言である. ' ' if ' 'は制 御則 の始ま りを," then" は前件部 と後件部の 区切 りをあらわす." and ' 'は前件部や後件部に 複数の and 条件 を列挙するときに用いる.
図 2 F u z z yt oC トランスレータ 4ニ トランス レ‑ タ F u z z yt oC
本研究では,本プ ログラミング言語 をC 言語 に変換す る トランス レー タ Fuzzy to C を試作 し た.この トランス レー タの出力す るC 言語プ ロ グラムを市販 のCコンパイラでオブジェク トプ ログラムに翻訳 し,実機制御 に用いた. ここで は,試作 した Fuzzy to C トランス レー タについ て述べる.
トランス レー タの構成 を図 2 に示す . Fuzzy t o cトランス レー タは,字句解析部,構文解析 部,デー タ抽 出部そ してプ ログラムジェネ レー タの四つからできている.
(1)字句解析部
字句解析部 は, ソースプ ログラムか ら予 約語や変数,数字な どを分離 し トー クンに 変換する.
(2) 構文解析部
#i ncl u d o く st di o.h〉
# d o f i n o ̲d z ̲
# d o f i n o ̲t ma x ̲
#do fi mo ̲t r A i r L
#d of i nB ̲C n l a X ̲
#do f i ne ̲c hi n ̲
#d of i r L O ̲nO E B f ̲ t y po d ofst r uc tI
0. 0 . 0 0. 0 . 0
i mt mi n.
co nt e r , ba Z' , ) bO l n bo r;
d o u bl eNy al uo( me Abo r事 d at a,d o u bl eA ) I d o u bl
oa
.b , C . co mt o r:
i mt A8X , hi m;
i f( xくd at 8‑〉 mi n H d at a‑〉 maxくx ) r et u r n ( 0 . 0);
ce E t t e r=d at a ‑ 〉 ce r L te r;
haX = d at a ‑〉 ma x:
ni n= d at 8 ‑〉 mi r t ; i f( A) = ce nt e r )
r et u m ( ( m ax ‑ ∫) /(
ha 又‑C C nt e r) ):
ol s o
ret u r r L( ( I ‑ mi r L ) /( c e E l t e r ‑ hi r L ) );
I
y oi d附i h( v oi d ) I
he mb e rme mlLno hf 」 ≡ ( 1 3 4, 4 0 , 41 ) .
L 27 , 3 4 , 4 0) .
( 20 , 27 , 3 4 ) .
† 1 3. 2 0 , 27 ) ,
16 . 1 3 , 20) . 10.6,1 3 )
,卜
1.0.61日he nbe rA l e m2L
no n f ̲ ]= (
1 1 6, 20. 21 1
,1 1 3 ,1 6. 2 0 ) , 1 1 0 , 1 3 .1 6 1 .
17 , 1 0 ,1 3 I . 14 , 7 .1 0 I .
10
,
4, 7) . ト 1 , 0 .4 日;
d o u bl o g r ad oLno E b f 」 ; d o ubl e t e n. ma x. ni n, a re a, d ̲aro a ,
J E l O he r L t .C e nt e r , YO r kl , yo r k 2. 7o r k 3;
i nt i;
f o r( t e h= lt J D i n ̲; t e mく = ‑t max ̲: t e l n + + ) f f o r( i = 0; i く ̲no mL ; i + +)
g r ad el i ]=A l y al ue(
&血e hl【 i ] .t e n);
a re a= 0. 0;
mo me nt = 0 . 0;
fo r( yo r k1 ‑ ‑ ̲c hi n ̲‑ , yo r kl く 三 一c ha X ̲' , YO r kl + I ̲d x ̲)I n ax=0;
f o r( i = 0; i く ̲mo mL ; i + +H
yo r k 2= h I y al ue(
&me m 2【 i 】 , yo r kl ):
i f( yo r k 2く g rad e【 i ]) Yo r k3 = Yo r k 2:
01 5e
yo r k3 =g r ad e【 i 】;
i ∫( Yo r k3 〉 maX) ma ェ = To r k3;
) d ̲ar e a 三 Da X;
a r e a + =d ̲ ar e a;
hO I T t e nt += da ro a* YO r kl;
I i f( ar e a! = 0)
c e r L t e r =nO he mt /ar e a;
p ri nt
f(
'%d : % l f ¥ r L ' ,( i nt ) t e n, C e nte r );
構文解析部 は, ソースプ ログラムを解析 ) )
図 3 ェアコンファジィ制御のCプログラム
して文法に合致 しているか調べる.
(3) データ抽出部
デー タ抽 出部は,プ ログラムジェネ レータが C プログラムを生成す るのに必要な データを,構造体や配列に階層的に順序よく格納する.
(4) プログラムジェネ レータ
プログラムジェネ レータは,制御用のC プログラムを作 り出す部分である.
5. 汎用言語 との比較
ファジィ制御をお こな うプログラムを汎用言語であるC 言語で記述 した場合 と,本プ ロ グラミング言語で記述 した場合について比較評価す る.
図 1 と同等のファジィ制御をする C プ ログラムを記述すると,図 3 のように 7 3 ステ ップ となった.C 言語で記述 したプログラムの特徴は,一 目見ただけでは制御則が理解できな いこと,変数が多 くなるとプ ログラムが さらに複雑 になることである.本プログラミング 言語の場合は図 1 か ら 37 ステ ップであることがわかる ( コメン ト行を除く).本プ ログラ ミング言語では制御則が多くなるとそれだけステ ップ数が増大す るが ,i f〜t he n ‑形式の 記述なのでC 言語の場合に比べ理解 しやすいと言 える.
このことか ら本プログラミング言語を用いた方が,分か りやすいプログラムを短時間で 開発することができるといえる.
6 . 倒立振子制御への応用
本プログラミング言語の応用 として倒 立振子 制御 をお こなった. ここでは,倒立振子の実験 装置お よび制御用の ソースプログラムそ してそ の結果について述べる.,
6‑1 実験装置
実験のため製作 した倒立振子系を,図 4 に示 す.簡単化のため角度 1 入力,モータ電圧 1 出 力のファジィ制御 とした.
6‑2 ソースプログラム
制御 に用いた ソースプ ログラムを図 5 に示す.
メンバーシップ関数 は,前件部 ・後件部 ともに 等間隔に割 り当てられた三角型 とした.
図 4 倒 立振子制御系
i n p utI
e l t t gl e : fs = 25 6,po rt = O z7 0d 6 ; I
o u t p uti
mot o r : f s = 25 6,po rt = Oz 7 0d O ; I
he hb
or
ship ii n put【
a ngl e(
l a bel : P B: l oft = 21 3 , c e r L t e r = 25 5. ri g ht = 25 5;
l a bel = P N : l eft = 1 71 ,c e E t t e r = 21 3, ri g ht = 25 5;
1 8 bel 三 P S: l eft : 1 2 8, c e
rt t e r =1 71 . ri g ht 三 21 3;
l a bol = ZR: lef t = 85
.c
erLt B r =1 28, ri g ht =1 71;
1 8 bol = NS: l e ft :43 . c o E t t e r =85 , ri g ht =1 28;
l a bel = N N : left= 0, c e nt o r =43 , ri g ht =85;
l a bel = N B : left= 0, ce nt e r = 0, ri g ht =4 3; )
】
o ut p ut 【
mot o r (
l a bel = P B : l e f t = 21
3.c e nt e r = 25 5 . ri g ht 三 25 5;
1 8 bel = P M: l e ft =
17l . c e nt e r = 21 3, ri g ht = 25 5;
l a bel = PS: l e ft : 1 2 8, c e r L t e r =1 71 . ri g ht = 21 3;
1 8 b e l = Z R : l e f t : 8 5 , c e r L t e r = 1 2 8 , r i g h t = 1 7 1 ;
l a b e l = N S : l e f t : 4 3 . c e E t t e r = 8 5 , r i g h t = 1 2 8 ;
l 8 bel = NM : l ef t : 0
,c e F L t e r =43 , ri g ht =85;
l a b el = N 8 : l eft = 0, ce mt e r = 0, ri g ht =43; )
】 ) r ul oI
i f an gl oi sP Bt he nmot o ri sP B ; i f an gl ei sP Nt he nmot o ri sP M ; i f ar L gl ei sP St he t lnOt O ri sPS;
l f an gl oi sZ Rt he r tmot o ri sZ R;
l f 8n gl oi sNSt ho r Lmo t o ri sNS ; i f ang l ol sNh It he r Lmo t o rl s州 ; i f ang l ol sN8t he nRo t o rl sN B ; I
図 5 倒立振子のファジィ制御 プログラム
3 8 古川万寿夫 ・三浦健史 ・松田孝史
6‑3 結 果
F u z z yt oC トランス レー タが出力 した倒 立振子 ファジィ制御 の C プ ログラムを図 6 に 示す.この C プ ログラムを T u r b oCV e r2 . 0 でコンパイル した結果,・ オブジェク トプログ ラ ムの大 き さは 2 7 4 8 バ イ トとな った .推 論速 度 は ,P C 9 8 01 R A2 0 M Hz ( C P U を Cy ri x 製 c x 4 8 6 D L C , F P U を C y ri x 製 8 3 D 8 7 に改造)を使用 した場合 l l m s であった.
このオブジェク トプ ログラムで実機 の制御 を行 った.振子を手で持 ちなが ら直立 させた 状態か ら左 または右 に傾 ける と,台車 は振子を直立 させ るよ うに台車は動いた. しか し, 手 を放す と振子の倒立状態を保つ ことができなかった.その原因は,入力変数が角度 しか 用いていないこと,メンバーシップ関数の調整ができていなかったことであると考える.
7. L 結 論
本研究では,マイ クロプ ロセ ッサに よるファジィ制御のプログラムを i f 〜t h e n ‑ルール 形式で記述できるファジイ制御用プログラミング言語を設計 した. このプ ログラミング言 語で記述 した ソースプ ログラムを C 言語に変換す る トランス レー タ F u z z yt oC を yacc
を用いて試作 した.そ して, トランス レータの出力 した C 言語 ソースプログラムを市販 の C コンパイラでコンパイル し,オブジェク トプログラムを生成す ることができた.
応用 として,倒立振子制御 のプ ログラムをプ ログラミング言語で記述 し制御 を試みた.
その結果,直感的にわか りやすいプログラムが記述できることがわかった.
参 考 文 献
( 1 ) L . A . Z a d e h: F u z z yS e t s , I N F O R M A T I O NA N D C O N T R O L , V o l . 8 , p p . 3 3 8 ‑ 3 5 3( 1 9 6 5 )
( 2 ) E . H . Ma n l d a ni: A p pl i c at i o nso fF uz z yAl g o ri t h m sf o rC o n t r olo f Si m pl eD y n a mi c Pl a nt ,P r o c .土 E E ,γ ol .1 21 , N o .1 2 , p p. 1 5 8 5 ‑1 5 8 8( 1 9 7 4 )
( 3 ) 安信誠二 :フ ァジ ィ推論 を利 用 した列車 自動運転,情報処理 ,γ ol . 3 0 ,N o . 8 , p p . 9 7 0 ‑ 9 7 5( 1 9 8 9 )
#i E t Cl ud oく st d i o . h〉
#i ACl ud oく do s . h〉
#d efi ne l e f t 0
#d e fi no ce nt e r I
‡d efi ne ri g ht 2
#d e fi no n u J n be r 3
voi d y al ue( i n暮xl ,i mt J : 2.d o u bl e+ a. do ubl e*b) I
+a=
l . 0/( ェ 2‑ xl );
*b=‑(+a)
書 ス1;
)
do ubl ei n ‑
yal( i t l ta rg u he nt .i nti r Ld at aH【 4】 ,i m td at a) I
i n t x;
d o u bl o a. b;
i f( d at aくi n ̲d at al a rgun e n t ]l l e f t ]II i n ̲d at al a rg u J n e nt 】【 ri g ht ] く d at a ) rot u r n( 0 . 0):
よ=( d at aくi n ̲d at a【 a rg u me n t ]【 ce mt e r] ) ?i n ̲d at al a rg u 血e nt
】【 l ef t ]: i n ̲d at al arg u me nt ]【 ri g ht ];
V al uo( ェ,i n ̲d at a【 a rg u me n t ]
lce mt e r] ,
&a, &b):
r e t um ( d at a * a+ b):
I
yoi do ut ̲v at( i ntarg u me r L t ,i r L tO ut ̲d at a【 】【 4] , do u bl eg r ad e ,i ntf s ,d o u bl eo ut[ 】【 2 5 6] ) I
i m t i , s mall ,l ar g e:
d o u bl e xl . x 2, al , 82 , bI , b 2' ,
Y 8l ue( o uLd at al a rg u he r L t ]【 l eft 】 . o ut ̲d at al dr g
un e nt 】【 ce nt e r ]
.Aal , &bl );
zl =( g r a d ㊤ ‑ bl ) /al;
Y al uo( o ut ̲d at a[ ar g un e mt 】【 ri g ht ] ,o uLd at 8【 a r g u me nt 】【 ce nt e r]
,&a 2 , Ab2);
x 2 =( g r ad e ‑b 2) / 82;
s m al l =( 0く o ut ̲d 8t al a rg u nや r L t 】【 l ef t] ) ?o ut ̲d at a
【a
rgun e r L t ]【 l of t 】: 0;
1 8 rg O =( o ut ̲d at a【 a rg u me nt 】【 ri g ht ] くf s) ?o ut ̲d a t a【 ar g U J n e nt]【 ri g ht ]: f s;
f o r( i =s T n al
l:i くI ar g oH++ H i f( ( d o u bl
o)i く xl H
i f( o ut【 o ut ̲d at a【 ar
gⅧO nt 】
【nu 九be r 】 】【 i 】 く al +i + bl H
o ut〔 out ̲d at al ar g un e r L t 】
【r L u mbo r]]l i ] =( al ●i + bl くg r ad e) ? al +i + bl: gr ad e;
) )
ol soi f( ( do u bl o )l 〉 = x 2H
i f( o ut〔 o ut ̲d a t a【 ar g u me nt ]【 r t u mbe r ] ]l i 】 く 8 2 ◆i + b 2 日
o ut〔 out ̲d at al arg u J n e mt ]
lh u mbe r】】【 i 】 =( 8 2 *i + b 2くg r ad e) ? a 2+i + b 2: g r ad e;
) )
el sei f( o ut〔 o ut ̲d at al a r g u me r t t]
〔rL un be r] ]l i ] く g r ad e) o u t〔 o ut ̲d at a
l8 rg ume n t 】【 n t mbe r ] ]l i ] =g r a do' , I
I
unsi g r t e dc h arg c ha r( yoi d) I
A H= 6;
D L = Oxf f;
ge z t i nt e r r u pt( O x 2 1 );
ro t ur m̲AL;
)
voi dmai n( y ci d ) I
st ati ci nti r L jun c日【 4】 =1
21 3 , 25 5. 25 6 , 0 . 1 71 , 21 3. 255 . 0 , 1 28,1 71 , 21 3 , 0 ,
】85 ,1 2 8.1 71 . 0 . 4 3, 85 .1 28 , 0 , 0, 43 . 85 . 0 ,
‑I . 0, 43 . 0 ,
)
; st ati ci nto ut ̲f u ncl ][ 4] :i
21 3. 255 , 25 6 , 0 , 1 71 , 21 3, 25 5 , 0 , 1 28,1 71 . 21 3 . 0 . 85 .1 2 8,1 71 . 0 , 43 , 85 ,1 2 8. 0, 0 .43 . 85 , 0 ,
‑1 , 0. 4 3 , 0 , ) ; st a ti cl o ngi r L ti n ̲po rt【 ]【 2]=t
st ati cl o E t gi nto ut ̲po rtl ][ 2] =〈
st at i ci nti n ̲r ul e ‑d at al ] ‑ I(
st ati ci r t to ut ̲r ul e ̲d at al ] =t
25 6, 28 88 6
, I;25 6, 2 888 0 , );
0 1 2 3 4 5 6 1J O 1 2 3 4 5 6
4 0
s t ati ci r L ti n ̲r ul e ̲co u ntl ] =1
古川万寿夫 ・三浦健史 ・松田孝史
st ati ci mtouLr ul e ̲c o u r L tH=t
l1‑l11I
II
111‑1111 ヽ‑.
d o u bl eg r a de , I. Y , X Y:
d o u bl oo u t【 1 ]【 25 6】;
i nti .j .i n p ut ̲d a t a,o ut p ut ̲ar g uE D e r L t ,i r t put【 1 】;
i r L ti n ̲s
tu n . o ut ̲s
um; i E t tO ut p ut;
o ut po rt b( o ut ̲po r tl 0]l l ] .1 28);
o ut po rt b( i r u) o rtl 0]l l ] . 0);
p ri nt f( ' p us h' q'ke yi fy o uya ntt oq u
it YE t ' );
W hi l e( gc h a r( ) ! = ' q' &&g c h a r( )
!= '
Q' H
yhi l o( ( i n po rt b( 0又 7 0d O) 1 0 x O8日= 0);
i np u t【 0】 =i m p o rt b( i n 」〉 o r t【 0]【 1 1 ):
i f( i t LPO rtl 0][ 0] (i r L P utl 0] H
pri ntf( 'i n p utda t ai 8O utOfr ar L gO! ■ );
o ut po r t b( o u Lpo rt【 01【 1 1 ,1 28);
○ Xl t( 1 );
)
o ut p o rt b( i n ̲po rt【 0 1【 1 】 . 0);
i r
LS u m=o ut ̲S u m= 0;
f o r( i = 0; i く1; i ++)
r o r( j ニ 0; jく o u t 」⊃ o rt【 i 】【 0】; j + +) o utl i ]l j ] = 0;
r
o r( i = 0: i
く7
;i++)Ig r ad e =1 . 0;
f o r( j = 0; jく i n ̲r u l e ̲co u nt【 i ]; j + +)l
i np ut ̲d at a=i r L P ut【 i r L ju nc【 i n Jul o ̲d at a【 i n ̲s u n】 】
hu
hb
er】】;x =i r L ̲Y al( i r L ̲r ul o ̲d at al i E
LSuA++
],i n ̲f unc ,i E t p ut ̲dat a );
i f( xく g r ad e )g rad e = J : ; )
f o r( i : 0; j( o u t ̲r ul e ̲c o untl i ]; i + +)I
o ut put ̲a rg
uJt e r L t =o ut ̲f u ncl o ut ̲r ul o ̲d at a〔 o ut ̲
Sut ]]
hu Abo r ]:
o ut ̲v al( o ut ̲r ul o ̲d at al o ut ̲s
uJn++
]. o u t Ju nc , g r a d e
,o ut ̲po rtl o ut p ut ̲a
rg
ume nt 】【 0】 , o ut )
;)
)
!