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文のコード