MS Office week
Pouze tento týden sleva až 80 % na e-learning týkající se MS Office
50 % bodů zdarma na online výuku díky naší Slevové akci!
Avatar
David Kožíšek:11.12.2019 7:35

Zdravim, potreboval bych radu, vytvarim takovou kalkulacku a potrevoval bych nejakou radu, jak ze stringu např. (String a = "1+2*4";) bych udělal výpočet výsledku v int.

Zkusil jsem: Zkoušel jsem rozsekani na char a převod na int, znamenka jsem resil podminkama, funguje to, ale problém je například uz pri "1+2*-4" potreboval bych něco univerzalnejsiho. Napadl mě ještě vytvořit strom.

 
Odpovědět
11.12.2019 7:35
Avatar
Matěj Přerovský:11.12.2019 11:54

Proč to děláš ze Stringu?

Nahoru Odpovědět
11.12.2019 11:54
42
Avatar
David Kožíšek:11.12.2019 12:03

Zadává to uzivatel. Původně je to v araylistu vzdy 1.pozice: cislo, 2.pozice: znamenko, 3... cislo, 4.. znamenko... Atd.

 
Nahoru Odpovědět
11.12.2019 12:03
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:12.12.2019 14:54

Promiň, ale mám pro tebe dvě věci. Buď si ještě jednou projdi zdejší tutoriál (od začátku a pořádně) a nebo neprogramuj. Tohle je hodně fatální myšlení (bez urážky).

V podstatě se ptáš stylem: dostanu dolar a řeším, jak je možné, že mi za něj v české jednotě neprodají chleba.

Samozřejmě, že zvráceným postupem by šel tvůj kód zparsovat na jednotlivé znaky. Problém je ovšem v tom, že ty očekáváš takový vstup. Vstupem musí být pro tebe pokud možno jedna hodnota. Potom si vybereš funkci, co s tou hodnotou provedeš.

Navíc to, cos napsal, že to zadáváš takhle v arrayListu, tak to je ještě větší tragédie. Vcelku by mě zajímalo, jak to uživatel zadává do arrayListu. Navíc, pokud je to takhle, tak bych chtěl vidět, jak bys řešil kupříkladu závorky.
Navíc, pokud to takhle chceš řešit, tak si jen trošku představím, jak bys řešil pořadí operací a mrazí mě v kostech.

Nahoru Odpovědět
12.12.2019 14:54
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:12.12.2019 15:12

Podle zadani je to skolni priklad nebo to davaji testeri pri pozadavku na praci.

Musis uz od zacatku predpokladat kombinaci znamenek a pripravit si vetveni.

if je_znamenko(znak) ...
if je_cislo(znak) ...

if je_cislo(znak) and je_cislo(predchozi_znak) hodnota = hodnota * 10 + prevod_cislo(znak)

2 * -4 = 2 * -1 * 4
2 * +4 = 2 * +1 * 4

Takhle bych to zpracoval, prevedl na samostatnou operaci.
A kdyz mas z tech podminek jasno, ze operace skoncila, cislo take skoncilo, tak pridas vzorec pro
vysledek = vysledek operace cislo

Editováno 12.12.2019 15:12
 
Nahoru Odpovědět
12.12.2019 15:12
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:12.12.2019 15:13

A mimo to se da pouzit google a najit si reseni pro dany jazyk, nebo se inspirovat.

 
Nahoru Odpovědět
12.12.2019 15:13
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na Peter Mlich
Lubor Pešek:13.12.2019 9:03

To je přesně to prasácké řešení. Ty jsi ukázal příklad pouze pro tuto ukázku, ale vůbec nepředpokládáš, že by tam mohl být speciální znak (odmocnina), závorky, více závorek, atd. atd. atd.
Prostě je to špatně navržené a tys teď ukázal, proč je to blbost. Protože tvým stylem bys měl víc podmínek, než v baltíku.

Nahoru Odpovědět
13.12.2019 9:03
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Odpovídá na Lubor Pešek
Erik Šťastný:13.12.2019 9:24

Říct, že je to špatný formát vstupu je fakt špatný argument. Prostě chce program na vyhodnocování výrazů, nemusí to ani psát uživatel a můžou se teoreticky klidně psát na řádky v souboru.

Konkrétně tohle jsem řešil a mám 706 řádkový soubor v C++ co tohle umí a to nejen matematické, ale i logické operátory.

