Files
golang/golang-learning/10-projects/01-calculator/main.go
2025-08-24 13:01:09 +08:00

134 lines
2.8 KiB
Go

/*
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()
}