2020年4月25日土曜日

開発環境

入門Goプログラミング (Nathan Youngman(著)、Roger Peppé(著)、吉川 邦夫(監修, 翻訳)、翔泳社)のUNIT 3(関数とメソッド)、LESSON 15(チャレンジ:温度テーブル)の解答を求めてみる。

コード

package main

import (
 "fmt"
 "strings"
)

type celsius float64
type fahrenheit float64

func (c celsius) fahrenheit() fahrenheit {
 return fahrenheit(c*9/5 + 32)
}
func (f fahrenheit) celsius() celsius {
 return celsius((f - 32) * 5 / 9)
}

type getRow func(row int) (string, string)

func drawTable(h1, h2 string, rows int, gr getRow) {
 width := 17
 fmt.Println(strings.Repeat("=", width))
 fmt.Printf("|   %v   |   %v   |\n", h1, h2)
 fmt.Println(strings.Repeat("=", width))
 for row := 0; row < rows; row++ {
  col1, col2 := gr(row)
  fmt.Printf("|%7v|%7v|\n", col1, col2)
 }
 fmt.Println(strings.Repeat("=", width))
}

func main() {
 drawTable("℃", "℉", (100+40)/5+1,
  func(row int) (string, string) {
   c := celsius(-40 + row*5)
   col1 := fmt.Sprintf("%.2f", c)
   col2 := fmt.Sprintf("%.2f", c.fahrenheit())
   return col1, col2

  })
 drawTable("℉", "℃", (100+40)/5+1,
  func(row int) (string, string) {
   f := fahrenheit(-40 + row*5)
   col1 := fmt.Sprintf("%.2f", f)
   col2 := fmt.Sprintf("%.2f", f.celsius())
   return col1, col2
  })
}

入出力結果(Zsh、PowerShell、Terminal)

 % go run ./temperature.go
=================
|   ℃   |   ℉   |
=================
| -40.00| -40.00|
| -35.00| -31.00|
| -30.00| -22.00|
| -25.00| -13.00|
| -20.00|  -4.00|
| -15.00|   5.00|
| -10.00|  14.00|
|  -5.00|  23.00|
|   0.00|  32.00|
|   5.00|  41.00|
|  10.00|  50.00|
|  15.00|  59.00|
|  20.00|  68.00|
|  25.00|  77.00|
|  30.00|  86.00|
|  35.00|  95.00|
|  40.00| 104.00|
|  45.00| 113.00|
|  50.00| 122.00|
|  55.00| 131.00|
|  60.00| 140.00|
|  65.00| 149.00|
|  70.00| 158.00|
|  75.00| 167.00|
|  80.00| 176.00|
|  85.00| 185.00|
|  90.00| 194.00|
|  95.00| 203.00|
| 100.00| 212.00|
=================
=================
|   ℉   |   ℃   |
=================
| -40.00| -40.00|
| -35.00| -37.22|
| -30.00| -34.44|
| -25.00| -31.67|
| -20.00| -28.89|
| -15.00| -26.11|
| -10.00| -23.33|
|  -5.00| -20.56|
|   0.00| -17.78|
|   5.00| -15.00|
|  10.00| -12.22|
|  15.00|  -9.44|
|  20.00|  -6.67|
|  25.00|  -3.89|
|  30.00|  -1.11|
|  35.00|   1.67|
|  40.00|   4.44|
|  45.00|   7.22|
|  50.00|  10.00|
|  55.00|  12.78|
|  60.00|  15.56|
|  65.00|  18.33|
|  70.00|  21.11|
|  75.00|  23.89|
|  80.00|  26.67|
|  85.00|  29.44|
|  90.00|  32.22|
|  95.00|  35.00|
| 100.00|  37.78|
=================
%

0 コメント:

コメントを投稿