僕のメモ帳

僕のメモ帳です。

アクションカメラを買った…2021

あ、どうもお久しぶりです。たかしです。

最近全然ブログを更新していなくてですね。
理由としましては「ポインタの説明って面倒じゃね?」
って思ったのと、ちょっと勉強に対するモチベーションが上がらず。

ただ、今はアプリ開発の勉強をしていまして、下書き状態で眠っている記事なんかもあり、まあこいつらは恐らく公開しないんでしょうけども、アプリ開発系の記事も書いていこうかななんて思っています。
というのも、先ほど書きました通り、勉強に対するモチベーションが上がらず、ガチでなんもしないでウマ娘だけやってる1週間とかありましてですね。無理やりにでもモチベーションを上げようと考えたときにふと考えたのです。
「アプリ作ってTwitterに載せていくことにしたらモチベーションが続くんじゃないか?」と。

ただこいつが問題で、Twitterに埋め込めるアプリを作るには、JavaScriptの知識が必要で、Goとかとは関係ないんです。
とはいえ、プログラム設計の勉強にはなりますから、こういうことはやっていこうかなと思います。

さてさて、そんな中、先日のAmazonのセールでアクションカメラ買ったんです。GoProは高いので、某国産の安いカメラを。

僕はバイクに乗りますんで、その映像を撮って、動画編集の勉強も趣味にしていこうかなと思っています。
(なんか、お金にならんことばかりやっている気がする。笑)

なので、今後は、アプリ開発ブログ書きつつ、動画編集ブログ(書くことあるんだろうか?笑)を書いていこうかと思います。

さて、明日はツーリングですので今日は寝ます。

アプリ開発も、色々なソフト触れて楽しいんで、いつか知識を整理する意味でも記事としてまとめて公開したいなあ。

とりあえず、今日はここで。おやすみなさい。

Goの勉強 肥満度判定BMI計算をしてみよう 改造編 ~関数化してみよう~

こんばんわ。たかしです。

今日は、ここまで作ってきたBMI計算のコードで、関数化できるところは関数化してしまおうという記事です。

前回の記事はこちらです。
bokunomemocho.hatenablog.com

では、行ってみましょう。

そもそもなんで関数化するの?

僕自身、C言語を使っているエンジニアなもので、関数という言い方をしています。
Goだと別の言い方なんですかね?調べたけど関数で普通に引っかかったのでこのまま関数で書き進めていきます。

まずは、そもそもなんで関数化する必要があるのかについて考えてみましょう。

重複している処理を1つの関数としてまとめてしまうことで、ソースコードを見やすくする(解析が容易になる)ことや、処理の複雑化を防ぐことができる。というメリットがあげられます。

実際に、前回までに作成したBMI計算のコードを見てみると、処理が重複しているところがありますね。
そうです。身長を入力するところと、体重を入力するところです。
この重複しているところを一つの関数にまとめてしまうことで、やりたいことが明確になってわかりやすいソースコードになるわけですね。

では、実際に関数化していきましょう。

処理を関数化するよ!

さあ、先ほども書きましたが、BMI計算のコードには重複処理が存在しているので関数化してしまいましょう!

まずは重複しているfor文の中で、身長と体重で違うところは。

_, err1 := fmt.Scan(&height)
_, err2 := fmt.Scan(&weight)

ここと

fmt.Printf("身長を入力してください:")
fmt.Printf("体重を入力してください:")

この部分ですね。

これらの部分は、パラメータでもらうようにしてしまいましょうか。

そして

if count == 5

この部分も、パラメータで何回まで許容するのか受け取れるようにしてしまいましょう。

また、正常に処理を行えたかをmainに返したいので、正常に終了した場合は0。指定回数ちゃんと入力されなかったら-1を返すようにしましょうか。

これらを踏まえると、関数の宣言はこのようになります。

func GetNum(num *float64, msg string, max_count int) int {
}

一つずつ説明していきましょう。

