Wątek przeniesiony 2021-06-04 09:50 z Inne języki programowania przez Shalom.

Kotlin - "while" i "if" - niekończąca się pętla.

0

Witam.
Jestem nowym użytkownikiem Kotlina i poznaję ten język.
Proszę o informację, co zrobić inaczej, aby program działał w taki sposób, że jeżeli użytkownik nie zgadnie tej liczby, to pętla będzie powtarzać możliwość wyboru liczby, aż do momentu jej odgadnięcia.

Obecnie wygląda to tak, że jak trafię liczbę:

27
Pomyślałem sobie jakąś liczbę, z zakresu 0...100.
Zgadnij ją:
27

Process finished with exit code 0

A jak nie trafię, to:

Nie zgadłeś. Wylosowana liczba jest większa.
Nie zgadłeś. Wylosowana liczba jest większa.
Nie zgadłeś. Wylosowana liczba jest większa.
Nie zgadłeś. Wylosowana liczba jest większa.
Nie zgadłeś. Wylosowana liczba jest większa.
Nie zgadłeś. Wylosowana liczba jest większa.
Nie zgadłeś. Wylosowana liczba jest większa.
Nie zgadłeś. Wylosowana liczba jest większa.
Nie zgadłeś. Wylosowana liczba jest większa.
Nie zgadłeś. Wylosowana liczba jest większa.
...i tak bez końca.
Process finished with exit code -1

Kod programu:

import kotlin.random.Random

fun main(args: Array<String>) 

{

    var randomNumber = Random.nextInt(0, 100)

    println("Pomyślałem sobie jakąś liczbę, z zakresu 0...100.")
    println("Zgadnij ją:")

    var podaj = readLine()!!.toInt()

    while (podaj !== randomNumber)
    {
        if (podaj < randomNumber)
        {
            println("Nie zgadłeś. Wylosowana liczba jest większa.")
        }

        else if (podaj > randomNumber)
        {
            println("Nie zgadłeś. Wylosowana liczba jest mniejsza.")
        }

        else if (podaj > randomNumber)
        {
            println("Zgadłeś, brawo!")
         }


     }

 }

Dziękuję

3

Wczytujesz wartość podaj poza pętlą — wewnątrz samej pętli się już nie zmienia. Zatem albo trafisz od razu, więc pętla nie wykona się nigdy, albo nie trafisz, więc pętla będzie się wykonywała w nieskończoność.

1
import kotlin.random.Random

fun main(args: Array<String>)

{
    while(true) {

        var randomNumber = Random.nextInt(0, 100)

        println("Pomyślałem sobie jakąś liczbę, z zakresu 0...100.")
        println("Zgadnij ją:")

        var podaj = readLine()!!.toInt()

        while (podaj !== randomNumber) {
            if (podaj < randomNumber) {
                println("Nie zgadłeś. Wylosowana liczba jest większa.")
                break
            } else if (podaj > randomNumber) {
                println("Nie zgadłeś. Wylosowana liczba jest mniejsza.")
                break
            } else if (podaj > randomNumber) {
                println("Zgadłeś, brawo!")
                break
            }
        }
    }
}

https://i.kym-cdn.com/photos/images/newsfeed/000/096/044/trollface.jpg?1296494117

3
import kotlin.random.Random

fun main() {
    val randomNumber = Random.nextInt(0, 101)

    println("Pomyślałem sobie jakąś liczbę, z zakresu 0...100.")
    println("Zgadnij ją:")

    tailrec fun checkGuess(): Unit =
        readLine()!!.toInt()
        .let { guess ->
            if (guess == randomNumber) {
                println("Zgadłeś.")
            } else {
            	if (guess < randomNumber) {
            	    println("Nie zgadłeś. Wylosowana liczba jest większa.")
            	} else {
                    println("Nie zgadłeś. Wylosowana liczba jest mniejsza.")
                }
                checkGuess()
            }
        }

    checkGuess()
}
1

@p_agon:

Tak to wygląda:

75
Nie zgadłeś. Wylosowana liczba jest mniejsza.
Pomyślałem sobie jakąś liczbę, z zakresu 0...100.
Zgadnij ją:
74
Nie zgadłeś. Wylosowana liczba jest większa.
Pomyślałem sobie jakąś liczbę, z zakresu 0...100.
Zgadnij ją:

Czy wiesz dlaczego tak się dzieje? Chciałbym zrozumieć to zagadnienie :)

3

@stivens tailrec w tym nie działa niestety - powinieneś widzieć warning.
Ogarnij czemu i przepisz - ciekawa lekcja o kotlinie - więc polecam.

1

@jarekr000000: Ja czy agon? Tbh odpalilem to przez kscript test.kt wiec warning mnie ominal :D

3

@stivens: No tak - pomyliłem, sorry. Jak coś nie działa to po prostu domyślne na p_agon wstawiam.

EDIT:
Strasznie się wymądrzam, wywołuje ludzi - a dopiero teraz poczytałem treść wątku i to, że @p_agon wcele nie napisał kodu tylko skomentował przez trollface,

Przepraszam, za zamieszanie. Idę się zakrztusić syropem cebulowym. Żegnajcie.

1

@jarekr000000: A faktycznie.
No coz, w Scali jakbym napisal @tailrec to bym chyba blad na twarz dostal a tutaj mi musi IDE podpowiadac ;/. Ale no semantyka jest troszke inna tych rzeczy.

Ale ze rozwiazaniem jest return?...
EDIT: Nie. Teraz sie popsulo ale IDE nie marudzi :D :D :D

EDIT2: Dobra teraz chyba dziala. WTF?

import kotlin.random.Random

fun main() {
    val randomNumber = Random.nextInt(0, 101)

    println("Pomyślałem sobie jakąś liczbę, z zakresu 0...100.")
    println("Zgadnij ją:")

    tailrec fun checkGuess() {
        val guess = readLine()!!.toInt()

        if (guess == randomNumber) {
            println("Zgadłeś.")
        } else {
            if (guess < randomNumber) {
                println("Nie zgadłeś. Wylosowana liczba jest większa.")
            } else {
                println("Nie zgadłeś. Wylosowana liczba jest mniejsza.")
            }
            checkGuess()
        }
    }

    checkGuess()
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1