11.比較してみましょう(5/24)




プログラムは、計算だけでは一本じょうしの決まった処理しかできません。ただ、一本じょうしの処理ですむプログラムも無い事はありませんが、普通は外部の要因によって処理の流れを変える(分岐する)必要に迫られる事になるでしょう。
ここで言う外部要因とは、プログラムした時にはどうなるか分からない情報であり、実際にプログラムを動かした時に分かる情報の事を言います。例えばゲームでは「ボタンを押した/押さない」「勝った/負けた」「時間になった/ならない」、表計算ソフトなら「合計ボタンを押された/押されない」「値段の合計が1万円を超えた/超えない」等など数限りないだけの比較を行う事になります。

この比較を簡単に説明すると「2つの数字(又は文字)を比較し、比較の結果がプログラムが考えた通りなのか、そうでないかで指定の位置にプログラムの流れを移す」動作をする機能です。
比較するものは数字や文字列ですが、ここでは数字の比較をしてみます。
とにかく実際のプログラムを見てみましょう。下のプログラムをLGPで実行してみてください。(ESCキーを押すと終了します)
CH=G@SETUP(640,480,8,1)
G@FONT(0,0,0,3,"MSゴシック")
A=10                //←ここの数字を変える
IF A > 5 THEN
  G@PRINT(CH,0,0,"5より大きい")
ELSE
  G@PRINT(CH,0,0,"5以下")
ENDIF
LOOP
G@FLIP()
ENDLOOP

3〜8行目が今回のメインとなる部分です。このプログラムを実行すると”5より大きい”という文字が表示されたはずです。
このプログラムの説明ですが、4行目で変数Aのと数値”5”を比較をしています。
記述の仕方は、比較演算子を間に挟んで左右に比較をしたい数値又は変数を記述します。
比較演算子には次のものがあります。

 
演算子 内容
==
左辺と右辺が等しい
<>
左辺と右辺が等しくない
右辺より左辺の方が大きい
左辺より右辺の方が大きい
>=
右辺より左辺の方が大きいかまたは等しい
<=
左辺より右辺の方が大きいかまたは等しい

比較式が成り立った場合、THEN〜ELSE間のプログラムを実行し、成り立たなかった場合は、ELSE〜ENDIF間のプログラムを実行します。
例では「A>5」という比較をしており、3行目で変数Aに10を入れているので、比較式が成り立ちTHEN〜ELSE間のプログラムである「G@PRINT(CH,0,0,"5より大きい")」を実行します。
試しに3行目の変数Aに代入する値を色々変えて動作を試してみてください。

ここで出てきたIF文(発音=イフ、日本語=もし)」は比較命令と言われるものであり、「IF〜THEN〜ELSE〜ENDIF」という4命令を対で利用します。IF文とTHEN文(発音=ゼン、日本語=ならば)の間に記述した比較式が成り立てばTHEN文の次に処理を移し、比較式が成り立たなければELSE文(発音=エルス、日本語=でなければ)の次に処理を移します。THEN〜ELSE間のプログラム、又はELSE〜ENDIF間のプログラムを実行し終わったらENDIF文の次に処理を移します。
IF文の基本はこれだけですが、次に示すような使い方もできるので覚えておいてください。
@比較式の高度化
IF文とTHEN文の間に記述す比較式は単純な数値及び変数を記述するだけではなく、計算式を記述する事が出来ます。つまり、計算した結果を比較するという事が出来るのです。例えば「(5+A)/2と5/2を比較」する場合次のようになります。
A=10                //←ここの数字を変える
IF (5+A)/2 > 5/2 THEN
  G@PRINT(CH,0,0,"5より大きい")
ELSE
  G@PRINT(CH,0,0,"5以下")
ENDIF

AELSE文の省略
「IF〜THEN〜ELSE〜ENDIF」の命令は対で利用すると書きましたが、比較式が成り立たなかった場合の処理が要らない場合が良くあります。その場合には、ELSE文を省略する事が出来、比較式が成り立たなかった時はENDIF文の次に処理が移ります。
A=10                //←ここの数字を変える
IF A > 5 THEN
  G@PRINT(CH,0,0,"5より大きい")