「GetNum」というダサい名前はおいておいて…
まず、関数はこのように宣言します。

func 関数名(引数があれば指定。複数指定可) 戻り値の型 {
}

例を示すと

// 引数なし、戻り値なし
func hoge1() {
}

// 引数あり、戻り値int
func hoge2(hoge int) int {
    return 0
}

こうなります。

つまり

func GetNum(num *float64, msg string, max_count int) int {
}

こいつは「GetNumという名前の関数です。引数は3つあって、順番に*float64, string, intですよ。戻り値はintですよ。」という意味になります。
ここで、*float64というのが出てきましたが、これは「ポインタ」というものです。今回は御まじないみたいなものだと思ってください。

では、GetNum関数の中に、身長のfor文を移動してきましょう。

func GetNum(num *float64, msg string, max_count int) int {
    for {
            fmt.Printf("身長を入力してください:")
            _, err1 := fmt.Scan(&height)

            // エラー判定
            if err1 != nil {
                fmt.Print("数字で入力してください!\n")
                count++
                if count == 5 {
                    fmt.Print("ちゃんと入力してくれないので処理終了しますね>。\n")
                    os.Exit(1)
                }
            }else{
                // 正しく入力されたらループを抜ける
                break
        }
    }
}

まずは、こいつらのうち、身長と体重で異なる部分を引数で埋めちゃいましょう。
あと、err1って言うのもダサいので、errに直しちゃいましょう。

func GetNum(num *float64, msg string, max_count int) int {
    for {
            fmt.Printf("%sを入力してください:", msg)
            _, err := fmt.Scan(num)

            // エラー判定
            if err != nil {
                fmt.Print("数字で入力してください!\n")
                count++
                if count == 5 {
                    fmt.Print("ちゃんと入力してくれないので処理終了しますね>。\n")
                    os.Exit(1)
                }
            }else{
                // 正しく入力されたらループを抜ける
                break
        }
    }
}

さて、次は入力上限を指定しましょうか。
そういえば、for文って「初期化、終了条件、計算式の構造」の形でも書けましたよね。
そうです。max_countまで処理してしまったら異常終了。それまでに正しく入力されたら正常終了。
このように書いてしまえば、わかりやすいのではないでしょうか。

あと、max_countまで処理してしまった場合に出している文言は、呼び出し元で表示するようにしてもらって消してしまいましょう。

func GetNum(num *float64, msg string, max_count int) int {
    for count := 0 ; count < max_count ; count++ {
        fmt.Printf("%sを入力してください:", msg)
        _, err := fmt.Scan(num)

        // エラー判定
        if err != nil {
            fmt.Print("数字で入力してください!\n")
        }else{
            // 正しく入力されたら正常終了をする
            return 0
        }
    }

    // 最後まで正しく入力されなかったら異常終了
    return -1
}

うん。とってもシンプルになりましたね。

次は、呼び出し元の修正です。
身長と体重、それぞれでGetNumを呼び出してみましょうか。

err := GetNum(&height, "身長", 5)
err = GetNum(&weight, "体重", 5)

これで呼び出すことができます。

あとは、errで受け取った戻り値を判定して、異常終了ならメッセージ出力して処理を終了しましょうか。
これらを踏まえると、全体の処理はこうなりました。

// パッケージ名
package main

// パッケージ取り込み
import (
        "fmt"
        "math"
        "os"
)

// 体重と身長を指定
var weight float64
var height float64

// 入力受付
func GetNum(num *float64, msg string, max_count int) int {
        // 入力処理
        for count := 0 ; count < max_count ; count++ {
                fmt.Printf("%sを入力してください:", msg)
                _, err := fmt.Scan(num)

                // エラー判定
                if err != nil {
                    fmt.Print("数字で入力してください!\n")
                }else{
                    // 正しく入力されたら正常終了をする
                    return 0
            }
        }

        // 最後まで正しく入力されなかったら異常終了
        return -1
}

