標籤:
1 package main 2 3 import ( 4 "bufio" 5 "fmt" 6 "math" 7 "os" 8 "runtime" 9 )10 11 const result = "Polar radius=%.02f θ=%.02f° → Cartesian x=%.02f y=%.02f\n"12 13 var prompt = "Enter a radius and an angle (in degrees), e.g., 12.5 90, " +14 "or %s to quit."15 16 type polar struct {17 radius float6418 θ float6419 }20 21 type cartesian struct {22 x float6423 y float6424 }25 26 func init() {27 if runtime.GOOS == "windows" {28 prompt = fmt.Sprintf(prompt, "Ctrl+Z, Enter")29 } else { // Unix-like30 prompt = fmt.Sprintf(prompt, "Ctrl+D")31 }32 }33 34 func main() {35 questions := make(chan polar)36 defer close(questions)37 answers := createSolver(questions)38 defer close(answers)39 interact(questions, answers)40 }41 42 func createSolver(questions chan polar) chan cartesian {43 answers := make(chan cartesian)44 go func() {45 for {46 polarCoord := <-questions47 θ := polarCoord.θ * math.Pi / 180.0 // degrees to radians48 x := polarCoord.radius * math.Cos(θ)49 y := polarCoord.radius * math.Sin(θ)50 answers <- cartesian{x, y}51 }52 }()53 return answers54 }55 56 func interact(questions chan polar, answers chan cartesian) {57 reader := bufio.NewReader(os.Stdin)58 fmt.Println(prompt)59 for {60 fmt.Printf("Radius and angle: ")61 line, err := reader.ReadString(‘\n‘)62 if err != nil {63 break64 }65 var radius, θ float6466 if _, err := fmt.Sscanf(line, "%f %f", &radius, &θ); err != nil {67 fmt.Fprintln(os.Stderr, "invalid input")68 continue69 }70 questions <- polar{radius, θ}71 coord := <-answers72 fmt.Printf(result, radius, θ, coord.x, coord.y)73 }74 fmt.Println()75 }
go學習1