08.繰り返し(while文 for文)


なんかすっげぇ久々な感じがする……(;・∀・)
いや、なんかね。
『繰り返し構文と配列変数(後述)、どっち先にやればいいかなー』
なんて迷ってたんですよ。

でも、とりあえずはこの繰り返しから先に触れようかなと。

さて、『繰り返し構文』てのは、要は
『同じ処理を繰り返す』って時に利用するものでして。
おれの場合はよく使うのが、

  1. 条件成立するまでひたすら同じ処理を繰り返すのが得意な『while文
  2. 決められた回数だけ繰り返すのが得意な『for文

の二種類があります。
おれにプログラムを教えてくれたある御方によりますと、
『人間は本質的にfor文よりwhile文の方が得意だよ』とのことです。
for文の方が得意で好きなおれは、人間以外なのでしょうか……(;・∀・)

それでは、まずはwhile文から見ていきまっし(`・ω・´)

while文

while文は、以下の様な構文になっています。

while 条件式 do
  繰り返す処理
end

『条件式』の部分には論理演算式、
『繰り返す処理』のところには、繰り返したい処理を書きます。
そうすると、『条件式』が成立している間は、
『繰り返す処理』を何回も繰り返すことになります。

というわけで、実際にこのようなプログラムを組みました。

# encoding: utf-8

#変数に値を代入
count=1

#カウント開始!
print "count!!\n"

#カウント10まで続ける
while count < 11 do
  print(count," !!\n")
  count = count + 1
end

# カウントが終了したらK.O宣言!!
print("\nK.O!!")

これは要は、カウント1から10まで数えて、
10になったら『K.O!!』と表示されるプログラムです。
これを走らせた結果がこちら。
01
ほい。無事出来ました(・∀・)

今回、キモとなる部分はここです。

#カウント10まで続ける
while count < 11 do
  print(count," !!\n")
  count = count + 1
end

この部分、意味合いは
『変数coutが11より小さい値の時は、以下の処理をしなさい』
という感じになります。
なので、カウントが11より小さい数の間は、
『変数coutを表示する』『変数countに+1する』
という2つの処理を繰り返します。
繰り返して最終的に変数countの値が11に達すると、
処理をやめるわけです。

ちなみにこんな使い方も出来ます

# encoding: utf-8

#変数に値を代入
limit=10

#カウント開始!
print "Count Down Start!!\n"

#カウント0まで続ける
while limit > 0 do
  print(limit," !\n")
  limit = limit - 1
end

# limitがゼロになったら爆発!!
print("\nBOMB!!")

これは最初の例と違って、カウントダウンの場合ですね。
こちらを実行させた結果がこちらです。
05
ほい。無事カウントダウンできています。
今回のキモはこちら。

#カウント0まで続ける
while limit > 0 do
  print(limit," !\n")
  limit = limit - 1
end

今回の場合ですと、
『変数limitが0より大きい』間、
『変数limitを表示する』『変数limitの値を-1する』
という処理をくりかえしてをります。

whileに関してはこんな感じです。

for文

for文の基本構文はこんな感じです。

for 変数名 in はじめる数..終わる数 do
  繰り返す処理
end

for文の場合は、『変数名』のところで指定した変数の値を、
『はじめる数』から『終わる数』まで1ずつ変更していき、
その間『繰り返す処理』を繰り返していきます。
最終的に『変数名』が『終わる数』になったら、
最後に『繰り返す処理』をして終了です。

では、while文のときのカウントアップのプログラムを、
for文でかきかえてみませう。

# encoding: utf-8

#カウント開始!
print "count!!\n"

#カウント10まで続ける
for num in 1..10 do
  print(num," !!\n")
end

# カウントが終了したらK.O宣言!!
print("\nK.O!!")

こんな感じです。実行結果はこちら(`・ω・´)
01
ほい。なんとかカウントアップされてますね。
キモはここです。

#カウント10まで続ける
for num in 1..10 do
  print(num," !!\n")
end

ここで、変数numの値を1から10まで変更している間、
『変数numを表示する』という処理を繰り返しています。

んじゃ、逆にカウントダウンはどうでしょうかね。
while文でのカウントダウンをそのまま素直にfor文に書き換えてみまっし(`・ω・´)

# encoding: utf-8

#カウント開始!
print "Count Down Start!!\n"

#カウント10まで続ける
for num in 10..1 do
  print(num," !!\n")
end

# numがゼロになったら爆発!!
print("\nBOMB!!")

ほい。めっちゃ素直に書いてみました。
これを走らせると、こんな感じの結果になります。
04
ありー(´・ω・`) ちゃんと表示されてませんね(´・ω・`)
どうも、工夫しないとfor文はカウントダウンをやってくれないようです(´・ω・`)

というわけで、以下のように変更を加えてみました。
for文には繰り返しに徹していただき、
変数limitを使ってカウントダウンを行っています。

# encoding: utf-8

#変数の宣言
limit=10

#カウント開始!
print "Count Down Start!!\n"

#カウント10まで続ける
for num in 1..10 do
  print(limit," !\n")
  limit=limit-1
end

# limitがゼロになったら爆発!!
print("\nBOMB!!")

そして走らせてみた実行結果がこちら。
02
というわけで、無事実装できました(・∀・)

ところで、繰り返しを行うという似た命令文であるwhile文for文なのですが、
両者には明確に異なった強みが有ります。

  • 何回繰り返すか分からんけど、とりあえず繰り返す』のが得意なのがwhile文
  • 『繰り返す回数が決っている』のが得意なのがfor文

こんな感じの強さの違いがあります。

最終的に出力結果が間違ってなければどちらでも構わないのですが、
もしrubyにかぎらず『どっち使えばいいんだよー(´・ω・`)』と迷った時は、
このようなことを思い出していただければいいかなぁと思います。

ちなみにおれは好みでいえばfor文です(`・ω・´)
すんげーどうでもいい話なんですけどね。
バグなくうごきゃーいいんですよこんなもんは(・∀・)