IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Neviem zopakovať cyklus

Aktivity
Avatar
peter
Člen
Avatar
peter:24.1.2019 19:06

Neviem zopakovať cyklus pomocou cyklu do-while

Zkusil jsem: package com.Kalkulačka­.main;

import static java.lang.Mat­h.sqrt;

import java.util.Scanner;

public class Kalkulačka {

public static void main(String[] args){
do{
Scanner číslo = new Scanner(System.in);
double a,b,c,D,x1,x2,x;
System.out.prin­tln("Zadaj a");
a = číslo.nextDouble();
System.out.prin­tln("Zadaj b");
b = číslo.nextDouble();
System.out.prin­tln("Zadaj c");
c = číslo.nextDouble();
D = (bb)-4(a)*(c);

if (D==0) {
x= (-b)/(2*a);
System.out.prin­t("D=");
System.out.prin­tln(D);
System.out.prin­t("Kvadratická rovnica má len jeden koreň, x=");
System.out.prin­tln(x);
}

if (D<0) {
System.out.prin­t("D=");
System.out.prin­tln(D);
System.out.prin­t("Kvadratická rovnica nemá žiadne riešenie v odbore R!");

}
if (D>0) {
x1= (-b + sqrt(D)) / (2*a);
System.out.prin­t("D=");
System.out.prin­tln(D);
System.out.prin­t("Prvý koreň kvadratickej rovnice, x1=");
System.out.prin­tln(x1);
x2= (-b - sqrt(D)) / (2*a);
System.out.prin­t("Druhý koreň kvadratickej rovnice, x2=");
System.out.prin­tln(x2);

}
System.out.prin­tln("Pre další príklad vpíš tlačidlo X a potom enter");
double cmd, X;
cmd = číslo.nextDouble();
X= číslo.nextDouble();
}while( cmd == X );
}
}

Chci docílit: snažím sa pomocou metódy do-while zopakovať cyklus konzolovej aplikácie v prostredí Eclipse. Som ale len začiatočník a neviem ako postúpiť ďalej.... pomohli by ste mi ?

 
Odpovědět
24.1.2019 19:06
Avatar
Odpovídá na peter
Michal Štěpánek:25.1.2019 7:35

Všeobecně (ve všech jazycích) funguje "while" dokud je platná podmínka. Pokud ti cyklus nefunguje, zkontroluj podmínku. Koukni se, jaký výsledek proměnných ti z toho leze.

Nahoru Odpovědět
25.1.2019 7:35
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na peter
Matúš Olejník:25.1.2019 8:22

Keď píšeš otázku tak si všimni, že troška vyššie je taká ikonka smajlíka a napravo od nej je ikonka </>. Keď na ňu klikneš a potom medzi ten text ktorý ti pribudol vložíš svoj kód tak to tu na stránke bude pekne farebné ako u teba keď to píšeš Eclipse ;)

Cyklus nezopakuješ pretože program nejde ani zbuildovať

Java je case sensitive takže premenná double x je úplne iná než double X

Nepoužívaj diakritiku v názvoch premenných :D čislo , najlepšie je hneď od začiatku písať všetko v angličtine

Scanner ti slúži na načítavanie vstupu od užívateľa a ten nemusí byť vždy len číslo tak prečo si premennú nazývať číslo? Nazvime ju scanner a potom z metód Scannera bude jasne vidno čo od neho chceme

Pre načítanie čísla zo vstupu je lepšie načítať celý riadok a nakoniec to parsovať Double.parseDou­ble(scanner.nex­tLine())

Keď máš viacero podmienok ktoré závisia od rovnakej premennej a vieš, že vždy nastane len jeden prípad tak nepoužívaj viacero samostatných if-ov za sebou ale použi aj vetvu else, tak sa nemusia kontrolovať ostatné podmienky ak niektorá pred nimi už platila

Keďže do tých premenných a, b, c... v každom cykle načítame nové hodnoty tak ich vytiahneme pred ten cyklus nech sa dookola nealokujú nové

V prípade, že rovnica má len jeden koreň nepotrebuješ ďalšiu premennú do ktorej ho ukladať ale môžeš ju uložiť už do existujúcej x1

Desatinné čísla neporovnávaj priamo cez == z dôvodu toho ako sa ukladajú do pamäte tam vznikajú odchýlky. Buď to porovnaj s nejakou malou odchýlkou 0,00001 alebo či jedno je < prípade > a ak ani jedno neplatí tak budú rovnaké

Keď už Scanner nebudeš používať uvoľni prostriedky OS príkazom scanner.close()

Nakoniec o riadiacej premennej musí ten cyklus vedieť že existuje ešte pred tým než sa doňho vojde takže premennú do ktorej uložíme nakoniec rozhodnutie či sa má cyklus zopakovať deklarujeme ešte pred cyklom s tým že ju nazveme nejako lepšie než X alebo cmd

PS: je obor reálnych čísiel a nie oDbor ;) + treba doplniť kontrolu či a nie je nula aby si ňou nedelil

private static final String nextInputChar = "X";

public static void main(String[] args){

    Scanner scanner = new Scanner(System.in);
    double a, b, c, D, x1, x2;
    String nextInput;

    do {
        System.out.print("Zadaj a: ");
        a = Double.parseDouble(scanner.nextLine());

        System.out.print("Zadaj b: ");
        b = Double.parseDouble(scanner.nextLine());

        System.out.print("Zadaj c: ");
        c = Double.parseDouble(scanner.nextLine());

        D = (b * b) - 4 * a * c;

        //TODO pridat kontrolu ci a nie je nula
        if (D < 0) {
            System.out.println("D = " + D);
            System.out.println("Kvadratická rovnica nemá žiadne riešenie v obore R!");

        } else if (D > 0){
            x1 = (-b + sqrt(D)) / (2 * a);
            x2 = (-b - sqrt(D)) / (2 * a);

            System.out.println("D = " + D);
            System.out.println("Prvý koreň kvadratickej rovnice, x1 = " + x1);
            System.out.println("Druhý koreň kvadratickej rovnice, x2 = " + x2);

        } else {
            x1 = (- b) / (2 * a);

            System.out.println("D = " + D);
            System.out.println("Kvadratická rovnica má len jeden koreň, x = " + x1);
        }

        System.out.println("Pre další príklad vpíš tlačidlo " + nextInputChar + " a potom enter");
        nextInput = scanner.nextLine();

    } while(nextInput.equals(nextInputChar));

    scanner.close();
}
Editováno 25.1.2019 8:24
Nahoru Odpovědět
25.1.2019 8:22
/* I am not sure why this works but it fixes the problem */
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 3 zpráv z 3.