Pipa

Azért érdekes élmény, hogy kész vagyok az első "komolyabb" programommal, és valahogy inkább az izgat, hogy hogyan lehetne módosítani. Mondjuk a közben beszerzett tapasztalatok is kellemesek voltak.
Kezdjük azzal, hogy hosszú ideig csodáltam a számológép-programokat, el nem tudtam képzelni, hogy hogyan is működnek. (Igaz, ehhez az is hozzájárult, hogy egyrészt nem tudtam, hogy van, aminek a forráskódjét is meg lehet tekinteni, másrészt féltem, hogy a kód bonyolultságát egyből meg sem érteném...) Ehhez képest már az is kicsit csalódás volt, hogy egyfajta gyakorlófeladatént kaptam. Az még inkább, hogy lényegében elégé nyúlfarknyi dologról van szó.
No, de hogyan is kezdjek hozzá? Eleve adott, hogy a Java, a modern kor követelményeihez igazodva, eléggé megnehezíti a nem GUI programok írását (legalábbis nekem eddig ez jött le). Tehát grafikás lesz a dolog.
Az rögtön nyilvánvaló, hogy a GUI és maga a program két különálló egység kell legyen. Logikusan gondolkodva a GUI néha változhat, illetve a számolás, mint olyan, szintén elég zaklatott életet élhet. Egyelőre a GUI-t hagyjuk, majd a végén foglalkozom vele. Illetve annyiból ne hagyjuk, hogy milyen típust kaphatunk legegyszerűbben vissza? Hát persze, stringet, szóval erre kell építeni.
No, a stringet kell szépen szétszedni, külön a számokat, és külön az operátorokat. Itt komolyan elkezdtem gondolkodni azon, hogy ezt hogyan is kellene. Az világos, hogy operátor az, ami nem szám. Aztán rájöttem, hogy ez nem teljesen igaz, mert van például előjel meg tizedesvessző. Ő, pont. Egyelőre maradjunk a pontnál (még mindig itt is tartok). Tehát szedjük szét a stringet rész-stringekre. A rész-string számmal kezdődik, vagy előjellel, illetve maga egy operátor. Az operátorokat legegyszerűbb egy stringben tárolni (lévén maguk egy-egy karakter), és mindig megnézni, hogy ami jön, az mi, aztán végigmenni, amíg valami más nem jön... Itt kezdett elbonyolódni az életem, amikor teljesen véletlenül fel nem fedeztem, hogy a kulcsszó, amit keretem, a token. Ilyen rémlett a Java dokumentációjából is. Találtam valamiTokenizer nevű izét, ami nem az volt, amit kerestem, de nagyon hasonlított rá. Akkor keressünk StringTokenizert, és lőn hepinessz és erekció. Ez azért is jó, mert a String osztályból lehet mondjuk Double osztályt gyártani. Egyedül az előjelre kell figyelni, de az nem gond. És minő szerencse, hogy az operátorokat egy Stringben adtam meg, mert ez mehet a StrinTokenizer egyik paraméterének.
No jó, már szét tudom szedni a kapott izét mizékre. No akkor a következő probléma: hogyan is számolunk? Gondoltam, hogy úgyssem lesz jó, de hogy teljesen szar legyen, azt nem. Megpróbáltam ceruzával papíron végigkövetni, de ezt a legkevésbé gondoltam értelmezhetőnek a számítógép számára. Itt kicsit le is álltam, enyhe feladásszagot érezve. Azért gyötrődtem vele, de a megoldás teljesen véletlenül jött. Az iskolai gépen kerestem Lengyel Bélára, és a Google hirtelen felajánlotta a lengyel formulát is. Ez felrémlett még ifjúkoromból. Felajzott, de sajnos a magyar wikin ilyen bejegyzls nincs. Kerestem az angolon, de kiderült, hogy nem egy Lengyel navű fasziról nevezték el, hanem egy lengyel matematikusról. Nem baj, megtaláltam, és ott lapult egy szép algoritmus is, hogyan lehet egy kifejezést ilyenné alakítani. Cirka két hét küszködés után sikerült is szépen átalakítani a beadott kifejezést fordított lengyel formára. Ennek jelentős része papíron ceruzával történt, kicsit meg is lepett, valahogy mindig úgy képzeltem, hogy ha az ember programozik, akkor leül a gép elé, és vagy néz okosan, vagy pötyög.
Az az igazság, hogy az objektumorientált szemlélet valójában valahogy úgy szólhat, hogy "osztály az, amivel van mit csinálni". Nos, az operátorokkal van mit, eleve annyi minden kapcsolt infó van, hogy egyértelműen jobb megcsinálni osztálynak, mint egy mezei stringnek. Például ott a precedencia, meg ott a velük való munka. Közben eszembe jutott, hogy az operandusok száma sem mindegy. Lett tehát egy operátor-osztály, ezzel némileg a formula-átalakító metódus is egyszerűsödött. No meg lehet csinálni egy metódust, ami egyszerűen kiszámolja a megadott paraméterek alapján a művelet eredményét.
Tehát eddig van egy osztály az operátoroknak, a kapcsolódó metódusokkal, van egy, ami kiszámol, meg a GUI. Hm, jobb lenne, ha a kiszámoló osztály tényleg csak kiszámolna, úgyhogy legyen egy külön osztály, ami a minden egyébbel foglalkozik. Kap egy stringet, abban leellenőrzi, hogy nincs-e durva hiba, aztán átadja a kiszámoló osztálynak, ami az operátor osztály segítségével átalakítja, majd kérésre ki is számolja. Természetesen van pár hibalehetőség, úgyhogy beleástam magam a kivételkezelésbe, de, mint kiderült, ez elég sekély halom.
Végül csak eljutunk a GUI-ig. Gondolkoztam, aztán rájöttem, hogy a legtöbb programmal a legnagyobb bajom, hogy teljesen felesleges dolgokkal bajmolódik - tényleg számológépnek akar kinézni. De kérdem én, mi a fasznak? Mi is kell? Egy beviteli mező, egy felirat, ahol az eredmény vagy lebaszás jelenik meg, meg két gomb (hogy szimmetrikus legyen): egy, ami kiszámol, meg egy, ami kilép. Itt még egy vidám kanyart elszórakoztam az Event nevű dolgokkal, de ezek eléggé egyszerű dolgok. Tékápé arról szól a dolog, hogy ha történik valami, akkor azzal vagy csinálok valamit, vagy leszarom (utóbbi a jellemző, ahogy nézem).
Van egy fasza számológépem. Nekem legalábbis tetszik. Csak az a kár, hogy nem tud mondjuk logaritmust számolni. Nem baj, már van ötletem, mit lehetne vele kezdeni. Másrészt pedig ez alapján nem lehet nehezebb mondjuk egy függvényábrázoló program sem, aminek viszont órán jó hasznát vennénk.
Hű, mi lesz, amikor holnap, józanul visszanézek ide...
Bassza meg újabban valahogy feszt funeral doomot hallgatok, úgyhogy azt kaptok tik is:
Pantheist - Sloth
Funeral Tears - For You
Dreams After Death - Genesis
Evoken - Into the Autumn Shade
Fallen - Gravdans

