開発環境
- macOS Catalina - Apple (OS)
- Emacs (Text Editor)
- Windows 10 Pro (OS)
- Visual Studio Code (Text Editor)
- Go (プログラミング言語)
入門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 コメント:
コメントを投稿