OriosのActiveBasic講座(1-2):条件・分岐・繰り返し

2.Whileループ

【目標】】「While」を使って指定した間、作業を繰り返すことができるようになりましょう。

前回は「Ifブロック」を使った「条件分岐」をやりましたが、今回は「繰り返し」をします。 例えば今まで「*」を何個も表示したければ「Print "*": Print "*": ……(以下略)」というように、同じものを何回も書かないといけませんでしたが、今回から学ぶ「繰り返し」を使えば1回書くだけでこのような繰り返しを何回でも行うことができます。 これは「Ifブロック」と同様にプログラムには欠かせないものの一つです。

「繰り返し」にはいろいろな書き方がありますが、今回はその中から最も基本的な「Whileループ」を取り上げます。 早速下のプログラムを実行してみましょう。

'lesson1-2-2
#console
Dim a As Integer
Dim i As Integer
Dim str As String
Input "数字を入力してください。(最大10まで)"; a
While i < 10 and i < a
    str = str + "*"
    Print str
    i = i + 1
WEnd
Sleep(3000)
End

上のプログラムを実行すると下のようになります。 今回も前回同様JavaScriptを使用してページ上で実際に体験できるようにしてみました(InternetExplorer 6.0, Opera7.53, Netscape7.1で確認済み)。 実際のプログラムとは、エンターキーの代わりに右の「Enter」ボタンを押すというところが変わっていますが、実際に数値を入れて試してください (カーソルが表示されていないときは「?」の横をクリックしてください)。

C:\ActiveBasicCourse\lesson1-2-2.abp
数字を入力してください。(最大10まで)?

今回は入力された数字の分だけ「*」「**」……を表示するものですが、10以上を入力すると、たとえ100でも1000でも10しか表示されないところがポイントです。 実際に入力して確かめてください。

それでは今回の説明を始めましょう。 本当に「繰り返し」は便利なので、しっかり読んで自分のものにしてください。

-*-*-*-*-説明-*-*-*-*-
【使い方】
(1) While 条件式  プログラム  WEnd
【備考】
(1)(a) 条件式プログラム の前との間と、プログラム の最後とWEndの間には改行を入れます。
  (b) プログラムの部分は何行かいても構いません。   (c) WEndの部分は、よく「Wend」と書かれることもあります。
【意味】
(1) 条件式 が「真」の間、繰り返しプログラム を実行します。
【解説】
(1) Whileループ
(i) 概説
「Whileループ」というのは「繰り返し」の基本となるものです。 「Whileループ」を用いたプログラムは以下のように実行されます。
「Whileループ」の流れ図
上の図の通り、まず条件式 が「真」か「偽」かが調べられます。 ここで「偽」だった場合は、プログラム の部分は無視され、そのままWEndの次のところまでプログラムの実行が飛んでしまいます。 一方「真」だった場合は、WhileからWEndの間に書かれているプログラム が実行され、WEndのところまで来るともう一回条件式のところに戻ります。 そしてまた改めて条件式 が「真」か「偽」かが調べられ、「偽」ならWEndの次のところまでプログラムの実行が飛び、真ならプログラム が実行され、そしてまた条件式 のところに戻り……というように、条件式 が真であれば、プログラム が実行され続けます。
(ii) 「Whileループ」の例
i = 0
While i < 10
    Print "*";
    i = i + 1
WEnd
上のプログラムでは、まず「i < 10」が「真」か「偽」かをチェックされます。 初めは「i」は「0」、10より小さいので「真」となり「*」が表示されます。 そして「i = i + 1」のところで「i」の値が1増えます。 そして改めて「i < 10」がチェックされます。 このとき「i」は「1」、10より小さいので、また「*」が表示され、そして「i」の値が1増えます。 これが「i」が「2」のとき「3」のとき「4」のとき……とどんどん繰り返されていき、最後「i」が「10」、10より小さくなくなったときに、「i < 10」が「偽」となり繰り返しが終了します。 よって、このプログラムでは「i」が「0」のとき「1」のとき「2」のとき……「9」のときの計10回「*」が表示されます。
ちなみに条件式 が「偽」になって繰り返しを終了することを「ループを抜ける」と言います。
(iii) 無限ループ
「Whileループ」を始めとして、「ループ」を使うときは「無限ループ」を作らないようにしてください。 例えば、次のような「ループ」が「無限ループ」です。
i = 0
While i >= 0
    Print "*";
    i = i + 1
