2019年1月20日日曜日

開発環境

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES) (Alan A.A. Donovan(著)、Brian W. Kernighan(著)、柴田 芳樹(翻訳)、丸善出版)の第2章(プログラム構造)、2.6(パッケージとファイル)、2.6.1(インポート)、練習問題2.2の解答を求めてみる。

コード

package main

import (
 "bufio"
 "fmt"
 "os"
 "strconv"
 "プログラミング言語Go/ch2/tempconv"
)

func main() {
 if len(os.Args) == 1 {
  input := bufio.NewScanner(os.Stdin)
  for input.Scan() {
   p(input.Text())
  }
 } else {
  for _, arg := range os.Args[1:] {
   p(arg)
  }
 }
}

type Feet float64
type Meter float64

func (f Feet) String() string  { return fmt.Sprintf("%gft", f) }
func (m Meter) String() string { return fmt.Sprintf("%gm", m) }

func FeetToMeter(f Feet) Meter { return Meter(f * 0.3048) }
func MeterToFeet(m Meter) Feet { return Feet(m / 0.3048) }

type Pond float64
type Kilogram float64

func (p Pond) String() string     { return fmt.Sprintf("%glb", p) }
func (k Kilogram) String() string { return fmt.Sprintf("%gkg", k) }

func PondToKilogram(p Pond) Kilogram { return Kilogram(p * 0.45359237) }
func KilogramToPond(k Kilogram) Pond { return Pond(k / 0.45359237) }

func p(arg string) {
 t, err := strconv.ParseFloat(arg, 64)
 if err != nil {
  fmt.Fprintf(os.Stderr, "cf: %v\n", err)
  os.Exit(1)
 }
 f := tempconv.Fahrenheit(t)
 c := tempconv.Celsius(t)
 fmt.Printf("%s = %s, %s = %s\n",
  f, tempconv.FToC(f), c, tempconv.CToF(c))

 feet := Feet(t)
 m := Meter(t)
 fmt.Printf("%s = %s, %s = %s\n",
  feet, FeetToMeter(feet), m, MeterToFeet(m))

 p := Pond(t)
 k := Kilogram(t)
 fmt.Printf("%s = %s, %s = %s\n",
  p, PondToKilogram(p), k, KilogramToPond(k))
}

入出力結果(cmd(コマンドプロンプト)、Terminal)

$ go run sample2.go 0
0°F = -17.77777777777778℃, 0℃ = 32°F
0ft = 0m, 0m = 0ft
0lb = 0kg, 0kg = 0lb
$ go run sample2.go 0 1 5 10 100
0°F = -17.77777777777778℃, 0℃ = 32°F
0ft = 0m, 0m = 0ft
0lb = 0kg, 0kg = 0lb
1°F = -17.22222222222222℃, 1℃ = 33.8°F
1ft = 0.3048m, 1m = 3.280839895013123ft
1lb = 0.45359237kg, 1kg = 2.2046226218487757lb
5°F = -15℃, 5℃ = 41°F
5ft = 1.524m, 5m = 16.404199475065617ft
5lb = 2.2679618500000003kg, 5kg = 11.023113109243878lb
10°F = -12.222222222222221℃, 10℃ = 50°F
10ft = 3.048m, 10m = 32.808398950131235ft
10lb = 4.535923700000001kg, 10kg = 22.046226218487757lb
100°F = 37.77777777777778℃, 100℃ = 212°F
100ft = 30.48m, 100m = 328.0839895013123ft
100lb = 45.359237kg, 100kg = 220.46226218487757lb
$ go run sample2.go
0
0°F = -17.77777777777778℃, 0℃ = 32°F
0ft = 0m, 0m = 0ft
0lb = 0kg, 0kg = 0lb
1
1°F = -17.22222222222222℃, 1℃ = 33.8°F
1ft = 0.3048m, 1m = 3.280839895013123ft
1lb = 0.45359237kg, 1kg = 2.2046226218487757lb
5
5°F = -15℃, 5℃ = 41°F
5ft = 1.524m, 5m = 16.404199475065617ft
5lb = 2.2679618500000003kg, 5kg = 11.023113109243878lb
10
10°F = -12.222222222222221℃, 10℃ = 50°F
10ft = 3.048m, 10m = 32.808398950131235ft
10lb = 4.535923700000001kg, 10kg = 22.046226218487757lb
100
100°F = 37.77777777777778℃, 100℃ = 212°F
100ft = 30.48m, 100m = 328.0839895013123ft
100lb = 45.359237kg, 100kg = 220.46226218487757lb
$ go run sample2.go -10
-10°F = -23.333333333333332℃, -10℃ = 14°F
-10ft = -3.048m, -10m = -32.808398950131235ft
-10lb = -4.535923700000001kg, -10kg = -22.046226218487757lb
$ go run sample2.go a
cf: strconv.ParseFloat: parsing "a": invalid syntax
exit status 1
$ go run sample2.go
a
cf: strconv.ParseFloat: parsing "a": invalid syntax
exit status 1
$ 

0 コメント:

コメントを投稿