Go超入門コース#15 実践

はじめに

こんにちは。キノコードです。
「Go超入門コース#15 実践」について説明します。

実践

実践編として、テスト結果を判定するプログラムを作ってみましょう。
どのようなプログラムを書くか説明します。
まず、Studentという構造体を作ります。
構造体のStudentには、生徒の名前を代入する「name」のフィールドを定義します。
そして、構造体のStudentに関連づけるメソッドは2つです。
1つのメソッドは、5教科の平均点を計算するcalAvgメソッド。
ちなみに、calは計算するという意味のcalculate、avgは、平均のaverageを省略する時にプログラミングでよく使う文字です。
もう1つメソッドは、平均点以上だったら合格という意味の”passed”を表示、平均点以下なら不合格という意味の”failed”を表示させるjudgeメソッドを定義します。
早速、ソースコードをみていきましょう。

package main

import "fmt"

type Student struct {
        name string
}

func (s Student) calAvg(data []float64) (avgResult float64) {
        sum := 0.0
        for i := 0; i < len(data); i++ {
                sum += data[i]
        }
        avgResult = sum / float64(len(data))
        return
}

func (s Student) judge(avg float64) (judgeResult string) {
        if avg >= 60 {
                judgeResult = "passed"
        } else {
                judgeResult = "failed"
        }
        return
}

func main() {
        a001 := Student{"sato"}
        data := []float64{70, 65, 50, 90, 30}
        var avg float64 = a001.calAvg(data)
        result := a001.judge(avg)
        fmt.Println(avg)
        fmt.Println(a001.name + " " + result)
}

まずtypeと書いて、次に構造体名を書きます。
今回はStudentというクラス名なので、Student。
nameというフィールドを定義をしましょう。
これで構造体の定義は終わりです。
次に、5教科の平均点を計算するcalAvgメソッドを定義します。
calAvgメソッドには、5教科の点数が格納されている配列を渡します。
引数名はdataとしましょう。
戻り値は平均点なので、戻り値をavgResult、データ型をfloatとしましょう。
calAvgメソッド内に、sumという変数を定義をして、0.0を代入。
レッスン11の繰り返しで説明しましたが、配列を使ったfor文を記述していきましょう。
また、それをレッスン09の演算子で説明した、配列の値を複合代入演算子を使って足し上げます。
そして、合計を、配列の要素数で割って平均を算出し、avgResultという変数に代入します。
要素数を求めるには、len関数を使えばよいです。len関数の丸括弧の中に配列のdataを記述すればよいです。
len丸括弧、dataの結果は5です。5は整数型です。一方、割られる数のsumは小数点型です。
割る数と割られる数のデータ型が違う場合は、エラーになります。
len丸括弧dataを小数点型に変換しましょう。float64で括ってあげればオッケーです。
これで、平均が算出されました。
算出した値をreturnで返します。
returnのあとにavgResultは省略します。
最後に、テスト結果を判定するjudgeメソッドを作ってみましょう。
judgeメソッドに平均点を渡しましょう。引数名はavgとします。
戻り値は、その平均点が60点以上ならpassed、それ以外ならfailedが返ってくるようにしたいので、引数のあとにresult、データ型のstringを記述しましょう。
if文で、その平均点が60点以上ならpassed、それ以外ならfailedが、resultという変数に格納されるようにします。
これもreturnで返します。ここでもresultを省略しましょう。
これで、judgeメソッドの完成です。
以上で、構造体とメソッドの定義は終わりです。
それでは、構造体を初期化しましょう。
aという学級の出席番号001番の人は、satoさんだとします。
したがって、変数名をa001とします。
「sato」を渡して初期化をします。
そして、dataという変数に、配列を代入。配列には、70, 65, 50, 90, 30という5科目の点数を記述します。
calAvgメソッドに配列を渡して平均点を算出します。
returnで平均点が返ってくるので、これをavgという変数に格納します。
そのavgをjudgeメソッドに渡すと、passedかfailedが返ってくるはずです。
Printlnで、平均点のavg、nameと判定結果が代入されているresultを表示させてみましょう。
実行してみます
名前のsato、61という平均点、passedが返ってきました。

package main

import "fmt"

type Student struct {
        name string
}

func (s Student) calAvg(data []float64) (avgResult float64) {
        sum := 0.0
        for i := 0; i < len(data); i++ {
                sum += data[i]
        }
        avgResult = sum / float64(len(data))
        return
}

func (s Student) judge(avg float64) (judgeResult string) {
        if avg >= 60 {
                judgeResult = "passed"
        } else {
                judgeResult = "failed"
        }
        return
}

func main() {
        a001 := Student{"sato"}
        data := []float64{70, 65, 50, 10, 30}
        var avg float64 = a001.calAvg(data)
        result := a001.judge(avg)
        fmt.Println(avg)
        fmt.Println(a001.name + " " + result)
}

次に配列の中の90を10に変更してみましょう。
平均が45になるので、failedが表示されるはずです。
実行してみます。
45点と名前とfailedが返ってきました。
これでGoの超入門コースはおわりです。お疲れ様です。