温度表

  • 编写一个温度转换表格程序:
  • 画两个表格:
    • 第一个表格有两列,第一列是摄氏度,第二列是华氏度。
      • 从 -40℃ 打印到 100℃,间隔为 5 ℃,并将摄氏度转化为华氏度。
    • 第二个表格就是第一个表格的两列互换一下,从华氏度转化为摄氏度。
  • 负责画线和填充值的代码都应该是可复用的。画表格和计算温度应该用不同的函数分别来实现。
  • 实现一个 drawTable 函数,它接受一个一等函数作为参数,调用该函数就可以绘制每一行的温度。传入不同的函数就可以产生不同的输出数据。

第三部分习题 - 图1

  1. package main
  2. import "fmt"
  3. type celsius float64
  4. func (c celsius) fahrenheit() fahrenheit {
  5. return fahrenheit((c * 9.0 / 5.0) + 32.0)
  6. }
  7. type fahrenheit float64
  8. func (f fahrenheit) celsius() celsius {
  9. return celsius((f - 32.0) * 5.0 / 9.0)
  10. }
  11. const (
  12. line = "======================="
  13. rowFormat = "| %8s | %8s |\n"
  14. numberFormat = "%.1f"
  15. )
  16. type getRowFn func(row int) (string, string)
  17. func drawTable(hdr1, hdr2 string, rows int, getRow getRowFn) {
  18. fmt.Println(line)
  19. fmt.Printf(rowFormat, hdr1, hdr2)
  20. fmt.Println(line)
  21. for row := 0; row < rows; row++ {
  22. cell1, cell2 := getRow(row)
  23. fmt.Printf(rowFormat, cell1, cell2)
  24. }
  25. fmt.Println(line)
  26. }
  27. func ctof(row int) (string, string) {
  28. c := celsius(row*5 - 40)
  29. f := c.fahrenheit()
  30. cell1 := fmt.Sprintf(numberFormat, c)
  31. cell2 := fmt.Sprintf(numberFormat, f)
  32. return cell1, cell2
  33. }
  34. func ftoc(row int) (string, string) {
  35. f := fahrenheit(row*5 - 40)
  36. c := f.celsius()
  37. cell1 := fmt.Sprintf(numberFormat, f)
  38. cell2 := fmt.Sprintf(numberFormat, c)
  39. return cell1, cell2
  40. }
  41. func main() {
  42. drawTable("ºC", "ºF", 29, ctof)
  43. fmt.Println()
  44. drawTable("ºF", "ºC", 29, ftoc)
  45. }