娘とGoでプログラミング。FizzBuzzって色々詰まってるんやね。

FizzBuzzのルールを書いてあげたら、こういうのを書いてきたので「お父さんScratch飽きてきたからGoでやろ?」って軽い気持ちで言ってみたんだけど、いざ教えようと思うと結構色々伝えないといけなくて大変だったやw。FizzBuzzって色々詰まってるんやね。

f:id:bufferings:20181202185820j:plain

## RunとKill

A Tour of GoのPrintlnのところを開いて

https://go-tour-jp.appspot.com/welcome/1

へー。こんな風に書くのかーって思いながら(何回かやったことあるけど覚えてなかった)。

package main

import "fmt"

func main() {
    fmt.Println("Hello, 世界")
}

僕「Runを押してみな」

娘「ら・・らん?これ?どういう意味?」

僕「プログラムを動かすっていう意味」

娘「ボタン変わった!」

僕「それはKillだね。殺すって意味」

娘「へっ!?」

僕「あー。プログラムを途中で止めるっていうときに使われるんよ」

娘「へー。あ、動いた(∩´∀`)∩ワーイ」

## Println

僕「この『世界』の部分書き換えて」

娘「OK。み・・・つ・・・ゆ・・・き」

僕「じゃRunしてみ」

娘「『Hello, みつゆき』(∩´∀`)∩ワーイ」(みつゆきは僕の名前です)

僕「プリントラインすると文字がここにプリントされるってこと」

娘「ふーん。プリンターで出てくるみたいなものね。ラインは・・・線?」

僕「ここのラインは行って意味だね」

娘「へー」

## 値と変数

僕「次はforかなぁ」

って、A Tour of Goのfor文のところを開いて

https://go-tour-jp.appspot.com/flowcontrol/1

package main

import "fmt"

func main() {
    sum := 0
    for i := 0; i < 10; i++ {
        sum += i
    }
    fmt.Println(sum)
}

娘「Runしたら45になった!どういうこと?」

僕「このsumの値が45ってことだね」

娘「あ・・・た・・・い?あたいするってこと?」

僕「んー。sumって変数の中に45って値が入ってるんだけど・・・」

(しばらく色々説明)

娘「ふーん。私の『年齢』って変数の箱に『9歳』って値が入ってるの・・・かな?」

僕「そうね。まぁだいたいで大丈夫」

## インクリメント

僕「ってことで、forの部分の説明ね。このforは『繰り返す』ってこと」

娘「ふーん」

僕「iが0から始まって10未満の間は、この中の処理を繰り返すってこと」

娘「なか???」

僕「あぁ、この括弧と括弧の間の部分。で、一回終わったらiを1増やして、10未満かどうかをチェックして、10未満だったら、もう一回処理を実行するの」

娘「へー。このプラス2つの部分で増えるの?」

僕「そうそう。プラス2つで『インクリメント』って言って・・・んー、言葉はやっぱいいや。まぁ1増やすってこと」

娘「へー。算数のテストで1足すときに書いてみようかな?」

僕「あ、いや、それやめて。お父さんが先生に怒られる。プログラムのときだけね」

## for文

娘「分かんなくなってきた!どうなってるか想像できない!」

僕「じゃ、このiがどうなってるか見るために、forの中にPrintlnを書いてみて?」

娘「はーい」

(しばらく待つ)

娘「こう・・・かな?」

func main() {
    sum := 0
    for i := 0; i < 10; i++ {
        sum += i
        fmt.Println(i)
    }
    fmt.Println(sum)
}

僕「実行どうぞ」

娘「へー。0から9まで出たー」

娘「でも、この45って何?」

僕「じゃ、sumも出してみたら?」

## sum

娘「できたー」

func main() {
    sum := 0
    for i := 0; i < 10; i++ {
        sum += i
        fmt.Println(i)
        fmt.Println(sum)
    }
    fmt.Println(sum)
}

娘「Runね」

0
0
1
1
2
3
3
6
4
10
5
15
6
21
7
28
8
36
9
45
45

僕「iが0で、sumは0+0だから?」

娘「1かな?」

僕「あほなのかな?」

娘「あほちゃうし。0ね」

僕「そうだね。つぎはiが1になるから・・・(説明)」

娘「45になった!」

僕「そうだね。リモート調子悪いみたいだしローカルでやろうか」

## ローカル環境の準備

娘にあげた古いMacBookAirに

  • Goをインストールして
  • VS Codeをインストールして
  • Hello.goファイルにmain関数とfmt.Println("Hello")書いてあげて
  • ターミナルをVS Codeの下半分に表示しておいて
  • go build Hello.go./Hello実行とやってあげといた。

## 説明

僕「この下半分の方をクリックして矢印の上を2回押したらgo buildって出るからそれでビルドして」

娘「・・・びるど???上2回押してEnterね。できた。」

僕「ほら、このHello.goの隣にHelloってファイルができたでしょ?これが君が初めてビルドして作ったプログラムだね」