Hozzászólások

Stroustrup C++ könyvében van egy ilyen számológépes "esettanulmány", onnan tudnál meríteni ötleteket. Gondolom nem lesz túl nehéz átültetni Javába.
_____________________________
Powered by 1,3,7-trimetilxantin

Oktatáshoz, függvényábrázoláshoz: GeoGebra (szintén Java, de van webes, iOS-es, Windows Phone-os változata is).

Forráskódot nem akarod publikálni?
(pl. github.com-on)
Érdekelne, aki most kezd bele, miket művel...

Számológéppel kapcsolatban egy saját tévedés: prog.hu-n kért valaki segítséget a házifeladatához. Írjanak számológépet javascriptben. Nekem meg sem fordult a fejemben, hogy szimplán egy text mezőben bekérni a kiszámolandó kifejezést és azt egy eval segítségével... gyártottam hozzá egy többé-kevésbé számológépnek látszó weblapot, amin a számokra kattintva lehetett a számokat, a műveleti gombokra kattintva az elvégzendő műveletet bevinni. :D
(és közben anyáztam, hogy kezdő JS tanulóknak hogy lehet ilyen feladatot adni otthonra... :)) )

github céleszköz, kifejezetten forrás fájlok verziókezelésére, valamivel bonyolultabb, mint a pastebin. A pastebinre meg úgy tudom, kisebb szöveges fájlokat lehet feltölteni és képes syntax highligtingra, ha felismeri a szöveg típusát. Itt tényleg nem kell más (tán még regisztráció sem), csak feltolni a szöveget.

Akkor Pastebin egyelőre. Még valaki azt hiszi, hogy valami komoly projektről van szó...
http://pastebin.com/Lr0F5xCi
http://pastebin.com/e9s1ndmv
http://pastebin.com/0ET82wQJ
http://pastebin.com/GTHeqGkD
http://pastebin.com/Qu7rXGtK
http://pastebin.com/eirbbiVe
http://pastebin.com/CTLsQ77q
Na, itt van mind, lehet véleményezni.
--
Fight / For The Freedom / Fighting With Steel

Egyelőre érzés szintjén. Például konzolon egy n*k karakteres területen ha a karaktereket módosítani szeretném, nem találok hozzá szinte semmit. Illetve egy-két elpöttyintett, évtizedes megjegyzést igen, amik tele vannak deadlinkekkel. De nincs kizárva, hogy én vagyok a balfasz. Igaz, arra a raven nevű dologra nem néztem rá, csak folyton elfelejtem a nevét, amikor éppen ráérnék. Aztán eljövök ide, hogy visszanézzem, mert már többször volt direkt nekem címzeve is írva, csak itt belefutok valamelyik idiótába, és lőttek a hasznos munkának.
--
Fight / For The Freedom / Fighting With Steel

TUI-t felejtsd el, ha java, az elég egyértelmű, bár mintha lenne valami ncurses is hozzá, de tényleg csak mintha...
Viszont te azt írtad, hogy "nem GUI" - és ugye a szerver oldali szoftverek nagy része egyáltalán nem használ GUI-t, ennek ellenére egész jól elvannak a javaval. :)