forループ入門

ループと条件分岐(ifの事)がプログラムの基本要素です。 という事でここでforループをマスターすると、プログラム完全に理解した、と言えます(言えない)。

という事でここではforループを見ていきましょう。

Listの要素を一つずつ取り出したりするのがfor文です。

fun main() { val items = listOf("ひとつ!", "ふたーつ!", "みっつ!") for(a in items) { println(a) } }

文法としては以下のようになります。

for(変数名 in コレクション) {

}

変数名というところでつけた名前が、このforの中括弧で囲まれた範囲(ブロックといいます)でだけ使えるようになります。 新しい変数を作るのにvalやvarを作らない珍しいケースですね。

コレクションのところは、リストかRangeというものと覚えておくと最初はいいと思う。Rangeについては後で説明します。

こういうのは何度も書いて覚えるのが一番!という事で自分で書いてみましょう。

課題: itemsを一つずつ取り出してprintlnするコードを書け

fun main() { val items = listOf("ひとつ!", "ふたーつ!", "みっつ!") }
解答例
fun main() {
  val items = listOf("ひとつ!", "ふたーつ!", "みっつ!")

  // 答え
  for(a in items) {
    println(a)
  }
}

課題: itemsを一つずつ取り出してprintlnするコードを書け

fun main() { val items = listOf("なにぃっ?", "リュウがいない", "いったいどこへ…") }
解答例
fun main() {
  val items = listOf("なにぃっ?", "リュウがいない", "いったいどこへ…")

  // 答え
  for(a in items) {
    println(a)
  }
}

課題: itemsの中身を全部合計した値を求めよ

sumに要素を足していきます。