// mainの定義
func main() {
        // 身長を入力
        err := GetNum(&height, "身長", 5)

        // エラー判定
        if err != 0 {
                fmt.Print("ちゃんと入力してくれないので処理終了しますね。\n")
                os.Exit(1)
        }

        // 体重を入力
        err = GetNum(&weight, "体重", 5)

        // エラー判定
        if err != 0 {
                fmt.Print("ちゃんと入力してくれないので処理終了しますね。\n")
                os.Exit(1)
        }

        var hm = height / 100.0 // 身長をmにする
        var bmi = weight / math.Pow(hm, 2) // BMIの計算
        var bestW = math.Pow(hm, 2) * 22.0 // 適正体重の計算
        var per = weight / bestW * 100 // 肥満度の計算

        // 結果表示
        fmt.Printf("BMI = %f, 適正体重 = %f, 肥満度 = %.0f\n", bmi, bestW, per)
}

やりたいことがわかりやすくて見やすいですねぇ。

では、実際に動かしてみましょう。

$ go build bmi4.go
$ ./bmi4
身長を入力してください:a
数字で入力してください!
身長を入力してください:a
数字で入力してください!
身長を入力してください:a
数字で入力してください!
身長を入力してください:a
数字で入力してください!
身長を入力してください:a
数字で入力してください!
ちゃんと入力してくれないので処理終了しますね。
$
$
$
$ ./bmi4
身長を入力してください:a
数字で入力してください!
身長を入力してください:a
数字で入力してください!
身長を入力してください:a
数字で入力してください!
身長を入力してください:a
数字で入力してください!
身長を入力してください:178
体重を入力してください:b
数字で入力してください!
体重を入力してください:b
数字で入力してください!
体重を入力してください:b
数字で入力してください!
体重を入力してください:b
数字で入力してください!
体重を入力してください:b
数字で入力してください!
ちゃんと入力してくれないので処理終了しますね。
$
$
$
$ ./bmi4
身長を入力してください:a
数字で入力してください!
身長を入力してください:a
数字で入力してください!
身長を入力してください:a
数字で入力してください!
身長を入力してください:a
数字で入力してください!
身長を入力してください:178
体重を入力してください:b
数字で入力してください!
体重を入力してください:b
数字で入力してください!
体重を入力してください:b
数字で入力してください!
体重を入力してください:b
数字で入力してください!
体重を入力してください:98
BMI = 30.930438, 適正体重 = 69.704800, 肥満度 = 141

うん!うまく動いた!成功ですね。

今回は、関数化してみようと題して、Goの関数化のやり方について勉強をしました。
次回は、途中でぽろっと話した「ポインタ」について勉強したいと思います。

ではまた次回!

■たかしの懺悔室
僕が適当にGoを勉強しているものだから、前回までエラー判定用の変数をerr1, err2としていましたよね。
これね、色々調べてみると、:=の使い方を間違えていることがわかりました。

// これは変数宣言+値代入
err := 0

// これは値代入
err = 1

ということらしいです。

つまり、わざわざ

err1 := 0
err2 := 1

なんてことをしないで

err := 0
err = 1

こうしていればよかったのです。

とはいえ、今回はチョンプロなので:=でもOKですが、今後のことも考えると

// エラー判定用
var err int

// 関数呼び出し
err = GetNum(&height, "身長", 5)

// エラー判定
if err != 0 {
}

このように書いたほうがわかりやすいですよね。
今後注意しよーっと。

Goの勉強 肥満度判定BMI計算をしてみよう 改造編 ~for文を使ってエラー処理してみよう~

こんばんわ。たかしです。

さて、この前作成したBMI計算のソースコードを、for文使って正しい値が入力されないともう一回入力を促すつくりに変えてしまいましょう。

※今日からブログの書き方を「はてな記法」に変えました。出力結果や、Goの中身が読みやすくなっているかと思います。(そして、今までと違ってめちゃくちゃ書きやすいです。笑)

