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