ENDIF

B分岐後のプログラムは沢山記述できる
ようは、THEN〜ELSE間及びELSE〜ENDIF間には複数のプログラムを記述できます。
A=10                //←ここの数字を変える
IF A > 5 THEN
  B=A
  G@PRINT(CH,0,0,"5より大きい")
ELSE
  C=A
  G@PRINT(CH,0,0,"5以下")
ENDIF

上の例の場合、「A>5」が成り立てば変数Bに変数Aの内容をコピーし、”5より大きい”という文字を表示します。
間に記述するプログラムの量には制限はないので色々な事が出来るはずです。
CIF文の多重化
THEN〜ELSE間及びELSE〜ENDIF間に他の比較命令を記述する事が出来ます。
例えば「Aが5より大きい時、Bが0ならば「O.K.」と同時に表示する」なら
A=10                //←ここの数字を変える
B=0
IF A > 5 THEN
  IF B == 0 THEN
    G@PRINT(CH,0,32,"O.K.")
  ENDIF
  G@PRINT(CH,0,0,"5より大きい")
ELSE
  G@PRINT(CH,0,0,"5以下")
ENDIF

となります。このようにIF文の中のIF文の事を「階層下のIF文」と呼んだりします。2番目のIF文が処理されるかどうかは、最初のIF文の結果しだいであり、2番目のIF文から見れば最初のIF文は自分よりも位の高い命令となります。このように高低という側面から「階層」という概念が出てきています。
D文字列の比較
これまでの例では数値の比較について説明してきましたが、文字列の比較を行う事も出来ます。文字列の比較とはどのようなものでしょう。
前章でコンピュータは文字も数字として扱うと説明した事を思い出してください。WindowsではASCIIコードという番号形態を採用しています。次にそのごく一部を示します。
! :32
" :33
# :34
$ :35
% :36
& :37
' :38
( :39
) :40
* :41
+ :42
, :43
, :44
- :45
. :46
/ :47
0 :48
1 :49
2 :50
3 :51
4 :52
5 :53
6 :54
7 :55
8 :56
9 :57
: :58
; :59
< :60
= :61
> :62
? :63
@ :64
A :65
B :66
C :67
D :68
E :69
F :70
G :71
H :72
I :73
J :74
K :75
L :76
M :77
N :78
O :79
P :80
Q :81
R :82
S :83
T :84
U :85
V :86
W :87
X :88
Y :89
Z :90
[ :91
\ :92
] :93
^ :94
_ :95
a :97
b :98
c :99
d :100
e :101
f :102
g :103
h :104
i :105
j :106
k :107
l :108
m :109
n :110
o :111
p :112
q :113
r :114
s :115
t :116
u :117
v :118
w :119
x :120
y :121
z :122
{ :124
} :126
~ :127









例えば「A」と「B」を比較すればBの方が大きい事になります。文字列はダブルクォテーション記号「”」で囲んで指定するので「A」と「B」の比較では次のようになります。
CH=G@SETUP(640,480,8,1)
G@FONT(0,0,0,3,"MSゴシック")
IF "A" > "B" THEN
  G@PRINT(CH,0,0,"左辺の方が大きい")
ELSE
  G@PRINT(CH,0,0,"右辺の方が大きいか同じ")
ENDIF
LOOP
G@FLIP()
ENDLOOP

では、1文字同士の比較ではなく複数文字数の文字列の比較はどのような大小関係になるでしょうか。この場合、先頭(左端)の文字から順番に1文字ずつ比較を行い大きい文字が先に現れた方を大きいと判断されます。
例えば「ABCDE」と「ABCEF」では

→→(比較する順番)→→
「ABCDE」


同じ

同じ

同じ

下が大きい
既に大小が決定しているので比較しない
「ABCEF」

となり、4文字目の「D」と「E」の比較で「ABCEF」の方が大きいと判断します。
また、「ABC」と「ABCDE」というように途中まで同じ文字列だが、片方が長い文字列の場合では
→→(比較する順番)→→
「ABC」


同じ

同じ

同じ

下が大きい
既に大小が決定しているので比較しない
「ABCEF」

というように、長い方が大きいと判断します。