NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: problem pri vipise textu

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
ronep
Člen
Avatar
ronep:2.6.2015 17:33

cus
z nudy som si urobil jednoduchi program ktori vigeneruje premenu a ja ju potom mam uhadnut problem je v tom ze ked ju uhadnem tak mi to vipise viackrat a to ja nechcem a ani netusim kde mam chibu
prikladam screenshot a zdrojak
package javaapplication1;

import java.util.Scanner;

public class JavaApplication1 {
private static int uran ;
private static long a ;
private static double ran ;
private static String meno ;
private static String meno_forma ;
private static String pc ;

public static void main(String[] args) {
Scanner sc = new Scanner(System.in, "Windows-1250");

pc = "[ PC ] :";
System.out.prin­t("ako sa volas ?:");
meno = sc.nextLine();
meno_forma = "[ "+meno+" ] :";

ran = Math.random();
double ran_int = ran * 1000000;
uran = (int) ran_int ;
System.out.prin­tln(pc + "hadaj ake cislo si mislim:");
vstup();
}

public static void vstup(){
Scanner sc = new Scanner(System.in, "Windows-1250");

System.out.prin­t(meno_forma);

try{
a = sc.nextInt();
}
catch (Exception e){
System.out.prin­tln("pozor na ine znaky ako čisla");
vstup();
}
hadaj();
}

private static void hadaj() {

if (a == 123456789){
System.out.prin­tln("spravne cislo je--->"+uran+"<---");
vstup();
}

if (a < uran){
System.out.prin­tln(pc + "viac");
vstup();
}

if (a > uran){
System.out.prin­tln(pc + "menej");
vstup();
}
else{
System.out.prin­tln("*****************u­hadol si***********­******");
}
}
}

 
Odpovědět
2.6.2015 17:33
Avatar
vita
Tvůrce
Avatar
Odpovídá na ronep
vita:27.8.2015 16:40

Ahoj,
než jsem na to přišel, tak jsem se trošku zapotil :-).

Náhodné číslo je 6 a začnu hádat od menšího:

ako sa volas ?:v
[ PC ] :hadaj ake cislo si mislim:
[ v ] :0
[ PC ] :viac
[ v ] :1
[ PC ] :viac
[ v ] :2
[ PC ] :viac
[ v ] :3
[ PC ] :viac
[ v ] :4
[ PC ] :viac
[ v ] :5
[ PC ] :viac
[ v ] :6
*****************uhadol si*****************
*****************uhadol si*****************
*****************uhadol si*****************
*****************uhadol si*****************
*****************uhadol si*****************
*****************uhadol si*****************
*****************uhadol si*****************

Náhodné číslo je 6 a začnu od většího

ako sa volas ?:v
[ PC ] :hadaj ake cislo si mislim:
[ v ] :9
[ PC ] :menej
[ v ] :8
[ PC ] :menej
[ v ] :7
*****************uhadol si*****************

Nyní to fungovalo zprávně.

Zde modelace běhu programu. Nepoužíváš cyklus a místo toho se zanořuješ hlouběji a hlouběji. Jako by rekurze. Takže když pak uhodneš, vracíš se zpátky (vynořuješ se).

main()
-> vstup()
-> hadaj() - neuhodnu
-> -> vstup()
-> -> hadaj() - neuhodnu
-> -> -> vstup()
-> -> -> hadaj() - uhodnu
-> -> vstup()
-> -> hadaj()
-> vstup()
-> hadaj()
main()

To znamená, když v hadaj() je můj odhad nižší, než náhodné číslo tak se znovu zavolá vstup() a to zde:

private static void hadaj() {

        if (a == 123456789) {
                System.out.println("spravne cislo je--->" + uran + "<---");
                ============================
                vstup();  ZDE SE VOLÁ VSTUP
                ============================
        }

        if (a < uran) {
                System.out.println(pc + "viac");
                vstup();
        }

        if (a > uran) {
                System.out.println(pc + "menej");
                vstup();
        } else {
                System.out.println("*****************uhadol si*****************");
        }
}

a následně hadej(). Pokud se nyní trefím, vypíše se "uhadol si" a běh programu se vrátí na konec metody vstup() a do metody hadaj(), kde přetím skončil:

private static void hadaj() {

        if (a == 123456789) {
                System.out.println("spravne cislo je--->" + uran + "<---");
                vstup();
        ==============================================
        } ZDE SE OPĚT VYNOŘÍM A PROGRAM POKRAČUJE
        ==============================================

        if (a < uran) {
                System.out.println(pc + "viac");
                vstup();
        }

        if (a > uran) {
                System.out.println(pc + "menej");
                vstup();
        } else {
                System.out.println("*****************uhadol si*****************");
        }
}