前回の記事はこちらです。
bokunomemocho.hatenablog.com


for文って何?

そういえば、前回さらっとif文の説明をせずに使ってしまいましたが、for文くらいは使い方の勉強の意味でまとめておきます。

for文についての説明は、Go言語のマニュアルを参考にしました。
golang.org

 

まず、for文というのは、特定の条件まで処理を繰り返したいときに利用するものです。構造はこのようになります。

①初期化、終了条件、計算式の構造

for init; condition; post { }

利用例

for i := 0 ; i < 5 ; i++{
    num++
}

②終了条件の構造

for condition { }

利用例

for _, value := range array {
   num += value
}

③無限ループ

for { }

利用例

for {
   num++
   if num > 10 {
        break
    }
}

 
利用条件に応じて①~③のパターンから選択して使っていくようですね。
あと、調べていて知ったのですが、Go言語にはwhileは存在しないようです。ループはforで書くんですって。
  

早速コードを改造しよう!

今のソースコードには、標準入力から入力された値が「a」などでもエラー判定はしてくれるけれども、再入力できるわけでもなくそのまま進んでしまうという問題点がありましたね。これを正しい値が入力されるまで処理を継続させましょうか。

まずは、身長だけに設定を入れてみましょう。

// 身長を入力
for {
    fmt.Printf("身長を入力してください:")
    _, err1 := fmt.Scan(&height) 

    // エラー判定
    if err1 != nil {
        fmt.Print("数字で入力してください!\n")
    }else{
        // 正しく入力されたらループを抜ける
        break
    }
} 

身長に変な値が入力されたら再入力を行わせて、正しく入力されたらbreakして処理を抜けるようにしました。

では、実行してみましょう。

$ go build bmi3.go
$ ./bmi3
身長を入力してください:a
数字で入力してください!
身長を入力してください:a
数字で入力してください!
身長を入力してください:178
体重を入力してください:98
BMI = 30.930438, 適正体重 = 69.704800, 肥満度 = 141 

身長が正しく入力されるまでしつこく入力を迫るプログラムになっていますね。

このプログラムだと、正しく入力されるまで処理が終了しないという問題があるので、例えば身長を5回正しく入力しなかったらエラー終了するようにしてみましょうか。
まず、exitを使うので取り込むパッケージに"os"を増やします。

