19.0331

for/while/do-while 文

ここでは、
  for文
  while文
  do-while文
を、学習します。

if文関連、when文 は、「条件分岐で、処理を分ける」 ために使うことが多いですが、
これらの文は、「繰り返して処理する」 ために使うことが多いと言えます。


1. for文
20.0604
for文 に関する説明を、全面的に書き直すことにしました。
なぜかというと、1年以上前に書いた内容は、ちっとも、
  今どきの、for文
に、フォーカスしていないことに気が付いたからです。
私が最初に、for文 を覚えたのは、Java1.4 の時代でありまして、
その当時の、for文 が、単純に、簡単に書けるようになったという認識で、
書いていたのが、大きな間違いであったようです。

今どきの、for文は、
たしかに、ロジック的には、簡単なのですが、
  暗黙のアクション
を、理解していないと、逆に難しいとも言えます。

暗黙のアクションとは、
  for文の引数の中で、「イテラブルオブジェクトの要素
  が、変数の定義なしに、一個一個 ある変数に、
  割り当てられて/代入されて いくこと
です。

ある変数とは、何でしょうか?
この、
  ForAndIterableObj.kt
    / (For文 と イテラブルオブジェクト.kt)
というサンプルコードを見ながら考えていきましょう。

コードを見ていただければ、すぐに、
  ある変数とは、elementであること
は、分かっていただけると思います。

コードの流れをざっと見ていきます。

まず、arrayUsedByFor(For文で使われる配列)という 配列 の定義です。

次に、For文 では、arrayUsedByFor という、イテラブルオブジェクト から、
  要素を一つ一つ取り出して、
  変数element に、代入して

  print文 で、コンソールに、出力/プリント している

という、単純な、流れです。

ただし、単純とはいえ、
  For文あってこそ
でありまして、コードを書くのは簡単でも、
コンピュータ/JVM は、もっと複雑なことをしているはずです。

ではまとめます:
For文 とは
  イテラブルオブジェクト から、要素を代入する変数 を使って、一つ一つ、取り出す  
こんなことをする、制御文 だと言えます。



(最初に書いた、訂正すべき)
  / 部分的に、使える可能性もあるので、ここに置きました。
for文は、近頃といっても、ここ何年ぐらいかは、よく覚えていませんが、
というか、いつの間にか、簡単に書けるように、なったようです。
少し前までは、for文 の、ロジック/流れ を、追うのが、大変だったのですが、、、
特にアルゴリズムなどに使う場合、、、最近は、
一度理解すれば、割と簡単だと思います。
また、複雑なアルゴリズムのために使う場合も、サードパーティーであれ、
そのための関数が用意されている場合が多いと思います。
たとえば、シャッフル などでも。

繰り返し処理する
「やさしいKotlin入門」 にあった例ですが、
やっぱり、for文 の、例文としては、「九九」 は、ピッタリです。
ということで、ここでも、使わさせていただこうと思います。

「九九」を for文 を使ってやるとこんなに簡単に実現できます。

ただ、この例は、for文 を、ネスト/入れ子させているので、やや複雑です。

まずは、ネストさせず、九九の3の段 のみを、for文 で、実現してみましょう。

それでは、このコードを見ていきましょう。

まず、なんだこれは?と、思うと思われるのが、forの、引数/for(ここ) の、最初にある
  i
だと、思われます。

この意味は、
  var i: Int = 0
と考えましょう。
つまり、

  for のあとの、() の先頭には、
  varキーワード を使わなくても、
  変数の定義 が、出来るという 仕組み/ルール

に、なっているのです。
により、暗黙の了解で使われています。

また、慣例として、i などが、多くのコードで使われますが、
別に、ii でも、a でも、OKです。

そして、for文 の 仕様/ルール として
たとえば、この場合、
  i が、 IntRange型リテラル/1..9 の範囲で、
  i+1 を繰り返す
のです。
また、
  i が、1 2 3 4 5 6 7 8 9 の時の、計9回
  for文 の ブロックコード/for(i in 1..9){ //繰り返すコード }
  を、実行する
ことになっています。

さて、九九のすべての段を実行するコード ですが、
  for文の 中のfor文 まで進んだ時、
  中のfor文 が、終わるまで実行され、
  ふたたび、外側のfor文 の実行に戻り...
を、繰り返すわけですね。
ゆとりがあれば、
コードを、見ながら、または、A4用紙などに、書きながら、
じっ~くりと、考えてみてください。



2. while文
while文 も、「繰り返す処理」 が、得意です。
while文 の、イメージは、こんな感じでしょうか。

while(繰り返すための条件) { // 繰り返すコード }

そして、
  繰り返すための条件 が、trueである限り
  whileブロック/{ } が、実行される
のです。

それでは、例文 を、見てみましょう。

先ほどの説明のように、
  x in 1..10
  が、trueである限り、
  whileブロック/while(x in 1..10){ //繰り返されるコード }
  が、実行される
ということになります。

for文 との違いを考えてみますに、
  条件などで、使われる 変数 は、while文部分 とは、別に自分で、定義する。
    // var x: Int = 1
  1つづつ増やす/インクリメント(x = x+1)も、while文部分 とは、別に自分で、書く。
が、あると思います。

つまり、暗黙のルール としては、
  繰り返すための条件 が true である限り、whileブロック を繰り返す
だけなので、
初めてやるには、理解しやすい気がします。


3. do-while文
do-while文 は、while文の、仲間な感じです。
イメージとしては、
  do{
    何はともあれ、最初に必ず実行されるコード
    while(条件) の、条件true である限り、繰り返される
  } while(条件)
こうです。

では、例文 を、見てみます。

それでは、ここで問題です。
「Androidアプリを作りたい!」 は、何回表示されるでしょうか?

気を付けるべきは、
  ・まず最初に1回は実行される。
  ・i の、値 は、今いくつなのか、慎重に追っていく。
  ・<= は、「左の値 が、右の値 より 小さいか、同じ ですか?」
この3点に気を付けて、考えてみてください。

正解は、こちらになります。



まとめ
  for文のコード
  while文のコード
  do-while文のコード