さらなる高みへ -higher ground -

プログラミング学習の定着を狙いとしたアウトプット(独り言)をしてみるブログ

ループ処理

Rubyの基礎編も残すところあとわずかである。
今日中に何とかRailまで行きたいところだ。

さて、今回はループ処理を施すことによって、以下のことを実現したい。
レビューを書いて、見るためにはレビューを書いた後にメニュー画面に戻る必要がある。

そのためメニューで「プログラムを終了する」を選択するまでプログラムが終了しないような実装をする。

ループ処理

プログラムを実行してから終わらせないようにするにはループ処理というものを使う。
概念図は下記の通り。

これには、while という文法を使う。
whileは繰り返し処理と呼ばれるものを実行するための文法である。

繰り返し処理

繰り返し処理とはある決まった処理を繰り返し行うことである。
決まった回数や条件を満たしている間は処理を繰り返す。
繰り返し処理を行うための文法にはfor、each、whileなどいくつかある。

while文
while 条件式 do
  # 処理を実行する
end

whileは条件式で繰り返すかどうかを決める。
条件式が真(true)のときはずっと処理を繰り返し続けることになる。

sum = 0
number = 1
while number <= 10 do
  sum += number
  puts sum
  number += 1
end

 

アルゴリズム

この概念図をコードに表すとこのような形である。

sum = 0
number = 1
while number <= 10 do
  sum += number
  puts sum
  number += 1
end

3行目の「number <= 10」が条件式で「numberが10以下のときは処理を繰り返す」という条件を与えているために無限ループにはならない。

また、ここで+=という演算子が出てきた。
これは自己代入演算子と呼ばれる演算子である。

-------------------------------------------------------------------------------------

自己代入演算子とは、

その名の通り自分自身に代入するということである。
自己代入演算子は、通常の演算子を用いた書き方に直すことができる。
例としてサンプルプログラム6行目のnumber += 1を通常の演算子+を使った書き方に直してみると、

number = number + 1

こうなる。

つまり、自己代入演算子を使った式number += 1は変数numberに1足した値をnumber自身に代入するという処理になる。

なお、下記が代表的な自己代入演算子である。

自己代入演算子 処理
+= number += 1 numberに1足した値をnumber自身に代入
-= number -= 2 numberから2引いた値をnumber自身に代入
*= number *= 3 numberに3かけた値をnumber自身に代入
/= number /= 4 numberを4で割った値をnumber自身に代

 

-------------------------------------------------------------------------------------

ループ処理

さて、ここから本題のループ処理である。
プログラムを終了させず同じ処理をずっと繰り返すループ処理を行う方法は、while文の条件式をtrueにしておくことである。
これでwhileが繰り返すための条件が常に真となり、永遠にwhile内の処理が繰り返される。

while true do
  # プログラムは終了せず繰り返し処理が行われる
  ## 処理
end

しかし、これでは無限ループに陥り処理が終わることがない。
このループの処理から抜けるためにはexitメソッドを呼び出す。

exitメソッド

exitメソッドはプログラムの処理を強制的に終了させるメソッドである。

while true do
  exit  # ここでプログラムが終わる
  puts "Hello World" # これは呼ばれない
end

 

下記は、exitと入力するまでずっと処理を続けるプログラムである。
このようにwhileの条件式をtrueにすることでexitを呼ぶまで同じ処理を行い続けることになる。

while true do
  input = gets.chomp         # ユーザーの入力
  if input == "exit" then    # exitと入力されたら
    exit                     # プログラムを終了
  end
  puts "ループ中"
end