WEnd
上のループを考えると、最初の段階で「i」が既に「0」で、その後もどんどん「i」の値が増えるのにもかかわらず、条件式 が「i >= 0」になっています。 つまり、いつまで経っても条件式 が「偽」になることがない、永遠にプログラム が繰り返されるということです。 このように、いつまでもずっと繰り返されるループのことを「無限ループ」と言います。
「無限ループ」を実行してしまうと、いつまでもプログラムが実行されるわけですから、コンピュータに負担がかかってしまい、動作速度が遅くなったり、場合によってはハングアップ(「フリーズ」とも言い、コンピュータが全く反応しなくなること)してしまうこともあります。 なので、「無限ループ」を作らないように注意してください。 万が一、無限ループを作ってしまった場合は、「中断」ボタンを押したり、「Ctrl」キー、「Alt」キー、「Del(ete)」キーを同時に押したりして、プログラムを終了させてください。
(2) 論理演算式
(i) 概説
「論理演算式」というのは、条件式を複数組み合わせて、その複数の条件式がどうかということによって「真」か「偽」かを判断する式のことです。 例えばテレビのニュースを見ていて、「地震のニュースで、報道の対象になっている場所が松山だったら、電話をする」という例を考えてみましょう。 これには「地震のニュースか?」「場所が松山か?」という2つの条件があり、そしてこれらの条件がどちらも「真」のときに「電話をする」ということになりますね。 このとき、もし鳥取での地震のニュースなら、「場所は松山か?」という条件が「偽」になるので電話はしません。 また、もし松山での火災のニュースなら、「地震のニュースか?」という条件が「偽」になるので電話はしません。
(ii) 論理演算式の書き方(1)
「論理演算式」は条件式を「論理演算子」でつないで表現します(「Not」は例外で、「Not」の右側にだけ条件式を書きます。)。 例えば「左側と右側がともに真かどうか?」という意味の「And」を使って、「i => 0 And i <= 10」とすれば、「i」が0〜10までのときに「真」、それ以外なら「偽」になります。 下が論理演算子の一覧です。
論理演算子意味
And「And」の左側と右側がともに真かどうか?左側も右側も真
Or「Or」の左側と右側のどちらかが真かどうか?左側だけが真、右側だけが真、両方とも真
Xor「Xor」の左側と右側の真偽が違うかどうか?左側が真で右側が偽、左側が偽で右側が真
Not「Not」の右側が偽かどうか?右側が偽
下にいろいろな例を挙げています。
[例] a >= 1 And b <= 9 '変数「a」が1以上9以下のとき「真」(例: a = 4)
a = 1 Or a = 9 '変数「a」が1か9のとき「真」 (例: a = 1)
a >= 1 Xor a <= 9 '変数「a」が1以上で9以下でないとき(=「a」が9より大きいとき)、または1以上でなく9以下のとき(=「a」が1未満のとき)「真」 (例: a = 10, a = -3)
Not a = 0 '変数「a」が1でない0でないとき「真」 (例: a = 3) (メールでのご指摘を受け、2008/09/09訂正)
(iii) 論理演算式の書き方(2)
「論理演算式」は「a < 1 And a > -1 And a <> 0」のように3つ以上つなげて書くこともできます。 この場合、左から順番に真偽が判断されていきます。 例えば、上の例ではまず「a < 1 And a > -1」の真偽が判断され、次に「a < 1 And a > -1」の真偽と「a <> 0」の真偽が比べられます。 「a」が「0」の場合は、「a < 1 And a > -1」では「真」になりますが、「a <> 0」が「偽」なってしまうので「真 And 偽 → 偽」となり「偽」になります。 また、この「論理演算子」にも「+」「-」「*」「/」のような普通の演算子のときと同じく「優先順位」があります。
演算子意味
Not「Not」の右側が偽かどうか?(論理否定)
And「And」の左側と右側がともに真かどうか?(論理積)
Or「Or」の左側と右側のどちらかが真かどうか?(論理和)
Xor「Xor」の左側と右側の真偽が違うかどうか?(排他的論理和)
例えば「a > 4 Or a < 3 And a > 2」の場合、「And」の方が「Or」より優先順位が高いので、まず「a < 3 And a > 2」が真かどうかが先に判断され、次にその真偽と「a > 4」の真偽がOrで比較されます。 また「(a > 4 Or a < 3) And a > 2」のように、カッコを使って優先順位を変えることもできます。 この場合は先に「a > 4 Or a < 3」の方の真偽が判断され、次にその真偽と「a > 2」の真偽がAndで比較されます。

以上が「Whileループ」の説明です。 何度も書いていますが、ループはプログラムに費やした労力以上の作業をさせることができる素晴らしいものです。 そして「Whileループ」が、そのループの中の最も基本的なものです。 「Whileループ」の仕組みをしっかり理解して、プログラムに労力以上の作業をさせることができるようになりましょう。 それでは各レッスンのまとめ、「やってみよう」です。

-*-*-*-*- -*-*-*-*-

数字を2つ入力してもらい、その和の数だけ「*」を表示させるプログラムを作ってみましょう。 ただし、2つの数字の和が100を超えていたら「*」を100個表示した後に、「これ以上は表示できません。」と表示するようにしましょう。


ご質問・ご意見・ご感想・苦情等はメールまたはメイン掲示板のActiveBasic板などでお気軽にどうぞ。

前に戻る - 次に進む

ホーム > OriosのActiveBasic講座(トップページ) >