在Kotlin中计算字符串

xkrw2x1b  于 2023-02-16  发布在  Kotlin
关注(0)|答案(2)|浏览(128)

我写了一个代码在Kotlin为评估一个给定的字符串从除法到减法,它的工作,但它给出了错误的答案,例如,我得到了一个字符串x在第一行有答案-215.96666,而从代码的答案是-237.366666 idk的错误是。我看到更多的人使用堆栈这样做,但我想这样做的方式来评估字符串

var x : String = "5+4-10x20-40/30x20+34/20"

fun div(x: String): String {
    val lis1 = x.split("-").toMutableList()
    for (ele1 in lis1) {
        if ("/" in ele1) {
            val pos1 = lis1.indexOf(ele1)
            val lis2 = ele1.split("+").toMutableList()
            for (ele2 in lis2) {
                if ("/" in ele2) {
                    val pos3 = lis2.indexOf(ele2)
                    val lis3 = ele2.split("x").toMutableList()
                    for (ele3 in lis3) {
                        if ("/" in ele3) {
                            val pos4 = lis3.indexOf(ele3)
                            val lis4 = ele3.split("/")
                            val div = (lis4[0].toDouble() / lis4[1].toDouble()).toString()
                            lis3[pos4] = div
                        }
                    }
                    lis2[pos3] = lis3.joinToString("x")
                }
            }
            lis1[pos1] = lis2.joinToString("+")

        }
    }
    return (lis1.joinToString("-"))
}

fun mul(x : String) : String{
    val lis1 = x.split("-").toMutableList()
    for (ele1 in lis1) {
        if("x" in ele1){
            val pos1 = lis1.indexOf(ele1)
            val lis2 = ele1.split("+").toMutableList()
            for(ele2 in lis2){
                if("x" in ele2){
                    val pos2 = lis2.indexOf(ele2)
                    val lis3 = ele2.split("x")
                    val mul = (lis3[0].toDouble() * lis3[1].toDouble()).toString()
                    lis2[pos2] = mul
                }
            }
            lis1[pos1] = lis2.joinToString("+")
        }
    }
    return (lis1.joinToString("-"))
}

fun add(x : String): String {
    val lis1 = x.split("-").toMutableList()
    for(ele1 in lis1){
        if("+" in ele1){
            val pos1 = lis1.indexOf(ele1)
            val lis2 = ele1.split("+")
            val add = (lis2[0].toDouble() + lis2[1].toDouble()).toString()
            lis1[pos1] = add
        }
    }
    return (lis1.joinToString("-"))
}

fun sub(x : String) : String{
    val lis1 = x.split("-").toMutableList()
    var sub = 0.0
    for(ele1 in lis1){
        sub -= ele1.toDouble()
    }
    return (sub.toString())
}

fun eval(x: String): String {
    val divanswer = div(x)
    val mulanswer = mul(divanswer)
    val addanswer = add(mulanswer)
    return sub(addanswer)
}

fun main(args: Array<String>){
    println(eval(x))
}



i wanted the answer as -215.96666 but the answer given by code is -237.366666
o2g1uqev

o2g1uqev1#

在这个特定输入的情况下,涉及到两个bug。
第一个bug是关于你先处理+,然后处理-,但是在数学上我们应该一起处理它们,从左到右,结果你的算法处理了:1-1+1(正确答案:1)作为:1-(1+1)(答案:或者,我认为先处理-,然后再处理+应该可以正常工作。
第二个错误是在sub()中,你从0开始,甚至减去第一个数字,但是第一个数字实际上应该被加上或用作初始值。
我相信在修复了这两个bug之后,它应该会为这个特定的输入提供一个正确的答案,但是类似的bug可能还有更多。例如,你错误地处理了同一个运算符的链,你只关心第一对,所以1+1+1变成了2(然后由于前面提到的bug,它变成了-2)。
作为一般建议,学习使用调试器并分析代码处理数据时数据是如何变化的。即使只是打印中间结果:divanswermulansweraddanswer,然后通过谷歌运行它们进行处理,你会注意到在add()步骤的某个地方有问题。然后冲洗并重复,直到一切正常工作。

bvn4nwqk

bvn4nwqk2#

感谢@broot发现了这个问题,问题出在加法和减法部分,现在我把它们合并成一个,并得到了我输入的字符串的正确答案,下面是更正后的完整代码。

var x : String = "5+4-10x20-40/30x20+34/20"

fun div(x: String): String {
    val lis1 = x.split("-").toMutableList()
    for (ele1 in lis1) {
        if ("/" in ele1) {
            val pos1 = lis1.indexOf(ele1)
            val lis2 = ele1.split("+").toMutableList()
            for (ele2 in lis2) {
                if ("/" in ele2) {
                    val pos3 = lis2.indexOf(ele2)
                    val lis3 = ele2.split("x").toMutableList()
                    for (ele3 in lis3) {
                        if ("/" in ele3) {
                            val pos4 = lis3.indexOf(ele3)
                            val lis4 = ele3.split("/")
                            val div = (lis4[0].toDouble() / lis4[1].toDouble()).toString()
                            lis3[pos4] = div
                        }
                    }
                    lis2[pos3] = lis3.joinToString("x")
                }
            }
            lis1[pos1] = lis2.joinToString("+")

        }
    }
    return (lis1.joinToString("-"))
}

fun mul(x : String) : String{
    val lis1 = x.split("-").toMutableList()
    for (ele1 in lis1) {
        if("x" in ele1){
            val pos1 = lis1.indexOf(ele1)
            val lis2 = ele1.split("+").toMutableList()
            for(ele2 in lis2){
                if("x" in ele2){
                    val pos2 = lis2.indexOf(ele2)
                    val lis3 = ele2.split("x")
                    val mul = (lis3[0].toDouble() * lis3[1].toDouble()).toString()
                    lis2[pos2] = mul
                }
            }
            lis1[pos1] = lis2.joinToString("+")
        }
    }
    return (lis1.joinToString("-"))
}

fun final(x: String): Double {
    val substr = StringBuffer()
    var answer = 0.0
    var opr = '+'
    for(ele in x.indices){
        var current = x[ele]
        if(current in '0'..'9' || current == '.'){
            substr.append(current)
        }
        if(current == '-' || current == '+'){
            var operand = substr.toString().toDouble()
            substr.setLength(0)
            when (opr){
                '+' -> answer += operand
                '-' -> answer -= operand
            }
            opr = current
        }
    }
    val num = substr.toString().toDouble()
    when(opr){
        '+' -> answer += num
        '-' -> answer -= num
    }
    return answer
}

fun eval(x: String): Double {
    val divanswer = div(x)
    return final(mul(divanswer))
}

fun main(args: Array<String>){
    println(eval(x))
}

相关问题