例えば、1から3までの数値を出力するプログラムを書く場合、今までの知識では下記のように記述すると思います。
fun main(args : Array<String>){
println(1)
println(2)
println(3)
}
———————————————————————————————-
実行結果
1
2
3
しかしこれが1000までとなった場合、println()を1000行書くのはとても大変ですよね。
上記サンプルコードのように、「同じ処理を何回も記述する」場合は、繰り返しの制御構文を使って書くと、楽に書くことが出来ます。
今回は、繰り返しの制御構文「for」「while」について学んでいきましょう。
for文
繰り返しの処理をするプログラムを書く場合は、「for」を使います。繰り返しのことをループとも呼びます。forは、繰り返す範囲を指定する場合と指定しない場合の2通りの書き方があります。
まずは、範囲を指定する書き方です。「今何回目のループか」を保持するための変数「ループカウンタ」を使います。 最初に開始値がループカウンタに代入され、1回分の処理が終わると「開始値+増分(1回のループで増やす値)」でループカウンタの値を上書きし、次のループに入ります。ループカウンタの値が終了値に達したら繰り返し処理は終了となります。
例えば、範囲が1~10とした場合、ループカウンタの値は
増分1 → 1,2,3,4,5・・・10
増分2 → 1,3,5,7,9
増分3 → 1,4,7,10
のように増えていきます。
for( 変数名 in 開始値..終了値 step 増分){
繰り返したい処理
}
1から5までの範囲で増分2を指定して書いた場合のサンプルコードです。1回のループで2増えるので、2と4は出力されません。
1週目⇒ 変数aに1を格納してprintln()で出力
2週目⇒ 変数aに3を格納してprintln()で出力
3週目⇒ 変数aに5を格納して println()で出力
ループカウンタが終了値に達したのでこの回で繰り返し終了
fun main(args : Array<String>){
for(a in 1..5 step 2){
println(a)
}
}
———————————————————————————————-
実行結果
1
3
5
増分が1の場合「 step 増分 」の記述は省略できます。
for( 変数名 in 開始値..終了値 ){
繰り返したい処理
}
先程のプログラムの増分を省略して書くと下記のようになります。
fun main(args : Array<String>){
for(a in 1..5){
println(a)
}
}
———————————————————————————————-
実行結果
1
2
3
4
5
次に、繰り返す回数を指定しない書き方です。リスト(配列)の先頭から順番にとりだした値を変数に代入し、処理をループします。リストの最後まで到達したらループ終了です。
for( 変数名 in リスト){
繰り返したい処理
}
3名分の名前が格納されている配列の要素をfor文を使って出力する例です。
1週目⇒ 配列の先頭から”鈴木”を取り出し変数nameに格納してprintln()で出力
2週目⇒ 配列の2番目から”佐藤”を取り出し変数nameに格納してprintln()で出力
3週目⇒ 配列の3番目から”田中”を取り出し変数nameに格納してprintln()で出力 配列の最後となるので、この回で繰り返し終了
fun main(args : Array<String>){
val list = (“鈴木”, “佐藤”, “田中”)
for(name in list){
println(name)
}
}
———————————————————————————————-
実行結果
鈴木
佐藤
田中
while文
「while」もforと同じ繰り返し処理を書くときに使います。
while( 条件式 ){
条件式を満たしている間繰り返す処理
}
変数aの値が5になるまで「変数aの値を出力してインクリメントする」処理を繰り返すサンプルコードです。
fun main(args : Array<String>){
var a = 0
while(a < 5){
println(a)
a++
}
}
———————————————————————————————-
実行結果
0
1
2
3
4
ポイントは、繰り返し処理の中に「while文を抜けるための記述」が必要ということです。上記のサンプルコードでは、繰り返し処理の中で変数aをインクリメントすることで、6回目のループ時に条件式がfalseとなり、繰り返し処理を抜けることができています。
もし、先程のサンプルコードで、変数aをインクリメントする処理を書き忘れてしまった場合、変数aの値は0から増えないため、繰り返し処理を抜けることが出来なくなり「無限ループ」になってしまうので注意が必要です。
fun main(args : Array<String>){
var a = 0
while(a < 5){
println(a)
}
}
———————————————————————————————-
実行はできるけど、0が出力され続けてプログラムが終了しません。
do~while文
do{
条件式を満たしている間繰り返す処理 (初回は条件関係なく実行)
}while( 条件式 )
do~whileもwhileと基本的には同じですが、「条件式を満たしていなくても1回は繰り返し処理を実行する」という特徴があります。
通常のwhile文では、条件式を評価してから処理をするので、条件文を満たさない場合は処理を実行しません。
fun main(args : Array<String>){
var a = 5
while(a < 5){
println(a)
a++
}
}
———————————————————————————————-
実行結果
(何もなし)
do~while文の場合は、処理をしてから条件式の評価をするので、条件を満たしていなくても最初の1回は実行されます。
fun main(args : Array<String>){
var a = 5
do{
println(a)
a++
} while(a < 5)
}
———————————————————————————————-
実行結果
5
break、continue
「break」「continue」は繰り返し処理を中断したい場合に使います。
それぞれの使い方を見ていきましょう。
「break」は、繰り返し処理全体を中断します。
fun main(args : Array<String>){
var a = 0
while(a < 5){
println(a)
a++
if(a == 2){
break // 変数aの値が2になったらループ終了
}
}
}
———————————————————————————————-
実行結果
0
1
「continue」は、ループ内の処理を中断して次のループに移す場合に使います。
fun main(args : Array<String>){
var a = 0
while(a < 5){
a++
if(a % 2 == 0){
continue // 変数aの値が偶数の場合は次のループへ
}
println(a)
}
}
———————————————————————————————-
実行結果
1
3
5
ここまで、Kotlinの基本的な構文について学んできました。(応用レベルの使い方についてはまた別の記事にしたいと思います)
プログラムを書くために、最低限知っておきたい学習については、今回の記事で終了となります。
次回からは、「良いプログラムの書き方」に関する学習になります。