Parsování a check kódu – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Parsování a check kódu – Java – Fórum – Programujte.comParsování a check kódu – Java – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Siggi0
Návštěvník
24. 10. 2015   #1
-
0
-

Je tento kód syntakticky správně?

        String [] s = input.split(" ");
        double firstNumber = Double.parseDouble(s[1]);
        double secondNumber = Double.parseDouble(s[2]);
        String sign = s[0];
        int fact = Integer.parseInt(s[1]);

Jednou tu hodnotu parsuji na double a po druhé na int a u fact, kde používám int hodnotu hlásí error, přítom fact mám správně a nevím, kde jinde by mohla být chyba.

Nahlásit jako SPAM
IP: 46.229.123.–
Reklama
Reklama
Kit+11
Guru
24. 10. 2015   #2
-
0
-

#1 Siggi
Syntakticky to je správně, proto je možné ten program přeložit. Při spuštění do něj zřejmě zadáváš desetinné číslo. Error, který jsi neuvedl, zřejmě vypadá asi takto: 

Exception in thread "main" java.lang.NumberFormatException: For input string: "20.7"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:492)
	at java.lang.Integer.parseInt(Integer.java:527)
	at Jmeno$Test.main(Jmeno.java:9)

V podstatě se to dá vyložit tak, že při parsování hodnoty integer mu vadí ta tečka ve vstupním stringu.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Siggi0
Návštěvník
24. 10. 2015   #3
-
0
-

Tests run: 6, Failures: 0, Errors: 2, Skipped: 0, Time elapsed: 0 sec <<< FAILURE!
factorial(BasicCalculatorProcessTest)  Time elapsed: 0 sec  <<< ERROR!
java.lang.ArrayIndexOutOfBoundsException: 2

unknownOperation(BasicCalculatorProcessTest)  Time elapsed: 0 sec  <<< ERROR!
java.lang.ArrayIndexOutOfBoundsException: 1

Nahlásit jako SPAM
IP: 46.229.123.–
Kit+11
Guru
24. 10. 2015   #4
-
0
-

#3 Siggi
Tak mi ještě prozraď, co máš ve stringu "input". Podle těch chybových hlášek v něm nemáš ani jednu mezeru a přitom potřebuješ alespoň dvě.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Siggi0
Návštěvník
24. 10. 2015   #5
-
0
-

#4 Kit 

    public void factorial() {
        String cmd = cmd(Calculator.FAC_CMD, "4");
        assertNumericResult(cmd, 24, getCalc().eval(cmd));

    @Test
    public void sum() {
        String cmd = cmd(Calculator.SUM_CMD, "4", "2");
        assertNumericResult(cmd, 6, getCalc().eval(cmd));
    }

Tzn. input: (FAC_CMD, "4")

atd...

Mohu ti poslat celý balíček, pokud bys chtěl se podívat blíže. Teď je to o dosti větší.

Nahlásit jako SPAM
IP: 46.229.123.–
Kit+11
Guru
24. 10. 2015   #6
-
0
-

#5 Siggi
Metoda 

input.split(" ");

rozdělí input podle mezer takto: 

s[0] = "(FAC_CMD,";
s[1] = "\"4\")";

Obávám se, že jsi očekával něco jiného.

Edit: Pokud chceš něco vystavit veřejně, můžeš použít služeb http://pastebin.com (pro jeden zdroják) nebo http://gist.github.com a tady použít jen odkaz. Pokud privátně tak také, ale je vhodné se nejprve registrovat, abys s nimi mohl později manipulovat.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Siggi0
Návštěvník
24. 10. 2015   #7
-
0
-

#6 Kit
Na všech ostatních jako + - * / atd.. funguje, jen u factoriálu a error msg hlásí tento divný error.

Nahlásit jako SPAM
IP: 46.229.123.–
Siggi0
Návštěvník
24. 10. 2015   #8
-
0
-
Nahlásit jako SPAM
IP: 46.229.123.–
Kit+11
Guru
24. 10. 2015   #9
-
0
-

#8 Siggi
Máš tam nějaké závislosti, takže to nemohu přeložit. Nevadí, zkusím věštit z toho, co jsi dodal:

Máš tam konstrukci 

String sign = s[0];
switch(sign) {
    case SUM_CMD: ...

Ve switchi nelze použít String, ale hodně podobně by vypadal zápis s enum: 

SignEnum sign = SignEnum.valueOf(s[0]);
switch(sign) {
    case SUM_CMD: ...

Třídu SignEnum je samozřejmě nutné definovat: 

enum SignEnum = { SUM_CMD, SUB_CMD, MUL_CMD, DIV_CMD, FAC_CMD }

V Javě je možné do toho enumu nadefinovat i chování. Taková kalkulačka pak vypadá docela skvěle a není nutný žádný switch.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Siggi0
Návštěvník
24. 10. 2015   #10
-
0
-

#9 Kit
Tím mi akorát přibylo spoustu dalších errorů. :D Předtím to fungovalo i s tím porovnáváním řetězců.

Nahlásit jako SPAM
IP: 46.229.123.–
Siggi0
Návštěvník
27. 10. 2015   #11
-
0
-

#9 Kit
Méně častou možností, jak řídit tok, je příkaz switch (přepínač). Switch, jak již název napovídá, umožňuje na základě hodnoty proměnné přepínat mezi několika větvemi programu. Proměnná, která složí jako přepínač může být následujících typů: char, byte,short, int. Tento seznam je platný pro Javu 1.6, ve verzi 1.7 by se měl rozšířit o řetězec.

Takže to enum mi dělá akorát bordel.

Problém je, že když přistoupím k factoriálu a nebo chybě, tak se tam snažím vecpat neznámé prvky z inputu a proto ta chyba, teď se ji snažím odstranit. Ale ten kód vypadá strašně hnusně.

Nahlásit jako SPAM
IP: 46.229.123.–
Řešení
Siggi0
Návštěvník
27. 10. 2015   #12
-
0
-
Vyřešeno Nejlepší odpověď

Kalkulačka mi funguje, ale chová se divně. Kdyby se na ni pak mohl někdo podívat. Můj kód taky není na 3 místech řešen jednoduše. Potřeboval bych konzultaci o té kalkulačce, co bych mohl vylepšit atd.. privátně, nemohu to zveřejnit a je to větší projekt na několik balíčků.

Nahlásit jako SPAM
IP: 46.229.123.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 41 hostů

Podobná vlákna

C# - Enabled na Check boxu — založil polerok

Parsování do pole — založil georginho

Parsování stringu v C++ — založil jirkab

Parsování textu — založil chrris

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý