【Ruby入門】for文/while文 用途の違いによる構文理解

**申し訳ございません。↓の記載内容に一部誤りがあったため修正予定**


表題の件について技術記事を以下に記載します。


## 前提
私はプログラミング学習（主にはRuby）をはじめて１ヶ月弱の初心者ではじめて技術記事を投稿します。

まずは、初心者である私がつまづいた箇所について
理解の整理のために技術記事でアウトプットしていこうと思い立った次第です。
そのため、拙い箇所や認識齟齬がある箇所がある可能性がありますがその点についてはご容赦ください。
また記事に認識齟齬がありましたら訂正いたしますのでご指摘いただけますと幸いです。

## 何についての記事か
表題の通りとなりますが、
for文とwhile文について用途による使い分けによる構文理解というテーマで記載します。

## なぜ記事を書くのか
for文とwhile文の違いついて
コードを見て確かに違うことはわかるのですが、
なぜ違うのか、どう違うのか、今ひとつ理解できませんでした。

おそらく初学者においては一定数、
上記のような課題感を持っているのではないかと推察します。

そのため重複してしまい恐れ入りますが、以下の理由により記事を記載します。
・当該処理についてどう違うのか、なぜ違うのかを理解するため
・可能であれば初学者の方々と課題を共有し他の諸学者の理解の一助となれば、と思ったため

## 本題

ではfor文とwhile文はどのように違うのかを
用途による違いを通じてを考えていきたいと思います。

2つの処理の使い方はそれぞれ以下の通りです。

### for文

```for.rb
for カウンタ変数 in 繰り返す範囲
    繰り返し処理
end
```
・カウンタ変数
　プログラムの実行回数をカウントするために使用されます。
　当該変数は繰り返し処理の中で利用可能です。

 ・繰り返す範囲
 　反復する範囲を指定するために使用します。
　`1..5`は1〜5回繰り返すことを意味します。

・繰り返し処理
　繰り返す処理内容を記述します。

以下例示
・入力
```for_ex1.rb
for i in 1..5
  puts "これは#{i}回目の繰り返しです"
end
```
・出力
```for_ex1.txt
これは1回目の繰り返しです
これは2回目の繰り返しです
これは3回目の繰り返しです
これは4回目の繰り返しです
これは5回目の繰り返しです
```

### while文

```while.rb
while 条件式
  繰り返し処理
end
```

・条件式
　条件式が`true`の間、ループ処理が繰り返されます。
　条件が`false`になった時点で処理が終了されます。

 ・繰り返し処理
　繰り返す処理内容を記述します。
　`1 += 1`がない場合、無限ループになり処理が終わらないため記述を忘れないように。

以下例示
・入力
 ```while_ex1.rb
 i = 1 # カウンタ変数を初期化
while i <= 5
  puts "これは#{i}回目の繰り返しです"
  i += 1 #カウンタ変数を更新
         #左記を記述しない場合、変数が更新されず無限ループに
end
```
・出力
```while_ex1.txt
これは1回目の繰り返しです
これは2回目の繰り返しです
これは3回目の繰り返しです
これは4回目の繰り返しです
これは5回目の繰り返しです
```

### for文とwhile文の違いについて

上記の通りfor文とwhile文は
どちらも繰り返し処理を行う制御構文で例示では入力の仕方は違っても
出力のされ方は同じです。

そのため同じような処理に見受けられるため、
どうして2つの処理があるのか、どういう使い分けをすればいいのか
よくわからないため私は微妙に混乱していました。

そのまま、いつかわかるだろうと放置していたのですが
改めてちゃんと理解したいと思っていました。

今回は用途による違いという観点をもとにそれぞれの処理の違いを理解していくことにしました。

まずfor文は用途の観点でみると以下の特徴があります。

**繰り返し回数や繰り返す範囲が事前に把握できる状況下に適しています。**

以下は配列のなかの5つの要素を順に取り出して処理を繰り返してます。
事前に回数や範囲が明確な場合にfor文を利用します。

```for_2.rb
for num in [1, 2, 3, 4, 5]
  puts num
end
```

次にwhile文は用途の観点でみると以下の特徴があります。

**特定の条件が満たされるまで処理を繰り返したいような状況下に適しています。**

以下はカウンタ変数が５になるまで処理を繰り返してます。
事前に回数や範囲が決まっていない場合にwhile文を利用します。

```while_2.rb
i = 0
while i < 5
  puts i
  i += 1
end
```

ただ↑の例だとよくわからないと思ったので、もう少しわかりやすい例を↓考えてみました。

以下は予算の残りが3,000円という前提で、
while文を使用してランダムに商品を購入した場合に商品価格と残金を出力する繰り返し出力するプログラムです。

残金 > 商品価格のときに処理を繰り返します。
残金 < 商品価格となった時点で処理を強制終了します。

```wallet_ex.rb
wallet = 3000  # 予算の残り3,000円

while wallet >= 0
  price = rand(1..10) * 100  # randメソッドで100円〜3000円の間で100円単位の価格を生成
  if wallet >= price # 残金が商品価格より多い場合に処理を繰り返す
    wallet -= price
    puts "商品（#{price}円）を購入しました。残金は#{wallet}円です。"
  else　
    puts "残金が足りません。買い物を終了します。"
    break # 残金が商品価格より少なくなった時点で強制終了
  end
end
```

```wallet_ex.txt
商品（500円）を購入しました。残金は2500円です。
商品（700円）を購入しました。残金は1800円です。
商品（300円）を購入しました。残金は1500円です。
商品（1000円）を購入しました。残金は500円です。
商品（300円）を購入しました。残金は200円です。
残金が足りません。買い物を終了します。
```

上記のような処理を記述したいときは、while文を利用する必要があります。
繰り返し処理の回数があらかじめ決まっていないときには
while文で条件が`true`の場合処理を繰り返すように指定する必要があります。

そうでない場合（繰り返し処理の回数があらかじめ決まっているとき）は
for文の方がシンプルに済むのでfor文を使うべきです。

## まとめ

for文とwhile文は状況によって以下の用途の使い分けをする必要があります。
用途の使い分けを通じて構文理解（本題を参照）を行うことで、
どうして2つの処理があるのか、どういう使い分けをすればいいのかについて理解することができると思います。

for文を使うとき・・・

**繰り返し回数や繰り返す範囲が事前に把握できる状況下で使用する**

while文を使うときは・・・

**特定の条件が満たされるまで処理を繰り返したいような状況下で使用する**


## 追伸

はじめての投稿のため
前段が少し長くなってしまい冗長だったかもしれません。
また、わかりにくい箇所、あるいは間違っている箇所、などがあるかもしれません。
そのため上記の場合は適宜修正をかけていきます。


これからシンプルでわかりやすい記事を寄稿できるよう精進して参ります。