příklady výrazů co pro mě program počítá.
2.272727x(216­−1)/5)
(x>>4)5/(4096­0.0333)
0x03700000 | (toInt(z/0.0223136)<<4

Mám tam zakomponované i specialitky, že to umí parsovat hexa čísla a zaokrouhlení pomocí toInt()

 
Nahoru Odpovědět
13.12.2019 9:24
Avatar
Odpovídá na Erik Šťastný
Erik Šťastný:13.12.2019 9:29

Ještě bych dodal, že to není vymyšlené od nuly a vycházelo se z tohohle:
EE.C Expression Evaluator

,kde je možné se inspirovat.

Editováno 13.12.2019 9:29
 
Nahoru Odpovědět
13.12.2019 9:29
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na Erik Šťastný
Lubor Pešek:13.12.2019 10:04

A kolik tam máš ifů? Nevím, jestli je tady toto přesně user friendly. Protože je vcelku nesmysl dělat takovou obecnou kalkulačku úplně na všechno - co výstupy? (kupříkladu komplexní čísla, reálná čísla).

Navíc toto je přesně ta ukázka myšlení programátora. Samozřejmě, naprogramovat se dá naprosto cokoliv (kromě 7 modrých čar červenou barvou, které jsou si navzájem kolmé). Ale pokud "proifuješ" celý prográmek, tak ti sice může v řadě případů fungovat. Ale potom to debugování, vývoj či nějaké změny.
OK! Ať nežeru, tak mě napadá snad jedno z mála optimálních řešení - vytvořit algoritmus, který by přes konfigurační soubory zpracovával vyparsovanou operaci (v konfiguráku by bylo obecně zanesené, jak má daný příklad vypočítat. Tím by se počet ifů radikálně zmenšil, ale už teď mě napadá problém u tohoto řešení se závorkami, neřkuli s několika závorkami).

Principem OOP se snažíš programovat tak, abys měl každý objekt pokud možno univerzální, lehce debugovatelný a pokud možno, aby to byla co nejmenší základní jednotka. Přesně tohle řešení, co tady napsal Peter Mlich, tak je cesta do pekel, protože nechci vidět ten vývoj a už vůbec nemluvím o tom, jak by dlouho hledal, kdyby mu kupříkladu někdo po pár týdnech řekl, aby upravil 3 funkce.(nebo aby tam přidal funkci, která využije dvě další).

Proto říkám, že tohle zadání je velmi špatně definováno.Pokud by měl už přichystanou kalkulačku, která dokáže zpracovat různé operace a potom by měl dejme tomu v jednom texťáku všechno navrkané do sebe, tak fajn, potom můžu říct: podmínkou je, aby tam byly takhle a takhle definované operace). Potom si udělá pomocnou funkci, která mu to rozparsuje a postupně provede operace, ale... stejně je i toto špatné řešení, protože hned při tom parsingu musíš řešit pořadí operací (kdybys to bral postupně, tak ti to nejdřív sečte, pak vynásobí, atd. a to je samozřejmě špatně).

Nahoru Odpovědět
13.12.2019 10:04
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Odpovídá na Lubor Pešek
Erik Šťastný:13.12.2019 10:11

Žádná hrůza na ify tam není, je to spíše zacyklené rozpasrovávání na různé úrovně.
Umí to právě řešit závorky atp. vše postupně matematicky správně.
Koukni na ten link, co jsem poslal. Je to skoro 30 let starý kód v C, kterému jsme mi dali trochu moderní C++ podobu, ale základní princip je stejný.
Jak jsem posílal ty příklady, umí to základní matematické operace, ale i bitové shifty, aj. Vše s podporou závorek a předností operátorů.

Pokud by jsi se udivoval na jaké použítí to proboha potřebuju, Tak se to týká hardwaru, přepočtů na ADC/DAC převodníky a podobně.

Zkrátka uživatel chce nastavit např na výstup 5kV a vývojář hardwaru definuje funkci pro přepočet co se má na převodník reálně poslat aby bylo 5KV na výstupu. 5000 se dosadí do výrazu za proměnnou, výraz se vyhodnotí a pošle reálně na převodník.

 
Nahoru Odpovědět
13.12.2019 10:11
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Lubor Pešek
Peter Mlich:13.12.2019 11:24