a pokračuji (měj na paměti, že nyní je již a == uran) k dalšímu if (a < uran), tan se přeskočí, jde se na if (a > uran), ten je false, takže se přejde k části else, která se provede -> vypíše se opět "uhadol si".

 
Nahoru Odpovědět
27.8.2015 16:40
Avatar
Odpovídá na ronep
Neaktivní uživatel:27.8.2015 17:14

Mimochodem doporučuji zapracovat na pravopise ;-)

Nahoru Odpovědět
27.8.2015 17:14
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Neaktivní uživatel:27.8.2015 17:15

Sakra sakra, sám jsem to napsal špatně :-D. To je tak, když celou dobu mluví člověk na netu jen anglicky :-D

Nahoru Odpovědět
27.8.2015 17:15
Neaktivní uživatelský účet
Avatar
ronep
Člen
Avatar
ronep:3.9.2015 1:46

dakujem za podrobne visvetlenie ale asi to nechapem alebo som debil

ti chces povedat ze cim viac krat budem hadat tak tim viac to napise "uhadol si" ?
lebo tuto moznost som skusal a na rovnaki pocet hadani visiel rozdielni pocet vitaznich textou

a neviem ci si ten program skusal alebo nie ale ta podmienka

if (a == 123456789){
        System.out.println("spravne cislo je--->"+uran+"<---");
        vstup();
}

je len pre pripad ze nedokazes uhadnut a ak to napises tak ti vipise spravne cislo
(ktore je generovane nahodne)

ok no ak to je tak ako hovoris tak ako podla teba to mam opravit ?

 
Nahoru Odpovědět
3.9.2015 1:46
Avatar
vita
Tvůrce
Avatar
Odpovídá na ronep
vita:3.9.2015 9:44

Spíš jsem chtěl říct, že jak nepoužíváš cyklus, tak se neustále zanořuješ do programu.

Možné řešení:

import java.util.Random;
import java.util.Scanner;

public class Hra {

        private static Scanner scanner = new Scanner(System.in);
        private static Random generator = new Random();

        private static final int CISLO_MIN = 0;
        private static final int CISLO_MAX = 10;

        private static int nahodneCislo;

        public static void main(String[] args) {

                nahodneCislo = generator.nextInt(CISLO_MAX) + 1;

                System.out.println("=====");
                System.out.println("Start");
                System.out.println("=====\n");

                String vstup = null;
                boolean uhodnuto = false;

                do {
                        System.out.print("Jaké číslo si myslím? (zadej celé číslo v rozsahu " + CISLO_MIN + " až " + CISLO_MAX + "): ");
                        vstup = scanner.next();
                        try {
                                int cislo = Integer.parseInt(vstup);
                                if (cislo == nahodneCislo) {
                                        System.out.println("Uhodl jsi.");
                                        uhodnuto = true;
                                } else if (cislo < nahodneCislo) {
                                        System.out.println("Málo.");
                                } else if (cislo > nahodneCislo) {
                                        System.out.println("Hodně.");
                                }
                        } catch (Exception e) {
                                System.out.println("Chybný vstup!");
                        }
                } while (!uhodnuto);

                System.out.println("\n=====");
                System.out.println("Konec");
                System.out.println("=====");
        }
}

Výstup programu:

=====
Start
=====

Jaké číslo si myslím? (zadej celé číslo v rozsahu 010): 19
Hodně.
Jaké číslo si myslím? (zadej celé číslo v rozsahu 010): 8888888888888888888888888888888
Chybný vstup!
Jaké číslo si myslím? (zadej celé číslo v rozsahu 010): aslha
Chybný vstup!
Jaké číslo si myslím? (zadej celé číslo v rozsahu 010): -1254
Málo.
Jaké číslo si myslím? (zadej celé číslo v rozsahu 010): 4
Hodně.
Jaké číslo si myslím? (zadej celé číslo v rozsahu 010): 2
Málo.
Jaké číslo si myslím? (zadej celé číslo v rozsahu 010): 3
Uhodl jsi.

=====
Konec
=====

Vysvětlení:

nahodneCislo = generator.nextInt(CISLO_MAX) + 1;

Vygeneruje náhodné číslo v rozsahu 0 až CISLO_MAX.

do {
...
} while (!uhodnuto);

Dokud má proměnná uhodnuto hodnotu false, provádí se blok v do. Blok v do se provede minimálně jednou .

if (cislo == nahodneCislo) {
        System.out.println("Uhodl jsi.");
        uhodnuto = true;
}

Pokud hráč uhodne, vypíše se text a hodnota proměnné uhodnuto je změněna na true.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
3.9.2015 9:44
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.