fun main() { val items = listOf(1, 2, 3, 4, 5) var sum = 0 // TODO: ここにfor文を書いて合計をsumに入れよ // TODO: 以下はいじらない println(sum) }
解答例
fun main() {
  val items = listOf(1, 2, 3, 4, 5)
  var sum = 0

  // TODO: ここにfor文を書いて合計をsumに入れよ
  // 答え
  for(n in items) {
    sum += n
  }


  // TODO: 以下はいじらない
  println(sum)

}

課題: itemsの中身を全部合計した値を出力せよ

今度は変数も自分で作って、それをprintlnするのも自分で書いてください。

fun main() { val items = listOf(5, 6, 7, 8) // TODO:ここでfor文を書いて合計を変数に入れ // TODO:ここでprintlnして }
解答例
fun main() {
  val items = listOf(5, 6, 7, 8)

  // TODO:ここでfor文を書いて合計を変数に入れ
  // 答え
  var sum = 0
  for(n in items) {
    sum += n
  }

  // TODO:ここでprintlnして
  // 答え2
  println(sum)
}

課題: itemsの中身を全部つなげた文字列を作れ

今度は文字列です。全部をつなげた文字列を作ってください。 なお、この文字列のつなげかたはあまり良くないのですが、それは終盤でたぶん解説します。

fun main() { val items = listOf("これを", "全部", "つなげる") var kotae = "" // TODO:ここでfor文を書いてkotaeにitemsの中身を全部つなげる // 以下はいじらない println(kotae) }
解答例
fun main() {
  val items = listOf("これを", "全部", "つなげる")

  var kotae = ""

  // TODO:ここでfor文を書いてkotaeにitemsの中身を全部つなげる
  // 答え
  for(s in items) {
    kotae += s
  }

  // 以下はいじらない
  println(kotae)

}

課題: itemsの中身を全部つなげた文字列を作って出力せよ

今度は変数も自分で作って、それをprintlnするのも自分で書いてください。

fun main() { val items = listOf("今度も", "全部", "つなげる") // TODO:ここでfor文を書いてitemsの中身を全部つなげる // TODO:ここでつなげた文字の入った変数をprintlnする }
解答例
fun main() {
  val items = listOf("今度も", "全部", "つなげる")

  // TODO:ここでfor文を書いてitemsの中身を全部つなげる
  // 答え
  var all = ""
  for(s in items) {
    all += s
  }

  // TODO:ここでつなげた文字の入った変数をprintlnする
  // 答え2
  println(all)
}

Range入門

for文のコレクションのところ、

for(変数名 in コレクション) {

}

には、Rangeというものも指定出来ます。 Rangeは0から5まで、とかそういうの。

Rangeは0..5のように書きます。例えば以下。

fun main() { for(num in 0..5) { println(num) } }

この0..5というのがRangeです。なお、5を含めたくない場合は..<というのが使えます。

fun main() { for(num in 0..<5) { println(num) } }

そんなの0..4と書けば一緒じゃない?というのは一緒なんですが、コレクションのsizeとかと組み合わせる時に便利なので、 そんなのあるんだ、とおぼえておくと良いです。

別にこのnumは使わなくてもいい。同じ事を三回出力する、みたいな時は以下のように書きます。

fun main() { for(num in 1..3) { println("大事な事なので3回言いました") } }

カウントダウンのような事をしたければ引き算で良いでしょう。

fun main() { for(num in 0..3) { println(num-3) } }

一旦変数にいれてもいいです。

fun main() { for(num in 0..3) { val num2 = num-3 println(num2) } }

リストを逆順に出力したい時にも使えない事も無い(後編でindicesなども説明するけれど)

fun main() { val youbi = listOf("月曜", "火曜", "水曜", "木曜", "金曜", "土曜", "日曜") for(a in 0..6) { println(youbi[6-a]) } }

こういう時に6なのか7なのかとかはややこしいね。

いくつか自分で書いてみましょう。

課題: 1から10までprintlnせよ

1から10までのrangeをfor文で回してprintlnします。

fun main() { }
解答例
fun main() {
  // 答え
  for(a in 1..10) {
    println(a)
  }
}

課題: 1から10まで足した結果を求めよ

1から10まで足すといくつになるか、高校生で等差数列の和の公式というのを習いますが、 プログラマは何も考えずにコンピュータに足させます。

fun main() { var sum = 0 // TODO: 以下で1から10まで足す println(sum) }
解答例
fun main() {
  var sum = 0

  // TODO: 以下で1から10まで足す
  // 答え
  for(i in 1..10) {
    sum += i
  }

  println(sum)
}

課題: 1から100まで足した結果を求めよ

一緒やん、と思うかもしれんけど、100まで足した結果も求めておこう。 変数sumも自分で作って。

fun main() { }
解答例
fun main() {
  // 答え
  var sum = 0
  for(i in 1..100) {
    sum += i
  }
  println(sum)
}

課題: itemsを逆順に取り出してprintlnせよ

fun main() { val items = listOf("ころしてでもうばいとる", "そうかんけいないね", "ついにねんがんのアイスソードをてにいれたぞ") }
解答例
fun main() {
  val items = listOf("ころしてでもうばいとる", "そうかんけいないね", "ついにねんがんのアイスソードをてにいれたぞ")
  // 答え
  for(i in 0..2) {
    val s = items[2-i]
    println(s)
  }
}

課題: itemsを逆順につなげてprintlnせよ

fun main() { val items = listOf("ころしてでもうばいとる", "そうかんけいないね", "ついにねんがんのアイスソードをてにいれたぞ") var concatted = "" // TODO: itemsの中を逆順にとりだしてつなげて、concattedに入れる println(concatted) }
解答例

fun main() { val items = listOf(“ころしてでもうばいとる”, “そうかんけいないね”, “ついにねんがんのアイスソードをてにいれたぞ”) var concatted = “” // TODO: itemsの中を逆順にとりだしてつなげて、concattedに入れる // 答え for(i in 0..2) { concatted += items[2-i] }

println(concatted)

}

一つ飛ばしで辿るのはパーセント(%)を使う

唐突ですがkotlinには、通常の足し算、引き算、掛け算、割り算 の他に、剰余と言われるものがあります。 これは割り算の「あまり」を求めるもので、%を使います。

以下例を見てみましょう。

fun main() { // これは割り算 println(10/3) // これは剰余 println(10%3) // いろいろな余り println(4%2) println(3%2) println(10%7) println(1234%7) }

これだけだと何に使うんだ?って感じですが、一つ飛ばしとか3回に一回とかをやりたい時に便利です。

fun main() { for(i in 0..10) { if (i%2 == 0) println("$i は偶数です") } }

$iに関しては文字列入門の「String template」を参照。 2で割った余りが0というのは偶数という意味ですが、ようするに0, 2, 4, 6, 8と進むという事です。

もうひとつ例を見てみましょう。 月曜から日曜までのリストがあったとして、一日飛ばしに、「月曜、水曜、金曜、日曜」をプリントしたいとします。 すると、以下のようになります。

fun main() { val youbi = listOf("月曜", "火曜", "水曜", "木曜", "金曜", "土曜", "日曜") for(a in 0..6) { if (a % 2 == 0) println(youbi[a]) } }

火木土にしたいなら、いくつかやり方はありますが、以下とかどうでしょう?

fun main() { val youbi = listOf("月曜", "火曜", "水曜", "木曜", "金曜", "土曜", "日曜") for(a in 0..6) { if ((a+1) % 2 == 0) println(youbi[a]) } }

さらに2つ飛ばしなら以下。

fun main() { val youbi = listOf("月曜", "火曜", "水曜", "木曜", "金曜", "土曜", "日曜") for(a in 0..6) { if (a % 3 == 0) println(youbi[a]) } }

こういう風に、一つずつ交互に何かしたい、みたいな時には剰余、つまり%を良く使います。 これは使う時が来たら思い出してここ見直すのがいいでしょう。