僕のメモ帳

僕のメモ帳です。

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文を使ってみよう編でした。

またお会いしましょう。