Diskuze: Ze textoveho řetězce přiklad s operatory
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 21 zpráv z 21.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Proč to děláš ze Stringu?
Zadává to uzivatel. Původně je to v araylistu vzdy 1.pozice: cislo, 2.pozice: znamenko, 3... cislo, 4.. znamenko... Atd.
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.
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
A mimo to se da pouzit google a najit si reseni pro dany jazyk, nebo se inspirovat.
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.
Ří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/(40960.0333)
0x03700000 | (toInt(z/0.0223136)<<4
Mám tam zakomponované i specialitky, že to umí parsovat hexa čísla a zaokrouhlení pomocí toInt()
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.
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ě).
Žá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.
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.
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.
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?
takže když budeš mít jednoduchou operaci, tak ti to stejně bude kontrolovat všechny možnosti?
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ě.
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).
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.
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íš .
Zobrazeno 21 zpráv z 21.