Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
kotlin中计算器的一元和二元减号运算符_Kotlin - Fatal编程技术网

kotlin中计算器的一元和二元减号运算符

kotlin中计算器的一元和二元减号运算符,kotlin,Kotlin,我正在做一个计算器项目。用户可以使用不同的运算符输入多个数字,然后我计算行的和 示例(>=用户输入) 程序必须计算如下表达式:4+6-8、2-3-4等等。它必须同时支持一元和二元减号运算符。如果用户输入了多个相同的运算符,则程序仍应工作 考虑到负数的偶数表示正,负数的奇数表示负!就像这样:2--2等于2-(-2)等于2+2 我的计划是创建一个列表,计算每个字符串中的'-'数,如果'-'%2==0,则将所有'-'替换为1'+',否则替换为'-'。下面是我已经取得的进展,但我不太清楚该怎么做,因为我

我正在做一个计算器项目。用户可以使用不同的运算符输入多个数字,然后我计算行的和

示例(>=用户输入)

程序必须计算如下表达式:4+6-8、2-3-4等等。它必须同时支持一元和二元减号运算符。如果用户输入了多个相同的运算符,则程序仍应工作

考虑到负数的偶数表示正,负数的奇数表示负!就像这样:2--2等于2-(-2)等于2+2

我的计划是创建一个列表,计算每个字符串中的'-'数,如果'-'%2==0,则将所有'-'替换为1'+',否则替换为'-'。下面是我已经取得的进展,但我不太清楚该怎么做,因为我不理解reduce()函数,如果它是适合我的函数的话

fun readInput(): List<Int> {
    val input = readLine()!!.split(" ")
    input.forEach {
        if(it.count{it == '-'} % 2 == 0) it.reduce { acc, c -> acc }
    }
    return
}
fun readInput():列表{
val input=readLine()!!.split(“”)
input.forEach{
如果(it.count{it='-'}%2==0)it.reduce{acc,c->acc}
}
返回
}
我想返回一个列表,以便稍后在求和函数中使用它

    fun summa(input: List<Int>) {
        println(input.sumBy { it })
    }
fun summa(输入:列表){
println(input.sumBy{it})
}

不确定您试图使用
reduce
执行什么操作,但是
String.reduce{acc,c->acc}
具有与
String.first().toString()
相同的行为,只是它无原因地迭代字符串

分解这个问题,我认为您需要将输入分割成以整数结尾的块。然后将这些块转换为正整数或负整数

我很难想出一个正则表达式,它可以适当地分割字符串,所以这会扫描它的整数边界,并以这种方式分割它

一旦有了这些块,就可以扫描负号,并用它将整数乘以1或-1

fun readInput(): List<Int> {
    val input = readLine()!!
    val splits = mutableListOf(0)
    for (i in 1 until input.length){
        if (input[i - 1].isDigit() && !input[i].isDigit())
            splits.add(i)
    }
    splits.add(input.length)
    val chunks = splits.zipWithNext().map { input.substring(it.first, it.second) }
    return chunks.map { piece ->
        val multiplier = if (piece.count { it == '-' } % 2 == 0) 1 else -1
        (piece.filter { it.isDigit() }.toIntOrNull() ?: 0) * multiplier
    }
}
fun readInput():列表{
val input=readLine()!!
val splits=mutableListOf(0)
for(输入前输入1中的i.length){
if(输入[i-1].isDigit()&&!输入[i].isDigit())
拆分。添加(i)
}
拆分.添加(输入.长度)
val chunks=splits.zipWithNext().map{input.substring(it.first,it.second)}
返回chunks.map{piece->
val乘数=if(piece.count{it='-'}%2==0)1 else-1
(piece.filter{it.isDigit()}.toIntOrNull()?:0)*乘法器
}
}

顺便说一下,您不需要
.sumBy{it}
。您只需使用
.sum()

,感谢您的耐心等待。这帮我解决了我的问题。出于个人兴趣,你认为有更好的方法来解决这个问题吗?这是我为你描述的非常具体的问题提出的最简单的方法。但如果您需要为其他运营商增加支持,则需要更复杂的策略。此外,我上面的代码将正常地静默处理输入,即使存在语法错误,如数字之间没有运算符,或小数点和其他符号和字母。
fun readInput(): List<Int> {
    val input = readLine()!!
    val splits = mutableListOf(0)
    for (i in 1 until input.length){
        if (input[i - 1].isDigit() && !input[i].isDigit())
            splits.add(i)
    }
    splits.add(input.length)
    val chunks = splits.zipWithNext().map { input.substring(it.first, it.second) }
    return chunks.map { piece ->
        val multiplier = if (piece.count { it == '-' } % 2 == 0) 1 else -1
        (piece.filter { it.isDigit() }.toIntOrNull() ?: 0) * multiplier
    }
}