/* main.go - 计算器项目主程序 这是一个简单的命令行计算器,演示了 Go 语言的综合应用 */ package main import ( "bufio" "fmt" "os" "strings" "./calculator" ) func main() { // 创建计算器实例 calc := calculator.NewCalculator() // 创建输入扫描器 scanner := bufio.NewScanner(os.Stdin) // 显示欢迎信息 printWelcome() // 主循环 for { fmt.Print("> ") // 读取用户输入 if !scanner.Scan() { break } input := strings.TrimSpace(scanner.Text()) // 处理特殊命令 switch strings.ToLower(input) { case "quit", "exit", "q": fmt.Println("再见!") return case "help", "h": printHelp() continue case "history": printHistory(calc) continue case "clear": calc.ClearHistory() fmt.Println("历史记录已清空") continue case "": continue } // 计算表达式 result, err := calc.Calculate(input) if err != nil { fmt.Printf("错误: %v\n", err) continue } // 显示结果 fmt.Printf("结果: %g\n", result) } // 检查扫描器错误 if err := scanner.Err(); err != nil { fmt.Printf("读取输入时发生错误: %v\n", err) } } // printWelcome 显示欢迎信息 func printWelcome() { fmt.Println("=== 欢迎使用 Go 计算器!===") fmt.Println() fmt.Println("支持的操作:") fmt.Println(" • 基本运算: +, -, *, /") fmt.Println(" • 括号运算: ( )") fmt.Println(" • 浮点数计算") fmt.Println() fmt.Println("特殊命令:") fmt.Println(" • help - 显示帮助信息") fmt.Println(" • history - 查看计算历史") fmt.Println(" • clear - 清空历史记录") fmt.Println(" • quit - 退出程序") fmt.Println() fmt.Println("请输入数学表达式:") } // printHelp 显示帮助信息 func printHelp() { fmt.Println() fmt.Println("=== 帮助信息 ===") fmt.Println() fmt.Println("支持的运算符:") fmt.Println(" + 加法 例: 2 + 3") fmt.Println(" - 减法 例: 5 - 2") fmt.Println(" * 乘法 例: 4 * 6") fmt.Println(" / 除法 例: 8 / 2") fmt.Println(" () 括号 例: (2 + 3) * 4") fmt.Println() fmt.Println("使用示例:") fmt.Println(" 2 + 3") fmt.Println(" 10 * (5 - 2)") fmt.Println(" 15.5 / 3.1") fmt.Println(" ((2 + 3) * 4) - 1") fmt.Println() fmt.Println("特殊命令:") fmt.Println(" help - 显示此帮助信息") fmt.Println(" history - 查看计算历史") fmt.Println(" clear - 清空历史记录") fmt.Println(" quit - 退出程序") fmt.Println() } // printHistory 显示计算历史 func printHistory(calc calculator.Calculator) { history := calc.GetHistory() if len(history) == 0 { fmt.Println("暂无计算历史") return } fmt.Println() fmt.Println("=== 计算历史 ===") for i, record := range history { fmt.Printf("%d. %s = %g\n", i+1, record.Expression, record.Result) } fmt.Println() }