* 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.javaKod:
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.javaKod:
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

)

D -
C++/Python rulez d world