banjalukaforum.com https://www.banjalukaforum.com/ |
|
No 1: Parser funkcije pisan u Javi https://www.banjalukaforum.com/viewtopic.php?f=18&t=10455 |
Stranica 1 od 2 |
Autoru: | che.guevara [ 04 Nov 2004, 18:17 ] |
Tema posta: | No 1: Parser funkcije pisan u Javi |
Ok, stanje je slijedece : Dobio sam zadatak da napisem Java aplet koji ce da crta 2d funkciju. Otprilike, znam to da uradim, a najzanimljiviji rad cu da stavim ovdje na forum kako bih vama dosadjivao i slicno. ![]() ![]() Projekat se moze ovako podjeliti : I) Napraviti klasu koja obradjuje funkciju II) Napraviti interfejs appleta III) Napraviti rutinu za crtanje funkcije E pa nek mi je sa srecom ![]() PS: Mozda sam za ovo trebao da otvorim blog posto nisam siguran kad cu da zavrsim rad al ko ga šiša, samo nek se nešto piše... |
Autoru: | che.guevara [ 04 Nov 2004, 18:26 ] |
Tema posta: | Part First |
Prvi dio parser funkcije 1. Prvo da definisem sta funkcija mora da podrzava : sabiranje, oduzimanje, množenje, dijeljenje sin,cos,tan,ctg,e,pi,stepenovanje etc zagrade velike srednje male itd 2. Leksicka analiza zapisa funkcije Zatim cu da prepisem jedan dio iz knjige "Algoritmi u programskom jeziku C" - autora Dragana Uroševića : Kod: <funkcija> ::= <aditiv> [ {+|-} <aditiv> ]*
<aditiv> ::= <multip> [ {*|/} <multip> ]* <multip> ::= <faktor> [^ <faktor>]* <faktor> ::= -<funkcija> | x | (<funkcija>) | <broj> | <matem_funkc>(<funkcija>) | <broj> <matem_funkc>::= exp | sqr | sin | cos ... Nadam se da je ovo jasno. 3. E sad to fino ide u etapama, korak po korak pa rekurzija ... Ovo sam uradio do pola očekujte riješenje slijedeće godine ... ![]() ![]() |
Autoru: | che.guevara [ 05 Nov 2004, 15:59 ] |
Tema posta: | |
Evo kostura klase koja sluzi za parsiranje funkcije. Kod: class FunkcijaParser {
private boolean debug=true; public void setDebug(boolean value) { this.debug = value; } private String funkcija; private class bnDrvo { // binarno drvo // --- ugradjene funkcije --- // 1.) parseFun // 2.) parseAditiv // 3.) parseMultip // 4.) parseFaktor // 5.) parseMatem -- // 6.) parseBroj -- neobavezno -- jos nisam siguran // 7.) parseVarX -- neobavezno } private bnDrvo Drvo = new bnDrvo(); public FunkcijaParser(String f) { // konstruktor } } Sad trenutno radim funkciju za parsiranje funkcije ![]() Dakle, funkcija parseFun() Sta ona radi ? Pa ako joj date string "cos(x+2) + sin(5*2) - sin(2+2)" , funkcija ce napraviti drvo cije lijevo dijete postaje aditiv "cos(x+2)" sadrzaj drveta ce biti operacija '+', sabiranje, a desno dijete ce biti ostatak funkcije "sin(5*2) - sin(2+2)". Zatim ce funkcija rekurzirati proces i to ovako: this.levo.parseAditiv("cos(x+2)"); this.desno.parseFun("sin(5*2) - sin(2+2)"); I kontate ? kad bi se pozivala samo funkcija parseFun, dobio bih slijedece drvo - za funkciju "x*2 - sin(60) + (x-2) - (x*x-0.1)" : ![]() Eto toliko za sad. Uskoro cu da napisem klasu bnDrvo i funkciju parseFun. Nadam se da neko ovo cita i da mu nije dosadno (puno) ![]() gl, hf ![]() |
Autoru: | che.guevara [ 05 Nov 2004, 23:03 ] |
Tema posta: | Gotovo ! |
Vjerovali ili ne, uradio sam ovaj prvi dio, uz dosta truda i veliku koncentraciju ........ i postoje neke izmjene u odnosu na prvobitnu zamisao : 1. Klasa bnDrvo se sada nalazi u odvojenom fajlu 2. Parse matem-varx-broj su u jednoj funkciji 3. U pocetku sam htio da podrzim i velike i uglaste zagrade, ali sam onda shvatio da se tim nista ne dobija nego samo gubi tako da sam to izbacio. NOTE: Za funkcije parseFun(), parseAditiv(), parseMultip() i parseFaktor() postoji i overloading funkcija slijedeceg formata : Kod: public int parseX(String a) { this.sadrzaj = a; this.tip = TIP_FUNKCIJA; this.parseX(); } bnDrvo.java Kod: package bnDrvo; public class bnDrvo { /* Binarno Drvo je struktura koja u uopstenom smislu ima 3 elementa : a) lijevo dijete b) desno dijete c) sadrzaj (tj "sebe" - svoju vrijednost) djeca su reference na novo drvo - na istu vrstu - na sebe */ public bnDrvo levo; public bnDrvo desno; public Object sadrzaj; public byte tip; // tip cvora= string|operator|varx etc public boolean debug; public static final byte TIP_ERROR =-1; public static final byte TIP_FUNKCIJA = 0; // neobradjeni cvor - string public static final byte TIP_OPERATOR = 1; // sabiranje, oduzimanje etc public static final byte TIP_BROJ = 2; // konstante public static final byte TIP_VARX = 3; // varijabla public bnDrvo () { // konstrutkor, poziva se pri kreiranju this.levo=null; this.desno=null; this.sadrzaj=null; this.tip = TIP_ERROR; this.debug = true; } } ovo je bez funkcija, a evo kako idu funkcije : parseFun() Kod: public int parseFun() {
// vraca/returns : // 1: posao obavljen po propisu :DD // 0: posao obavljen (sa mogucom programskom greskom) //-1: sintaksna greska // ovu funkciju treba pokrenuti na pocetku // ok, treba parsiratit this.sadrzaj String f; if ((this.tip != TIP_FUNKCIJA) || !(this.sadrzaj instanceof String)) return -1; else f=(String) this.sadrzaj; if (f.length()<1) return 0; int i; int zagrade=0; char ch; // dakle, f treba rastaviti na aditive (dijelove odvojene plusem i minusem) // sad cu da napravim jedan aditiv i on ce da bude u lijevoj grani drveta // dok cu ostatak prebaciti u desnu granu i pozvacu njegov parseFun this.levo = new bnDrvo(); this.desno = new bnDrvo(); // for krece od 1 zato jer prvo slovo moze biti minus sto bi moglo malo // da zbuni parser , pa tako krece od drugog slova for (i=1; i<f.length(); i++) { ch = f.charAt(i); // slovo po slovo - FUNKCIJA :DD switch (ch) { case '(': zagrade++; break; case ')': zagrade--; break; case '+': case '-': if (zagrade != 0) break; // dakle imam aditiv i sad ga trebam smjestiti lijevo mjesto String operand = new String(); operand+= ch; this.sadrzaj = operand; // sabiranje/oduzimanje this.tip = TIP_OPERATOR; String a = f.substring(0,i); // lijevi aditiv String b = f.substring(i+1,f.length()); // desni ostatak if (debug) System.out.println("\tbn* l=" + a + " d=" + b); this.levo.parseAditiv(a); // sad parsiram ovaj aditiv this.desno.parseFun(b); // i ostatak return 1; // k, sve ok } // switch } // for if (zagrade!=0) { this.tip = TIP_ERROR; System.out.println("Greska sa zagradama !\n"); return -1; } // dakle, vise aditiva nije pronadjeno // to znaci da je cijela funkcija sastavljena od jednog aditiva return this.parseAditiv(); } // funkcija |
Autoru: | che.guevara [ 05 Nov 2004, 23:07 ] |
Tema posta: | |
parseAditiv() Kod: int parseAditiv() {
// ovu funkciju poziva funkcija parseFun /* da se podsjetimo // <aditiv> ::= <multip> [ {*|/} <multip>]* // kao i u proslom slucaju sredicu prvi multiplikativ // a ostatak cu da proslijedim dalje kao aditiv */ String f; if ((this.tip != TIP_FUNKCIJA) || !(this.sadrzaj instanceof String)) return -1; else f=(String) this.sadrzaj; if (f.length()<1) return 0; int i; int zagrade=0; char ch; this.levo = new bnDrvo(); this.desno = new bnDrvo(); for (i=0; i<f.length(); i++) { ch = f.charAt(i); // slovo po slovo - FUNKCIJA :DD switch (ch) { case '(': zagrade++; break; case ')': zagrade--; break; case '/': case '*': if (zagrade != 0) break; // dakle imam aditiv i sad ga trebam smjestiti lijevo mjesto String operand = new String(); operand+=ch; this.sadrzaj = operand; // mnozenje , dijeljenje this.tip = TIP_OPERATOR; String l = f.substring(0,i); // lijevi multiplikativ String d = f.substring(i+1,f.length()); // desni ostatak this.levo.parseMultip(l); // sad parsiram ovaj aditiv this.desno.parseAditiv(d); // i ostatak return 1; // k, sve ok } // switch } // for if (zagrade!=0) { this.tip = TIP_ERROR; System.out.println("Greska sa zagradama !\n"); return -1; } // dakle, vise multiplikativa nije pronadjeno // to znaci da je cijela funkcija sastavljena od jednog multiplikativa return this.parseMultip(); } Kao sto mozete da primjetite (pogotovo kod switch bloka) ova funkcija je veoma slicna prethodnoj a bogme i narednoj ! |
Autoru: | che.guevara [ 05 Nov 2004, 23:11 ] |
Tema posta: | |
parseMultip() Kod: int parseMultip() {
// <multip> ::= <faktor> [^<faktor>]* String f; if ((this.tip != TIP_FUNKCIJA) || !(this.sadrzaj instanceof String)) return -1; else f=(String) this.sadrzaj; if (f.length()<1) return 0; int i; int zagrade=0; char ch; this.levo = new bnDrvo(); this.desno = new bnDrvo(); for (i=0; i<f.length(); i++) { ch = f.charAt(i); switch (ch) { case '(': zagrade++; break; case ')': zagrade--; break; case '^': if (zagrade != 0) break; // k, nasao sam faktor String operand = new String(); operand+= ch; this.sadrzaj = operand; this.tip = TIP_OPERATOR; String l = f.substring(0,i); // faktor himself String d = f.substring(i+1,f.length()); // ostatak if (debug) System.out.println("\tbn* l=" + l + " d=" + d); this.levo.parseFaktor(l); this.desno.parseMultip(d); return 1; } // switch } // for if (zagrade!=0) { this.tip = TIP_ERROR; System.out.println("Greska sa zagradama !\n"); return -1; } // ako funkcija dodje dovde to znaci da je sve ovo faktor return this.parseFaktor(); } Toliko za sada. Ostaje jos jedna funkcija, parseFaktor() koja je najzanimljivija, a nju cu dodati sutra najvjerovatnije. Zdravo. I samo jedno pitanje... cita li neko ovo sto ja pisem ??? |
Autoru: | Digresija [ 05 Nov 2004, 23:23 ] |
Tema posta: | |
Naravno da citamo ![]() Da li vec radis u nekoj firmi ili studiras jos uvijek (odnosno ides u skolu neku)? |
Autoru: | che.guevara [ 05 Nov 2004, 23:30 ] |
Tema posta: | |
Digresija je napisao: Naravno da citamo
![]() Da li vec radis u nekoj firmi ili studiras jos uvijek (odnosno ides u skolu neku)? ja sam sirotan ![]() ![]() |
Autoru: | che.guevara [ 05 Nov 2004, 23:42 ] |
Tema posta: | |
E, evo, ajde da stavim i ovo - parser faktora. Faktor Vam dodje kao jedna raskrsnica - ova funkcija moze da pozove cijeli proces iz pocetka (prouzrokovano zagradama i matematickim funkcijama) ili moze da zavrsi sirenje binarnog drveta tako sto upise jednu od mogucih krajnjih vrijednosti : broj, varijablu x ili konstantu (e i pi) parseFaktor() Kod: int parseFaktor() {
/* FAKTOR : ovo je najvazniji - tezi - dio Postoje slijedece mogucnosti: 1) -<funkcija> #ovo prepoznajem po znaku minus !!! (oleeeee !!!) 2) x #varijabla x 3) (<funkcija>) # dakle ako pocinje i zavrsava sa zagradama 4) <broj> # ako pocinje sa cifrom 5) <matematickafunkcija(<funkcija>)> # ako pocinje sa nekim slovima */ String f; if ((this.tip != TIP_FUNKCIJA) || !(this.sadrzaj instanceof String)) return -1; else f=(String) this.sadrzaj; if (f.length()<1) return 0; this.levo = new bnDrvo(); this.desno = new bnDrvo(); // ********** PRVI SLUCAJ - "-<funkcija>" if (f.charAt(0)=='-') { // ovo je jednako mnozenju sa -1 ili oduzimanju od 0 // ja cu uzeti oduzimanje od nula a mozda brze je samo promjeniti znak // tako da onaj ko hoce bolje, neka malo prouci ovo sto pisem // i lako ce shvatiti kako to da napravi ... (mnozenje sa -1...) this.tip = TIP_OPERATOR; this.sadrzaj = "-"; // oduzimanje this.levo.tip = TIP_BROJ; this.levo.sadrzaj = new Double(0); // dakle, 0 - <funkcija> = - <funkcija> this.desno.tip = TIP_FUNKCIJA; return this.desno.parseFun(f.substring(1,f.length()) ); } // ********** DRUGI SLUCAJ - "x" else if (f.charAt(0)=='x' && f.length()==1) { this.tip = TIP_VARX; this.sadrzaj = ""; return 1; } // ********** TRECI SLUCAJ - "{ ( <funkcija> ) }" else if (f.charAt(0)=='(') { this.tip = TIP_FUNKCIJA; // e, od sadrzaja treba odcjepiti zagrade // NOTE: mozda vam se ucini da se na kraju mozda ne nalazi // zatvorena zagrada, medjutim, ako je funkcija ispravno napisana, // na kraju se sigurno nalazi zatvorena funkcija, inace ovo ne bi // bio faktor vec bi od njega nastao aditiv-multiplikativ etc // primjer : (x+2) + 2 nikako ne bi bio faktor jer bi ga funkcija // parseFun iscjepala do (x+2) i 2. Kao sto vidite // na kraju ostanu ili faktori bez zagrada(2) ili sa zagradama (x+2) this.sadrzaj = f.substring(1,f.length()-1); return this.parseFun(); } // ********** CETVRTI SLUCAJ - BROJ - "<{0..9}* [ . {0..9}*]>" else if ("0123456789".indexOf(f.charAt(0)) >=0) { // gore sam objasnio notaciju obicnog broja (cijeli i decimalni) // hvala Sunu (bogu???) pa je ugradio double parser tako da se tu // ne trebam muciti this.tip = TIP_BROJ; this.sadrzaj = new Double(Double.parseDouble(f)); return 1; } // ********** PETI SLUCAJ - MATEMATICKA FUNKCIJA - cos, sin, tan, pow itd else { // e, za pocetak, u ovu grupu spadaju i neke konstante : pi i e if (f=="pi") { this.tip = TIP_BROJ; this.sadrzaj = new Double(3.1415926); // TODO: zamjeni sa precizn. return 1; } else if (f=="e") { this.tip = TIP_BROJ; this.sadrzaj = new Double(2.7182818); // TODO: zamjeni sa precizn. return 1; } // <string> <(<funkcija>)> // ili <imefunkcija>(<argumentfunkcije>) // pa, onda, prvo da vidimo koje je ime funkcije ..... // ime cu pronaci funkcijom String.substring(0,m) - e ovo m trebam naci // -- trebam naci index prve otvorene zagrade int m = f.indexOf('('); if (m<0) { // greska ! this.tip = TIP_ERROR; System.out.println("Greska sa matematickom funkcijom - nema otvorene !\n"); return -1; } // moram da provjerim da li se faktor zavrsava sa istom zagradom // sa kojom i pocinje if (f.charAt(f.length()-1) != ')') { System.out.println("Greska kod matematicke funkcije, nema zavrsne "+ "zagrade !\n"); this.tip = TIP_ERROR; return -1; } String ime; String argument; ime = f.substring(0,m); argument = f.substring(m+1,f.length() -1); // bez zagrada ... // ova debug linija sluzi za provjeravanje imena funkcije i njenog argumenta ... if (debug) System.out.println("\t\tIME=" + ime + " ARG=" + argument); // ime funkcije je sadrzaj, a argument funkcije // je lijevo dijete (lepo belo levo dete 0_o_O) // dok ce desno dete biti null jer nije potrebno ))): this.tip = TIP_OPERATOR; this.sadrzaj = ime; this.levo.tip = TIP_FUNKCIJA; return this.levo.parseFun(argument); } // kraj petog slucaja // ********** NOTE: trebao bih ubaciti i provjeru gresaka, ali // ********** to cu poslije jer sad imam drugi prioritet //this.tip = TIP_ERROR; //return -1; // nije moguce dosegnuti } Ovaj parser (srp obradjivac ???) se moze nadograditi naprednim funkcijama za provjeru gresaka, medjutim, u mom slucaju, meni je potreban parser koji radi ili neradi - dakle bez sugestija i slicnog debilisanja. Svakako, to je nekad potrebno, i zato sam i stavio ovaj kod ovdje da ako nekom treba, nek ga modifikuje pa nam pokaze sta je napravio ![]() PS: Za ovaj prvi dio (prvi u odnosu na cijeli projekat 2d funkcije [ koji je opet jedan dio projekta razvoja eLearning-a u Republici Sripskoj] ovo je samo parser stringa - funkcije) ostaju nam jos jedan problem - naime sad imamo binarno drvo - i sta sa njim? E sad je potrebno napisati funkcije - klasu koja ce racunati vrijednost tog drveta... cu |
Autoru: | Frenki [ 06 Nov 2004, 00:33 ] |
Tema posta: | |
E ovaj kada odes u Ameriku i postanes milioner ,hocemo li jos uvijek biti prijatelji ? ![]() ![]() |
Autoru: | che.guevara [ 06 Nov 2004, 16:25 ] |
Tema posta: | Kraj prvog dijela |
* Squall * je napisao: E ovaj kada odes u Ameriku i postanes milioner ,hocemo li jos uvijek biti prijatelji ?
![]() ![]() Jok, al kad odem u Kubu, pozvacu vas kao Drgove&Drugarice ![]() nego, da ja napisem i ovaj ostatak ... Ostala je funkcija getY(double x) Sta ona radi ? E pa, njoj date vrijednost x i ona onda vrati svoju vrijednost za to x. Evo vam, da ne tupim dalje, kod : getY(double x) Kod: /////////////////////////////////////////////////////////////////////////////////////// // RACUNANJE FUNKCIJE ZA VRIJEDNOST X // /////////////////////////////////////////////////////////////////////////////////////// public double getY(double x) { switch (this.tip) { case TIP_FUNKCIJA: case TIP_ERROR: System.out.println("Greska pri racunanju - izgleda da funkcija nije dobro parsirana!\n"); return 0; case TIP_OPERATOR: if (!(this.sadrzaj instanceof String)) { // ne vjerujem da je ovaj blok moguce dosegnuti, ali moje je da se osiguram :))) System.out.println("Greska prilikom racunanja operatora!\n"); return -1; } String op = this.sadrzaj.toString(); // iliti (String) this.sadrzaj if (op.equals("+")) { return this.levo.getY(x) + this.desno.getY(x); } else if (op.equals("-")) { return this.levo.getY(x) - this.desno.getY(x); } else if (op.equals("/")) { double tmp = this.desno.getY(x); if (tmp==0) { // dijeljenje sa nulom, Metalova sugestija :)) // --- nikad se sam ne bih sjetio 0_OOOO_o System.out.println("Dijeljenje nulom !\n"); return 0.0; } return this.levo.getY(x) / tmp; } else if (op.equals("*")) { return this.levo.getY(x) * this.desno.getY(x); } else if (op.equals("^")) { return Math.pow(this.levo.getY(x), this.desno.getY(x)); } /////////////// MATEMATICKE FUNKCIJE //////////////////// // NOTE: trebam ugraditi provjeru - slicnu kao i ovu gore za x/0 else if (op.equals("sin")) { return Math.sin(this.levo.getY(x)); } else if (op.equals("cos")) { return Math.cos(this.levo.getY(x)); } else { if (debug) System.out.println("Trazena je nepoznata funkcija !\n"); return 0.0; // OVO JE PRIVREMENA VRIJEDNOST - dakle nepoznata funkcija vraca 0 // inace, slovodno dodajte nove funkcije ako vam trebaju } case TIP_VARX : if (debug) System.out.println("\t\t VARX " + x); // TODO: varijabla : modifikovanjem ovog dijela, i dijela parsiranja faktora // moguce je za minut napraviti parser koji npr ima dvije varijable // recimo x i y a rezultat bi onda bio z - kontate ? === 3D funkcija!!! /////// return x; case TIP_BROJ : Double Dbl = (Double) this.sadrzaj; double dbl = Dbl.doubleValue(); if (debug) System.out.println("\t\tBROJ :: " + dbl); return dbl; default: if (debug) System.out.println("Definitivno, nesto je prolupalo u vezi sa bnDrvo.tip varijablom !"); } // switch return 0; } // ::~ /**************************** LOG PART **************************** 6. novembar 2004 : GRESKA : prilikom parsiranja izraza (-2) * (-2) javlja se greska - objasnjenje : problem je sa ovom prvom zagradom, izraz -2 * (-2) je ispravno - ***: negativan broj - izraz -M se pise ovako (-M) dakle, mora biti okruzen zagradama !!!! primjer 5 * (-3) = -15 - ***: pojednostavio sam gresku : problem je ako funkcija pocinje sa otvorenom zagradom ! Odoh da pogledam ko pravi probleme ..... hm greska je u parseFun funkciji - zbog onog prvog slova parser preskoci prvu zagradu i onda misli(m) da je izraz neispravan - POPVRAVLJENO : dodao sam jedan if ispred pocetka petlje u parseFun funkciji DEBUG: debug varijabla je postala static i po defaultu ima vrijednost false */ Kao sto vidite na kraju, dodao sam jedan veliki komentar, tj log. Nasao sam neki bug tako da u kodu koji sam pisao ranije treba promjeniti koji red. Inace ideja je sasvim ista. *** Jos nesto : ova vrijednost x , ona se svaki put trpa na stek kad se daje nekom drvetu, pa sam razmisljao da je stavim da bude static (zajednicka memorija za sve instance iste klase) medjutim, sta ako imam dva parsera sa razlicitim x vrijednostima??? Posto se jos uvijek ne razumjem u javu bas najbolje, neka ostane ovako, kad sam vrsio provjere, za koliko god veliku unijetu funkciju nije bilo problema sa manjkom memorije ili brzine. Za sami kraj ovog prvog dijela parsera ostaje jos jedna klasa - fajl. To ce biti interfejs sa korisnikom - interfejs u smislu da ce programer koji koristi parser praviti instancu ove klase a ne klase bnDrvo. Sve u svemu njena uloga je da obezbjedi prosljedjivanje ispravne funkcije drvetu i etc etc itd itd itd evo koda : FunkcijaParser.java Kod: package FunkcijaParser; import bnDrvo.bnDrvo; public class FunkcijaParser { // @author Srecko Toroman // @description: /* Ovoj klasi se daje string iz kojeg ona pravi jedno drvo iz kojeg se mogu dobiti rezultati za neko x (opis je los, okok) */ // My favourite color is blue ... no! Yellow !~-_,.. ,. . // k, ova klasa koristi klasu bnDrvo koja razdvaja string u drvo // a zatim ova klasa rekurzijom uvrstava x u drvo i izracunava // vrijednost funkcije ...... // NOTE: primjetio sam jedan problem sa zagradama // ne znam tacno o cemu se radi, ali preporucujem da koristite samo male zagrade private boolean debug=true; public void setDebug(boolean value) { this.debug = value; } private int isParsed = -1; public bnDrvo Fun; // prebaciti na private kad se otklone bugovi public FunkcijaParser() { this.Fun = new bnDrvo(); this.Fun.tip = new bnDrvo().TIP_ERROR; this.Fun.sadrzaj = ""; } public FunkcijaParser(String funkcija) { this.Fun = new bnDrvo(); this.Fun.sadrzaj = formatiraj(funkcija); this.Fun.tip = new bnDrvo().TIP_FUNKCIJA; } public int Parse(String s) { isParsed=this.Fun.parseFun(formatiraj(s)); return isParsed; } public double IzracunajY (double X) { if (this.isParsed==1) return this.Fun.getY(X); else return -1; } private String formatiraj(String a) { a.toLowerCase(); // sve ide u mala slova StringBuffer nospc = new StringBuffer(); // String a bez razmaka (blankova) for (int i=0; i<a.length(); i++) if (a.charAt(i)!=' ') nospc.append(a.charAt(i)); return nospc.toString(); } } To je taj zavrsni kod. E sad, KO GOD HOCE (a sigurno ima takvih ljudi) - komotno moze skinuti ove klase (koje cu uskoro da nakacim na svoj sajt) i koristi ih do mile [ne]volje. Evo primjer fajla - test koji isprobava parser test_prvi.java Kod: import FunkcijaParser.FunkcijaParser;
import java.io.*; public class test_prvi { public static void main (String[] args) { System.out.println("TEST PRVOG DIJELA PROJEKTA:\n"); FunkcijaParser parser = new FunkcijaParser(); String funkcija = ""; BufferedReader ulaz = new BufferedReader ( new InputStreamReader(System.in)); try { funkcija = ulaz.readLine(); } catch (Exception e) { } int status=parser.Parse(funkcija); System.out.println("Status parsiranja je : " + status); // 1 ok - ostalo nije dobro double x; String xstr="0"; try { xstr = ulaz.readLine(); } catch (Exception e) { System.out.println(e.toString()); } x = Double.parseDouble(xstr); System.out.println("iiiiii ! Rezultat = " + parser.IzracunajY(x)); } } Eto time zavrsavam ovaj prvi dio. Sad cu malo da prokopam po netu i knjigama da nadjem kako se koriste text boxovi i labele i ostale djindjurije u javi pa da napravim jednu klasu koja ce ustvari biti prozor apleta. I da, zbog smanjenja velicine, drugi i treci dio projekta najvjerovatnije idu u isti fajl .... Pozdrav ! btw, nemojte da mislite da volim javu ... mada, dan za danom, ono, pocinje malo i da mi se svidja ![]() ![]() C++/Python rulez d world |
Autoru: | che.guevara [ 06 Nov 2004, 17:13 ] |
Tema posta: | |
Evo jedan primjer, slika drveta koje je nastalo potpunim parsiranjem funkcije sin(x/2) ^ 2 ![]() |
Autoru: | Vertygo [ 06 Nov 2004, 19:10 ] |
Tema posta: | |
mislim da je losa slika sin(x/2) ^ 3 ali nema veze ionako ne znam javu pa ne pratim pretjerano ovo ![]() |
Autoru: | Frenki [ 06 Nov 2004, 21:33 ] |
Tema posta: | |
mozda je mislio sin(x/2) ^ 2 |
Autoru: | che.guevara [ 06 Nov 2004, 23:52 ] |
Tema posta: | |
e jbg malo sam se zezno. jest ^2 Nego, imam problema sa ovim apletom. Treba mi applet sa dugmetom textboxom i prostorom na koji cu da crtam. Da li neko moze da mi pomogne sa tim, ili da se sam mucim ? Usput, ovaj dosadasnji rad mozete skinuti sa adrese http://members.lycos.co.uk/sreckotoroma ... art1.2.zip |
Autoru: | che.guevara [ 07 Nov 2004, 18:43 ] |
Tema posta: | |
GOTOVO Rad mozete pogledati na stranici http://members.lycos.co.uk/sreckotoroman/ GG ! |
Autoru: | IgAc [ 07 Nov 2004, 21:59 ] |
Tema posta: | |
mozes li nam reci ko te nagovori da pravis uopste ovu klasu ![]() |
Autoru: | che.guevara [ 08 Nov 2004, 21:51 ] |
Tema posta: | |
Meni to dodje ko sex. Nemora niko da me nagovara... Inace pronasao sam nekoliko bugova. Update se nalazi na mojoj stranici (napisao sam je gore) Ustvari kad malo razmislim, Metal me nagovorio ! |
Autoru: | Frenki [ 08 Nov 2004, 23:13 ] |
Tema posta: | |
E srele mozda te ovo bude zanimalo ,mislim taman skupis pare za wireless ![]() http://www.yubecom.com/serbia_shareware.html |
Autoru: | che.guevara [ 09 Nov 2004, 20:37 ] |
Tema posta: | |
* Squall * je napisao: E srele mozda te ovo bude zanimalo ,mislim taman skupis pare za wireless
![]() http://www.yubecom.com/serbia_shareware.html lol |
Stranica 1 od 2 | Sva vremena su u UTC [ DST ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |