2020年2月6日木曜日

開発環境

入門Goプログラミング (Nathan Youngman(著)、Roger Peppé(著)、吉川 邦夫(監修, 翻訳)、翔泳社)のUNIT 5(状態と振る舞い)、LESSON 22(Goにはクラスがないけれど)の練習問題2の解答を求めてみる。

コード

package main

import (
 "fmt"
 "math"
)

type coordinate struct {
 d, m, s float64
 h       rune
}

func (c coordinate) decimal() float64 {
 var sign float64
 switch c.h {
 case 'N', 'E', 'n', 'e':
  sign = 1.0
 default:
  sign = -1.0
 }
 return sign * (c.d + c.m/60 + c.s/3600)
}

type location struct {
 lat, long float64
}

func newLocation(lat, log coordinate) location {
 return location{lat.decimal(), log.decimal()}
}

type world struct {
 radius float64
}

func (w world) distance(p1, p2 location) float64 {
 s1, c1 := math.Sincos(rad(p1.lat))
 s2, c2 := math.Sincos(rad(p2.lat))
 clong := math.Cos(rad(p1.long - p2.long))
 return w.radius * math.Acos(s1*s2+c1*c2*clong)
}

func rad(deg float64) float64 {
 return deg * math.Pi / 180
}

func main() {
 地球 := world{radius: 6371.0}
 ロンドン := newLocation(
  coordinate{51, 30, 0, 'n'},
  coordinate{0, 8, 0, 'w'},
 )
 パリ := newLocation(
  coordinate{48, 51, 0, 'n'},
  coordinate{2, 21, 0, 'e'},
 )
 fmt.Printf(
  "英国のロンドンからフランスのパリまでの距離: %.2fkm\n",
  地球.distance(ロンドン, パリ))
 火星 := world{radius: 3389.5}
 シャープ山 := newLocation(
  coordinate{5, 4, 48, 's'},
  coordinate{137, 51, 0, 'e'},
 )
 オリンポス山 := newLocation(
  coordinate{13, 39, 0, 'n'},
  coordinate{226, 12, 0, 'e'},
 )
 fmt.Printf(
  "火星のシャープ山(アイオリス山)からオリンポス山のままでの距離: %.2fkm\n",
  火星.distance(シャープ山, オリンポス山))
}

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

% go run ./distance.go
英国のロンドンからフランスのパリまでの距離: 343.62km
火星のシャープ山(アイオリス山)からオリンポス山のままでの距離: 5300.57km
%

0 コメント:

コメントを投稿