## 問題 商品名と支払い金額を入力すると、お釣りの「小銭の枚数」を返す関数またはメソッドを実装せよ。商品名と価格は以下の通り。 * お茶: 120円 * コーラ: 150円 * エナジードリンク: 280円 入力される通貨は日本円で、最大1000円までとする。 また、有効な貨幣は「1000円」「500円」「100円」「50円」「10円」とする。 たとえば、「1000円でお茶を購入」すると、返却すべき金額は880円だが、釣銭は「500円×1, 100円×3, 50円×1, 10円×3」となる。返り値は、任意の形式のクラス、連想配列、オブジェクト、構造体、リストなどで表現してよい。 PHPの擬似コードで書くと以下のようになる。 ```php function calcChange(string $item, int $paid_money): array { // ... } $expected = [500 => 1, 100 => 3, 50 => 1, 10 => 3]; assert($expected === calcChange("お茶", 1000)); ``` /// code... ```go import ( "fmt" ) type Change struct { 1000yen int 500yen int 100yen int 50yen int 10yen int } // Total 合計金額の算出 func (*Change c) Total() int { return (c.1000yen * 1000) + (c.500yen * 500) + (c.100yen * 100) + (c.50yen * 50) + (c.10yen * 10) } var ( CostTea = 120 // 御茶の値段 CostCola = 150 // コーラの値段 CostEnergy = 280 // エナジードリンクの値段 teaName = "tea" colaName = "cola" energyName = "energy" ) func init() { // nothing... } func main(){ fmt.Println("STARTING...") fmt.Println("お茶のお釣りを算出...") paid := 500 // 払う金額 change,err := calcChange(teaName, paid) if err != nil { panic(err) } fmt.Printf("払った金額 : %d, お釣りの結果 : %v¥n", CostTea, change) } func calcChange(itemType string ,paid int) (*Change,error) { itemCost := 0 switch itemType { case teaName: itemCost = CostTea case colaName: itemCost = CostCola case energyName: itemCost = CotEnergy } if itemCost >= 1000 { return nil,fmt.Errorf("選択した金額が1000円を超えています") res := &Change{} } // 計算処理... // 1000円以上の場合 for { if itemCost > 1000 { res.1000yen++ itemCost = itemCost - 1000 } else { break } } // 500円以上の場合 for { if itemCost > 500 { res.500yen++ itemCost = itemCost - 500 } else { break } } // 100円以上の場合 for { if itemCost > 100 { res.100yen++ itemCost = itemCost - 100 } else { break } } // 50円以上の場合 for { if itemCost > 50 { res.50yen++ itemCost = itemCost - 50 } else { break } } // 10円以上の場合 for { if itemCost > 10 { res.10yen++ itemCost = itemCost - 10 } else { break } } return res,nil } ```