#android #kotlin
#Android #kotlin
Вопрос:
Сначала я попытался создать код операции в kotlin, я имею в виду, когда запускаю код в терминале и ввожу первое число 123456
, когда я нажимаю
operator, код считывает его как строковый параметр, и он станет 123456
.
Суть в том, что я хочу создать код оператора kotlin, который может вычислять два числа, и когда я нажимаю или
или -
или /
строка *
числа один должна быть чистой, чтобы ввести число два для вычисления и, таким образом, ввести число три, четыре и пять.
И это мой код:
fun operation(arr: ArrayList<String?>?) {
val joo = readLine()!!
val loo = joo.removeSuffix(" ")
var soo = loo.toInt()
arr!!.add(soo.toString())
val voo = joo.lastIndex
when(voo.toString()){
" " -> arr.last()!!.plus(soo)
}
println("${soo}")
operation(arr)
}
Ответ №1:
Сегодня утром у меня есть немного времени. Это может быть хорошим приветом для кого-то, так что здесь.
Чтобы прочитать входные данные и создать из них состояние, вам понадобится:
- цикл для чтения каждого нового аргумента от пользователя
- способ отслеживания прочитанных вами входных данных. На самом деле это небольшой конечный автомат. Я реализовал свой, используя
enum
when
выражение и.
И вот оно (вероятно, не совсем то, что вы ищете, но должно дать вам представление о возможной структуре:
import java.util.*
// This gives us the states that our state machine can be in.
enum class State {
WANT_FIRST_OPERAND,
WANT_SECOND_OPERAND,
WANT_OPERATOR
}
fun main() {
val scanner = Scanner(System.`in`)
var state = State.WANT_FIRST_OPERAND
println("Ready to do some maths!")
var firstOperand = 0.0
var secondOperand: Double
var operator = ""
// This loop will keep asking the user for input and progress through the states of the state machine.
loop@ while (true) {
// This when block encapsulates the logic for each state of our state machine.
when (state) {
State.WANT_FIRST_OPERAND -> {
println("Give me your first operand.")
try {
firstOperand = scanner.nextDouble()
state = State.WANT_OPERATOR
} catch (e: Exception) {
println("Sorry, that did not work, did you give me a number?")
scanner.nextLine()
}
}
State.WANT_OPERATOR -> {
println("Give me the operator. ( , -, /, *)")
try {
operator = scanner.next("[-* /] ").trim()
state = State.WANT_SECOND_OPERAND
} catch (e: Exception) {
println("Sorry, that did not work.")
scanner.nextLine()
}
}
State.WANT_SECOND_OPERAND -> {
println("Give me your second operand.")
try {
secondOperand = scanner.nextDouble()
val answer = when(operator){
" " -> firstOperand secondOperand
"-" -> firstOperand - secondOperand
"/" -> firstOperand / secondOperand // You want to do something if second operand is 0 here
"*" -> firstOperand * secondOperand
else -> {
println("Hmmm, something went wrong there I don't know $operator, try again")
state = State.WANT_OPERATOR
continue@loop
}
}
println("The Answer is $answer, lets do another one!")
state = State.WANT_FIRST_OPERAND
} catch (e: Exception) {
println("Sorry, that did not work, did you give me a number?")
scanner.nextLine()
}
}
}
}
}
Комментарии:
1.Большое вам спасибо за ответ, но на самом деле это не совсем то, что мне нужно, посмотрите, когда я добавляю первое число, я должен нажать
Enter
клавишу, чтобы добавить клавишу оператора, это именно моя проблема, я хочу отказаться отEnter
клавиши, то есть при нажатии какой-либо клавиши оператораили
-
Enter
клавиши автоматически сработает.2. @YounTivoli в этом случае вам не нужна семантика «строки чтения». Потому что ввод — это буквально то, что разделяет строки. Вам нужно будет реализовать гораздо более инкрементный потоковый считыватель и выполнять оценку каждого нового введенного ключа.