// パッケージ取り込み
import (
    "fmt"
    "math"
    "os"

続いて、for文の中で5回処理を間違えたら異常終了するようにします。

count := 0

// 身長を入力
for {
    fmt.Printf("身長を入力してください:")
    _, err1 := fmt.Scan(&height)

    // エラー判定
    if err1 != nil {
        fmt.Print("数字で入力してください!\n")
        count++
        if count == 5 {
            fmt.Print("ちゃんと入力してくれないので処理終了しますね>。\n")
            os.Exit(1)
        }
    }else{
        // 正しく入力されたらループを抜ける
        break
    }
}

さあ、実行してみましょう!

$ go build bmi3.go
$ ./bmi3
身長を入力してください:a
数字で入力してください!
身長を入力してください:a
数字で入力してください!
身長を入力してください:a
数字で入力してください!
身長を入力してください:a
数字で入力してください!
身長を入力してください:a
数字で入力してください!
ちゃんと入力してくれないので処理終了しますね。 

おー!なんて冷たい!笑
クソLINE送り付けてしまったときの女子の返信のような文字が表示されましたね!笑

では、体重にも適用させましょうか。

count = 0
// 体重を入力
for {
        fmt.Printf("体重を入力してください:")
        _, err2 := fmt.Scan(&weight)

        // エラー判定
        if err2 != nil {
            fmt.Print("数字で入力してください!\n")
            count++
            if count == 5 {
                fmt.Print("ちゃんと入力してくれないので処理終了しますね>。\n")
                os.Exit(1)
            }
        }else{
            // 正しく入力されたらループを抜ける
            break
    }
}

さあ、実行してみましょう!

$ go build bmi3.go
$ ./bmi3
身長を入力してください:a
数字で入力してください!
身長を入力してください:a
数字で入力してください!
身長を入力してください:a
数字で入力してください!
身長を入力してください:a
数字で入力してください!
身長を入力してください:178
体重を入力してください:b
数字で入力してください!
体重を入力してください:b
数字で入力してください!
体重を入力してください:b
数字で入力してください!
体重を入力してください:b
数字で入力してください!
体重を入力してください:98
BMI = 30.930438, 適正体重 = 69.704800, 肥満度 = 141
$
$
$ ./bmi3
身長を入力してください:a
数字で入力してください!
身長を入力してください:a
数字で入力してください!
身長を入力してください:a
数字で入力してください!
身長を入力してください:a
数字で入力してください!
身長を入力してください:178
体重を入力してください:b
数字で入力してください!
体重を入力してください:b
数字で入力してください!
体重を入力してください:b
数字で入力してください!
体重を入力してください:b
数字で入力してください!
体重を入力してください:b
数字で入力してください!
ちゃんと入力してくれないので処理終了しますね。

すばらしい!身長も体重も4回までは許容して、5回間違えるとちゃんと終了するようになりました。

今回はfor文の使い方を学ぶために、for文の解説、そして実際の利用例としてBMI計算のソースコードでfor文を使ってみました。

次回は、for文などを使って長くなってしまったmainの中身を関数化してみましょう編でもやろうかと思います。
ではまたお会いしましょう。

ここまでのソースコード

今回までのソースコードはこんな感じになっています。
はてな記法に変えたので、今後はちゃんとソースも載せるようにしますね。

// パッケージ名
package main

// パッケージ取り込み
import (
        "fmt"
        "math"
        "os"
)

// 体重と身長を指定
var weight float64
var height float64

// mainの定義
func main() {
        count := 0
        // 身長を入力
        for {
                fmt.Printf("身長を入力してください:")
                _, err1 := fmt.Scan(&height)

                // エラー判定
                if err1 != nil {
                    fmt.Print("数字で入力してください!\n")
                    count++
                    if count == 5 {
                        fmt.Print("ちゃんと入力してくれないので処理終了しますね 。\n")
                        os.Exit(1)
                    }
                }else{
                    // 正しく入力されたらループを抜ける
                    break
            }
        }

        count = 0
        // 体重を入力
        for {
                fmt.Printf("体重を入力してください:")
                _, err2 := fmt.Scan(&weight)

                // エラー判定
                if err2 != nil {
                    fmt.Print("数字で入力してください!\n")
                    count++
                    if count == 5 {
                        fmt.Print("ちゃんと入力してくれないので処理終了しますね 。\n")
                        os.Exit(1)
                    }
                }else{
                    // 正しく入力されたらループを抜ける
                    break
            }
        }

        var hm = height / 100.0 // 身長をmにする
        var bmi = weight / math.Pow(hm, 2) // BMIの計算
        var bestW = math.Pow(hm, 2) * 22.0 // 適正体重の計算
        var per = weight / bestW * 100 // 肥満度の計算

        // 結果表示
        fmt.Printf("BMI = %f, 適正体重 = %f, 肥満度 = %.0f\n", bmi, bestW, per)
}

Goの勉強 肥満度判定BMI計算をしてみよう 改造編 ~if文を使ってエラー判定してみよう~

こんばんわ。たかしです。

 

前回、標準入力から身長・体重を取り込んでそこからBMIを求めました。

今回は、数値を入力してほしいのに文字とかを入力された場合のエラー判定を入れてみます。

 

前回の記事はこちらです。

bokunomemocho.hatenablog.com

 

 

エラー判定してみよう!

さあ、前回のソース。数値以外を入力するとどうなるかというと

$ ./bmi
身長を入力してください:a
体重を入力してください:78
BMI = +Inf, 適正体重 = 0.000000, 肥満度 = +Inf

うーむ。やはり変な出力になってしまいますね。

 

エラー反映入れないと、求めたいことが求められないので、早速エラー判定入れてみましょう。

 

まずは、使用している「fmt.Scan」について

func Scan(a ...interface{}) (n int, err os.Error)

なるほど、読み込んだ結果を、nというint型の数値とerrというエラー型で返してくれるようだ。

つまり、入力値がおかしければ、「errの中に何かしら設定される=nilじゃなくなる」ということ。

それをif文で拾ってあげれば良い。

身長を例にするとこうなる。

// 身長を入力
fmt.Printf("身長を入力してください:")
n, err := fmt.Scan(&height)

 

// エラー判定
if err != nil {
    fmt.Println(err)
}

「fmt.Println」にerrを入れてあげると、エラーの内容を表示してくれるようだ。

 

身長・体重それぞれにエラー処理を入れるとこうなる。

// 身長を入力
fmt.Printf("身長を入力してください:")
_, err1 := fmt.Scan(&height)

 

// エラー判定
if err1 != nil {
    fmt.Println(err1)
}

 

// 体重を入力
fmt.Printf("体重を入力してください:")
_, err2 := fmt.Scan(&weight)

 

// エラー判定
if err2 != nil {
    fmt.Println(err2)
}

一つずつ説明していくと

_, err1 := fmt.Scan(&height) 

_, err2 := fmt.Scan(&weight)

何故、「n, err」ではなく「_, err」にしたかというと、今回「err」の結果を出力したいだけで「n」は使用しないようにしました。そうするとコンパイルしたときこんなこと言われました。

# command-line-arguments
./bmi2.go:18:2: n declared and not used 

そう。「nを宣言しておいて使ってないぞハゲ」と怒られたわけです。

その対策として、「n, err」ではなく「_, err」として「n」に入れる値を捨てました。

 

そして、「err1」「err2」にした理由は、「_, err」にしたらこう言われたからです。

# command-line-arguments
./bmi2.go:26:9: no new variables on left side of := 

つまり、「体重の入力判定に使っているerrって変数が新しくないぞチョビヒゲ」と怒られたわけです。

errという値を使いまわすことはできないようなので、「err1」「err2」としました。

 

さて、完成したファイルをコンパイルして実行してみましょう。

$ go build bmi2.go
$ ./bmi2
身長を入力してください:a
strconv.ParseFloat: parsing "": invalid syntax
体重を入力してください:b
strconv.ParseFloat: parsing "": invalid syntax
BMI = NaN, 適正体重 = 0.000000, 肥満度 = NaN

うん。見事にエラーを判定していますね。大成功!

 

ここまで来たら何をしたいかというと、「身長・体重それぞれにちゃんと正しい値が入力されたらBMIなどを計算させる」というふうにしたいですよね。

 

というわけで!次回は「for文を使ってエラー判定してみよう」編になります。

 

今回は、if文を使ってみよう編でした。

またお会いしましょう。

Goの勉強 肥満度判定BMI計算をしてみよう 改造編

こんばんわ。たかしです。

 

昨日アップした記事のソースを、キーボードから入力された値をもとに計算するような改造をしてみたいと思います。

 

昨日の記事はこちらです。

bokunomemocho.hatenablog.com

 

「Go 入力」で調べてみたら色々記事見つかりましたが、今回はこちらの記事を参考にしたいと思います。

qiita.com

 

 

いざ、改造!

さて、今回の目的は、身長と体重を標準入力から設定することです。

fmt.Scan(&a)

というのが使えるらしいので、早速使ってみましょう。

 

あと、変数宣言で使用している「const」ですが、こいつでは標準入力から値を設定できないようだ。

あと、変数宣言するときに、ちゃんと型も指定してあげないといけないらしい。

なんで急にそんな真面目になっちゃうんGoちゃん。

というわけで、このように実装をしてみた。

// 体重と身長を指定
var weight float64
var height float64

 

そして、数値を入力するところはこう。

// 体重と身長を入力
fmt.Printf("身長を入力してください:")
fmt.Scan(&height)

fmt.Printf("体重を入力してください:")
fmt.Scan(&weight)

個人的に「身長、体重」という順番がしっくりくるものですから、順番入れ替えました。

 

ソースの全体はこうなりました。

// パッケージ名
package main

 

// パッケージ取り込み
import (
"fmt"
"math"
)

 

// 体重と身長を指定
var weight float64
var height float64

 

// mainの定義
func main(){

    // 体重と身長を入力
    fmt.Printf("身長を入力してください:")
    fmt.Scan(&height)

    fmt.Printf("体重を入力してください:")
    fmt.Scan(&weight)

    var hm = height / 100.0 // 身長をmにする
    var bmi = weight / math.Pow(hm, 2) // BMIの計算
    var bestW = math.Pow(hm, 2) * 22.0 // 適正体重の計算
    var per = weight / bestW * 100 // 肥満度の計算

    // 結果表示
    fmt.Printf("BMI = %f, 適正体重 = %f, 肥満度 = %.0f\n", bmi, bestW, per)

}

 

では、ビルドして実行してみましょう。

$ go build bmi.go
$ ./bmi
身長を入力してください:178
体重を入力してください:98
BMI = 30.930438, 適正体重 = 69.704800, 肥満度 = 141

 

おー、できたできた。

あとは、変な値が設定されたときにはじくように修正を入れたいですね。

ただ、これも記事になりそうなので、別途アップします。

 

今回はいったんここまで。

また今度。

Goの勉強 肥満度判定BMI計算をしてみよう編

こんばんわ。たかしです。

 

さて、今日もGo言語の勉強します。

参考にしたのは、前回に続いてこちらです。

news.mynavi.jp

 

 

肥満度判定BMI計算をしてみよう

これもまた、プログラミング言語を勉強するとき、最初にやるやつですね。

BMIの計算、掛けたり割ったりの計算が入るからちょうど良いのでしょうね。

 

参考先のページによると、BMIの計算式はこちらの通りです。

BMI = 体重kg ÷ (身長m × 身長m)
適正体重 = (身長m × 身長m) × 22
肥満度 = 体重 / 適正体重 × 100 

わあ!BMI以外に肥満度まで求めるんですね!

肥満かどうかはその人の筋肉量によるやろがい!なんて野暮な突っ込みは言わず、今回はこちらの条件をプログラムに落としていくようです。

 

viでファイルを作成します。

$ vi bmi.go

 

まずは、パッケージ名の指定とパッケージの取り込みです。

今回、計算結果の出力でfmtパッケージ、計算するのにmathパッケージを使用するのでこうなります。

// パッケージ名
package main

// パッケージ取り込み
import (
"fmt"
"math"
)

パッケージを複数取り込むときは、import()で囲うんですね。

 

続いて、変数宣言。

// 体重と身長を指定
const weight = 98
const height = 178

僕はC言語がメインなので、型を指定しない書き方に不安を覚えますが(笑)、最近の言語はこのように変数名を宣言してそこに値を入れると勝手にそれに合わせた型になってくれるので便利です。

あと、main関数の中で宣言しないんですね。ここら辺はおいおいわかっていくのかも。今回は参考先の書き方に合わせます。

ちなみに、身長と体重は中肉中背なわたくしの数値でございます。笑

 

そして、メイン部分の定義。

// mainの定義
func main(){
var hm = height / 100.0 // 身長をmにする
var bmi = weight / math.Pow(hm, 2) // BMIの計算
var bestW = math.Pow(hm, 2) * 22.0 // 適正体重の計算
var per = weight / bestW * 100 // 肥満度の計算

// 結果表示
fmt.Printf("BMI = %f, 適正体重 = %f, 肥満度 = %.0f\n", bmi, bestW, per)
}

参考先では、適正体重の出力はしていなかったですが、せっかくなので表示しちゃいましょう。

 

完成したソースはこんな感じ。

// パッケージ名
package main

// パッケージ取り込み
import (
"fmt"
"math"
)

// 体重と身長を指定
const weight = 98
const height = 178

// mainの定義
func main(){
var hm = height / 100.0 // 身長をmにする
var bmi = weight / math.Pow(hm, 2) // BMIの計算
var bestW = math.Pow(hm, 2) * 22.0 // 適正体重の計算
var per = weight / bestW * 100 // 肥満度の計算

// 結果表示
fmt.Printf("BMI = %f, 適正体重 = %f, 肥満度 = %.0f\n", bmi, bestW, per)
}

 

さあ、コンパイルして実行してみましょう。

$ go build bmi.go
$ ./bmi
BMI = 30.930438, 適正体重 = 69.704800, 肥満度 = 141

 

BMIたけーーーーー

肥満度141%は面白い笑

 

と、こんな感じで出力されました。

 

体重と身長はプログラム直打ちではなく、プログラム実行してコマンドで入力したいですよね。そこらへんはまた後日調べてみます。

 

今日はここまで!

こんな小さなことから、日々積み重ねていきましょう!

 

ではまた。

Goの勉強 Hello World編

こんばんわ。たかしです。

 

今日もGoの勉強です。

時間が取れず、めちゃくちゃ久しぶりにやっています。

 

とはいえ、今日ももう時間がないので…プログラミングを勉強するときの基本「Hello World」を表示してみよう!をやります。

 

プログラム書いたことある人はご存知かと思いますが、理由は知らないんですけど、プログラミング言語勉強するときって必ず「Hello World」と表示させるところから勉強が始まるんです。

まあ、何か文字を出力させるのが一番簡単なことだし、「あ…ここここんにちは…」なんてコミュ障丸出しの出力だと気持ち悪いので、ここは先人に倣って「Hello World」を表示させて今日は寝ようかと思います。

 

というわけで、今日はいつもと違う記事を参考に進めたいと思います。

参考にしたのはこちらのページです。

news.mynavi.jp

 

さあ、早速進めましょう。

 

Hello World!!

プログラムはサクラエディタなり好きなエディタで書けばいいかと思いますが、今日はチョンプロなのと、いちいち書いたソースをAWSにアップするのは面倒なので、viコマンド使って書いて行っちゃいます。

$ vi hello.go

Go言語のファイル拡張子は「.go」らしい。

 

まずは、パッケージ名を指定するようだ。

package main 

 

続いて、文字出力するのに必要なprintf関数を利用するために「fmtパッケージ」を指定するようだ。

 import "fmt"

※fmtは"(ダブルクォート)で囲うみたいね。

 

そして最後にmain関数を定義して文字出力を行う。

文字の出力にはfmt.Printf関数を使うとのこと。

func main(){
// 文字出力
fmt.Printf("Hello World!!\n")

 

さあ、これで完成。完成したソースはこちら。

// パッケージ名
package main

 

// fmtパッケージを取り込む
import "fmt"

 

// main関数
func main(){
    // 文字出力
    fmt.Printf("Hello World!!\n")

 

保存して、いざ実行!

$ go run hello.go
Hello World!! 

 

おー!表示された!

 

ところで、Goってコンパイルしなくても動くんですね。

なんて思ったら、本格的に動かすにはやはりコンパイルが必要なようだ。デバッグするときに「go run」を使うのかね。そこらへんはおいおい調べていきますかね。

 

先ほど作成した「hello.go」をコンパイルして実行するのはこうします。

$ go build hello.go
$ ./hello
Hello World!! 

 

ここら辺は、C言語に似ている感じかな。

 

今日教材にしたページには他にも色々あったので、明日また続きやろうかな。

今日はここまで。おやすみなさい。