forループ入門
ループと条件分岐(ifの事)がプログラムの基本要素です。 という事でここでforループをマスターすると、プログラム完全に理解した、と言えます(言えない)。
という事でここではforループを見ていきましょう。
Listの要素を一つずつ取り出したりするのがfor文です。
文法としては以下のようになります。
for(変数名 in コレクション) {
}
変数名というところでつけた名前が、このforの中括弧で囲まれた範囲(ブロックといいます)でだけ使えるようになります。 新しい変数を作るのにvalやvarを作らない珍しいケースですね。
コレクションのところは、リストかRangeというものと覚えておくと最初はいいと思う。Rangeについては後で説明します。
こういうのは何度も書いて覚えるのが一番!という事で自分で書いてみましょう。
課題: itemsを一つずつ取り出してprintlnするコードを書け
解答例
fun main() {
val items = listOf("ひとつ!", "ふたーつ!", "みっつ!")
// 答え
for(a in items) {
println(a)
}
}
課題: itemsを一つずつ取り出してprintlnするコードを書け
解答例
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に入れよ
// 答え
for(n in items) {
sum += n
}
// TODO: 以下はいじらない
println(sum)
}
課題: itemsの中身を全部合計した値を出力せよ
今度は変数も自分で作って、それを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の中身を全部つなげる
// 答え
for(s in items) {
kotae += s
}
// 以下はいじらない
println(kotae)
}
課題: itemsの中身を全部つなげた文字列を作って出力せよ
今度は変数も自分で作って、それを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
のように書きます。例えば以下。
この0..5
というのがRangeです。なお、5を含めたくない場合は..<
というのが使えます。
そんなの0..4
と書けば一緒じゃない?というのは一緒なんですが、コレクションのsizeとかと組み合わせる時に便利なので、
そんなのあるんだ、とおぼえておくと良いです。
別にこのnumは使わなくてもいい。同じ事を三回出力する、みたいな時は以下のように書きます。
カウントダウンのような事をしたければ引き算で良いでしょう。
一旦変数にいれてもいいです。
リストを逆順に出力したい時にも使えない事も無い(後編でindicesなども説明するけれど)
こういう時に6なのか7なのかとかはややこしいね。
いくつか自分で書いてみましょう。
課題: 1から10までprintlnせよ
1から10までのrangeをfor文で回してprintlnします。
解答例
fun main() {
// 答え
for(a in 1..10) {
println(a)
}
}
課題: 1から10まで足した結果を求めよ
1から10まで足すといくつになるか、高校生で等差数列の和の公式というのを習いますが、 プログラマは何も考えずにコンピュータに足させます。
解答例
fun main() {
var sum = 0
// TODO: 以下で1から10まで足す
// 答え
for(i in 1..10) {
sum += i
}
println(sum)
}
課題: 1から100まで足した結果を求めよ
一緒やん、と思うかもしれんけど、100まで足した結果も求めておこう。 変数sumも自分で作って。
解答例
fun main() {
// 答え
var sum = 0
for(i in 1..100) {
sum += i
}
println(sum)
}
課題: itemsを逆順に取り出してprintlnせよ
解答例
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に入れる // 答え for(i in 0..2) { concatted += items[2-i] }
println(concatted)
}
一つ飛ばしで辿るのはパーセント(%)を使う
唐突ですがkotlinには、通常の足し算、引き算、掛け算、割り算 の他に、剰余と言われるものがあります。
これは割り算の「あまり」を求めるもので、%
を使います。
以下例を見てみましょう。
これだけだと何に使うんだ?って感じですが、一つ飛ばしとか3回に一回とかをやりたい時に便利です。
$i
に関しては文字列入門の「String template」を参照。
2で割った余りが0というのは偶数という意味ですが、ようするに0, 2, 4, 6, 8と進むという事です。
もうひとつ例を見てみましょう。 月曜から日曜までのリストがあったとして、一日飛ばしに、「月曜、水曜、金曜、日曜」をプリントしたいとします。 すると、以下のようになります。
火木土にしたいなら、いくつかやり方はありますが、以下とかどうでしょう?
さらに2つ飛ばしなら以下。
こういう風に、一つずつ交互に何かしたい、みたいな時には剰余、つまり%
を良く使います。
これは使う時が来たら思い出してここ見直すのがいいでしょう。