Всех приветствую. Можете помочь товарищи!

Рейтинг: -2Ответов: 1Опубликовано: 02.08.2023

Прохожу курсы, у одного человека. Сидел сутки на задачей, выполнил ее с трудом. А теперь оказывается не правильно. Может кто совет даст, буду благодарен. Прикрепляю два скрина. Там указаны ошибки, которые нужно исправить. Собственно сам код.

//   Регистрация пользователя
println("Пожалуйста зарегистрируйтесь:")
Thread.sleep(1000)`
println("Введите логин")
val userName = readln()
println("Введите пороль")
val password = readln()
Thread.sleep(1000)
println("Вы зарегистрированы!")

//Вход в приложение
do {
    println("Введите логин")
    val login = readln()
    println("Введите пороль")
    val passwordNew = readln()
    Thread.sleep(1000)
    if (userName == login && password == passwordNew) {

        //Капча
        println("Докажите что вы не БОТ\nСложите 2 числа:")
        for (i in 3 downTo 0) {
            val number = (1..9).random()
            val numberTwo = (1..9).random()
            println("${number}+${numberTwo}=")
            val unswer = readln().toInt()
            when (unswer) {
                number + numberTwo -> {
                    println("Добро пожаловать! ")
                    break
                }
                else -> println("Осталось $i попытка")
            }
            if (i == 0) {
                println("Доступ запрещен")
                break
            }
        }
    } else println("Не верный логин или пороль")
} while (userName != login || password != passwordNew)

}

введите сюда описание изображения

введите сюда описание изображения

Ответы

▲ -1

У каждого свое мнение какой должен быть рефакторинг, все таки это тестовое задание и многое можно упустить (ту же проверку при регистрации, что не ввели пустой логин или пароль. И то, что в любом результате выполнение выходит в одну точку), поэтому по своим замечаниям.

  1. логин пароль сравнивается в 2х местах.

Лучше пусть в одном двойное сравнение можно заменить одним while(true) + break, do..while(флаг выхода из цикла). С флагом проще в языках где нет break N, но в котлине есть break@label, а значит можно и loop@ while (true)...break@loop

  1. зачем when (unswer), чем не угодил банальный if
  2. будет написано ""Осталось 0 попытка" и сразу "Доступ запрещен"

when имеет смысл как замена многочисленных if. Но у вас же нет множества условий и вы усложнили простое.

if (answer == number + numberTwo) {
    println("Добро пожаловать! ")
    break
} else {
    if (i > 0) {
        println("Осталось $i попытка")
    } else {
        println("Доступ запрещен")
        break
    }
}

Ну и полный код (убрал Thread.sleep(1000))

//   Регистрация пользователя
println("Пожалуйста зарегистрируйтесь:")
println("Введите логин")
val userName = readln()
println("Введите пароль")
val password = readln()
println("Вы зарегистрированы!")

//Вход в приложение
loop@ while (true) {
    println("Введите логин")
    val login = readln()
    println("Введите пароль")
    val passwordNew = readln()

    if (userName == login && password == passwordNew) {
        //Капча
        println("Докажите что вы не БОТ\nСложите 2 числа:")
        for (i in 3 downTo 0) {
            val number = (1..9).random()
            val numberTwo = (1..9).random()
            println("${number}+${numberTwo}=")
            val answer = readln().toInt()

            if (answer == number + numberTwo) {
                println("Добро пожаловать! ")
                break@loop
            } else {
                if (i > 0) {
                    println("Осталось $i попытка")
                } else {
                    println("Доступ запрещен")
                    break@loop
                }
            }
        }
    } else println("Неверный логин или пароль")
}