娘「(∩´∀`)∩ワーイ」

僕「そのあと上をもう2回押したら./Helloって出るからそれで実行ね」

娘「・・・じっこう???できた。ハロー!」

## forで1から100まで

僕「さっきのforループのプログラムをコピーしてきてちょっと修正しといたわー」

package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        fmt.Println(i)
    }
}

僕「これ実行すると、0から9まで表示されるよね。ほら」

娘「うん」

僕「これで1から100まで表示するようにしてみて?」

娘「100までってことは、101までにすれば良いのね。できたー!」

僕「最初の数字は?」

娘「あ、0だ。じゃ、ここをこうしてっと。できたー!」

僕「いいね」

package main

import "fmt"

func main() {
    for i := 1; i < 101; i++ {
        fmt.Println(i)
    }
}

## if

僕「じゃ、15のときにFizzBuzzって表示するようにしてみようか。それには『もし』っていう意味の『if』を使うんだよ」

娘「『もし』ぶつかったら『ダメージを受ける』ってやりたいのよ!」

僕「それは良いね。お父さんはそれは書けないけど、君は今日のが書けたらそのうち書けるようになると思うよ」

娘「(∩´∀`)∩ワーイ」

僕「じゃif i == 15 {}って書いて」

娘「アイ・・・アイ・・・アイ・・・エフ・・・エフ・・・」

(しばらく待つ)

娘「書けたよー!」

僕「この括弧の中にFizzBuzzってプリントするように書いて?」

娘「はーい。さっきのやつよね・・・f・・・m・・・t」

(しばらく待つ)

娘「できたー!15の次にFizzBuzzが出てきたー!」

func main() {
    for i := 1; i < 101; i++ {
        fmt.Println(i)
        if i == 15 {
            fmt.Println("FizzBuzz")
        }
    }
}

僕「いいね。次は15の倍数のとこ全部の下にFizzBuzzを出そうか?」

## %

僕「パーセントマークを使うよ。if i % 15 == 0に書き換えて?」

娘「はーい」

(しばらく待つ)

娘「できたー」

func main() {
    for i := 1; i < 101; i++ {
        fmt.Println(i)
        if i % 15 == 0 {
            fmt.Println("FizzBuzz")
        }
    }
}

僕「実行してみ?」

娘「わー!15とか30とかのとこ全部にFizzBuzzがついた!」

僕「そう。これは15で割ったあまりが0って意味ね」

娘「ふーん。割ったあまりが・・・ゼロ・・・?分かるような分からないような・・・まいっか」

娘「それよりも、15の次にFizzBuzzを出すんじゃなくて、15のところをFizzBuzzに入れ替えなきゃ」

僕「いいところに気づいたね。じゃ、elseだね」

## else

僕「} else {って書いて、数字を出すやつをそっちに移動してみて。カット&ペーストを教えてあげよう。」

娘「カット・・・?難しいけど便利ね。実行・・・と。あ、15のところがFizzBuzzになったー!(∩´∀`)∩ワーイ」

func main() {
    for i := 1; i < 101; i++ {
        if i % 15 == 0 {
            fmt.Println("FizzBuzz")
        } else {
            fmt.Println(i)
        }
    }
}

## else if

僕「次はどうしよう?」

娘「3の倍数をFizzにしたい」

僕「いいね。じゃelse ifって書いて?」

娘「はーい」

僕「その後は『3の倍数のときだけ』ってつけて?分かるかな?」

娘「んー。パーセントかな・・・。こう・・・かな?」

package main

import "fmt"

func main() {
    for i := 1; i < 101; i++ {
        if i % 15 == 0 {
            fmt.Println("FizzBuzz")
        } else if i % 3 == 0 {
     
        } else {
            fmt.Println(i)
        }
    }
}

僕「実行してみなー」

娘「うん。あれー?3のところ消えた!」

僕「どうしてかな?」

娘「あ!書いてなかった!こうやって・・・できたー!」

## 5の倍数

娘「あとは5の倍数ね・・・else ifして・・・% 5して・・・」

func main() {
    for i := 1; i < 101; i++ {
        if i % 15 == 0 {
            fmt.Println("FizzBuzz")
        } else if i % 3 == 0 {
            fmt.Println("Fizz")
        } else if i % 5 == 0 {

        } else {
            fmt.Println(i)
        }
    }
}

僕「実行してみようか?」

娘「え!まだPrintln書いてないから!」

僕「どうなると思う?」

娘「え?5の倍数が消えるはず!」

僕「やってみよう?」

娘「うん・・・あれ?」

1
2
Fizz
4
Fizz
7
8
Fizz
11
Fizz

娘「5の倍数がFizzに・・・なった・・・?」

僕「えっ?あー。ふふふ。よーく見てみて?」

娘「あ・・・れ・・・?あー!5が消えてるんだ!分かりにくいわ!」

## Buzz

娘「じゃ、Buzzを書いて・・・こうだな!できたー!!!」

package main

import "fmt"

func main() {
    for i := 1; i < 101; i++ {
        if i % 15 == 0 {
            fmt.Println("FizzBuzz")
        } else if i % 3 == 0 {
            fmt.Println("Fizz")
        } else if i % 5 == 0{
            fmt.Println("Buzz")
        } else {
            fmt.Println(i)    
        }
    }
}

娘「ありがとうございました!」

僕「いえいえ(ヽ´ω`)グッタリ」

娘「ママー!プログラム書いたよ!ビルドして実行したらね、ほらFizzBuzzが動くよ!」

妻さん「び、びるど・・・?実行?ふぃず・・・ばず・・・?なんか全然分からないけど、す、すごいねー!」

娘「(∩´∀`)∩ワーイ」