Lubor Pešek - Zadani tematu je neuplne. O tom neni sporu. Nicmene predpokladam, ze jde o jisty typ skolniho prikladu, kde to zadani zni: udelej kalkulacku, cisla 0-999, operace +-*/, mozne kombinace operaci (mysleno aby funovalo nasobeni zapornych cisel), zadne zavorky.
A kdyz k tomu pridas dotaz uzivatele, na to bys umel reagovat?
Ano, me reseni nic moc, ale pro tento pripad by mohlo fungovat.

A stejne si to mel vygooglovat :) Zkopiruje, vyzkousi, kalkulacka vyzkousi na vsechna pozadovana zadani a pokud projde, tak z kodu si pak zjisti, jak to delaji.

Editováno 13.12.2019 11:25
 
Nahoru Odpovědět
13.12.2019 11:24
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:13.12.2019 12:34

Ano, me reseni nic moc, ale pro tento pripad by mohlo fungovat

Prosím, dělej pro naší konkurenci. Kdyby kdokoliv u nás jen takhle přemýšlel, natož, aby něco takového řekl, tak by měl jen pár minut, aby si zbalil věci ze stolu. A pokud takhle programuješ, tak ok, ale prosím, nevyjadřuj se pro nováčky. Já tedy doufám, že smyslem tohoto portálu je učit a radit všem, jak DOBŘE programovat, nejen tak, aby to nějak bylo a ty ses nemusel snažit přemýšlet.

Editováno 13.12.2019 12:34
Nahoru Odpovědět
13.12.2019 12:34
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na Erik Šťastný
Lubor Pešek:13.12.2019 12:40

Chápu dobře, že tedy máš seznam operací a ten procházíš v určitém pořadí a tím to cyklíš a parsuješ neustále dokola?

Nahoru Odpovědět
13.12.2019 12:40
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Odpovídá na Lubor Pešek
Erik Šťastný:13.12.2019 13:01

Ano, správně.

 
Nahoru Odpovědět
13.12.2019 13:01
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na Erik Šťastný
Lubor Pešek:13.12.2019 13:29

takže když budeš mít jednoduchou operaci, tak ti to stejně bude kontrolovat všechny možnosti?

Nahoru Odpovědět
13.12.2019 13:29
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Odpovídá na Lubor Pešek
Erik Šťastný:13.12.2019 14:00

Nevím co si představit pod tím, kontrolovat všechny možnosti.

Zkrátka vezmeš string a procházíš ho, rozlišuješ čísla (5, 0, 0xFF) a oddělovače (*, +, (, << ), vyhodnocuješ ve správném pořadí.

Fakt bude lepší když ten kód otevřeš ;)
Prakticky to postupuje dost podobným stylem jako by jsi si to napsal na papír a dělal to v hlavě.

 
Nahoru Odpovědět
13.12.2019 14:00
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:13.12.2019 14:51

Tím myslím, že pokud dostaneš řetězec, kde budou pouze 2 operandy (například + a -), tak to stejně projde všechny operace, které mohou nastat (mimochodem, ten FTP link můžu otevřít až doma - jsem v práci a máme tu interní proxynu).

Nahoru Odpovědět
13.12.2019 14:51
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
David Kožíšek:13.12.2019 15:37

Abych to uvedl na pravou míru. O školní úkol se nejedna! Jen jsem si chtěl zkusit, jak vůbec neco takoveho udělat. Netusil jsem, že to spusti takovou diskuzi. Já tu neresim, jak udelat kalkulacku jako takovou (mozna jsem se spatne vyjádřil). Ale jak na prevod z textu na matematicky příklad. Mohu přece mít v textovem souboru zadani příkladu.

 
Nahoru Odpovědět
13.12.2019 15:37
Avatar
Ing. Petr Štechmüller:13.12.2019 16:27

Ahoj, to co hledáš je abstraktní syntaktický strom. V podstatě jde o to, že si rozsekáš celý řetězec na samostatné tokeny, které jsou dále nedělitelné: číslo, operand. Když budeš mít tento strom vytvořený, tak ho projdeš do hloubky a vždy se pokusíš vyřešit daný uzel. Toť vše.
No a protože obrázek je více, než 1000 slov, tak tady jeden přikládám. Hodně štěstí. Pokud něčemu nebudeš rozumět, tak napíš ;-).

Nahoru Odpovědět
13.12.2019 16:27
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Ing. Petr Štechmüller
David Kožíšek:13.12.2019 18:02

Diky za pořádnou odpověď.

 
Nahoru Odpovědět
13.12.2019 18:02
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 21 zpráv z 21.