go lang switch语句错误

时间:2016-11-24 18:47:35

标签: go floating-point calculator

我对Go和堆栈溢出都是全新的,所以请耐心等待。我正在使用go构建一个简单的计算器,我正在尝试为浮点数添加功能。

程序接受一个字符串(例如:" 2 + 3")并显示结果。它可以很好地读取和计算整数,但是当程序遇到小数时我遇到了问题。它在遇到“'”时会使用嵌套的switch语句。它运行嵌套的switch语句,直到它命中空白。它应该计算与整数值相同,唯一的区别是它将值除以10(将值移动到正确的值到thenths hundreths thousanths等)但是当我尝试运行它时,它只是停止,没有错误或任何东西,它只是挂在那里,让我强行关闭程序。

这是我的代码(当我到达案例时,我的错误发生了。':其他一切正常):

package main

import (
    "bufio"
    "fmt"
    "os"
    "stack"
    )

var operatorStack = stack.NewStack()
var operandStack = stack.NewStack()

func precedence(op byte) uint8 {
switch op {
    case '+', '-': return 0
    case '*', '/': return 1
    default: panic("illegal operator")
    }
}

func apply() {
op := operatorStack.Pop().(byte)
right := operandStack.Pop().(float64)
left := operandStack.Pop().(float64)
switch op {
    case '+': operandStack.Push(left + right)
    case '-': operandStack.Push(left - right)
    case '*': operandStack.Push(left * right)
    case '/': operandStack.Push(left / right)
    default: panic("illegal operator")
}
}

func main() {
// Read a from Stdin.
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
line := scanner.Text()
//
for i := 0; i < len(line); {
    switch line[i] {
        case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
            v := float64(0)
            for {
                v = v * 10 + float64(line[i] - '0')
                i++
                if i == len(line) || !('0' <= line[i] && line[i] <= '9') {
                    break
                }
            }
            operandStack.Push(v)
        case '+', '-', '*', '/':
            for !operatorStack.IsEmpty() && precedence(operatorStack.Top().(byte)) >= precedence(line[i]) {
                apply()
            }
            operatorStack.Push(line[i])
            i++
        case ' ': i++
        case '.':
            for b := line[i]; b != ' '; {
                    switch line[i] {
                        case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
                            v := float64(0)
                            for {
                                v = v / 10 + float64(line[i] - '0')
                                i++
                                if i == len(line) || !('0' <= line[i] && line[i] <= '9') {
                                    break
                                }
                            }
                            operandStack.Push(v)
                        case ' ': 
                        operatorStack.Push('+')
                        break
                        }

            }
        default: panic("illegal character")
    }
}
for !operatorStack.IsEmpty() {
    apply()
}
r := operandStack.Pop().(float64)
fmt.Println(r)

0 个答案:

没有答案