banjalukaforum.com

Dobrodošli na banjalukaforum.com
Danas je 19 Jul 2025, 20:01

Sva vremena su u UTC [ DST ]




Započni novu temu Odgovori na temu  [ 26 Posta ]  Idi na stranicu 1, 2  Sledeća
Autoru Poruka
PostPoslato: 04 Nov 2004, 18:17 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
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 :D

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...


Vrh
 Profil  
 
 Tema posta: Part First
PostPoslato: 04 Nov 2004, 18:26 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
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 ... :) :D


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 05 Nov 2004, 15:59 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
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 :D
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)" :

Slika

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) :D

gl, hf 0X


Poslednji put menjao che.guevara dana 06 Nov 2004, 00:26, izmenjena samo jedanput

Vrh
 Profil  
 
 Tema posta: Gotovo !
PostPoslato: 05 Nov 2004, 23:03 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
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


Poslednji put menjao che.guevara dana 05 Nov 2004, 23:21, izmenjena 2 puta

Vrh
 Profil  
 
 Tema posta:
PostPoslato: 05 Nov 2004, 23:07 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
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 !


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 05 Nov 2004, 23:11 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
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 ???


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 05 Nov 2004, 23:23 
OffLine
Veteran
Veteran

Pridružio se: 01 Jul 2004, 11:47
Postovi: 2624
Naravno da citamo :)
Da li vec radis u nekoj firmi ili studiras jos uvijek (odnosno ides u skolu neku)?

_________________
Sve sto sam napisao, slucajno je namjerno ...


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 05 Nov 2004, 23:30 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
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 :( samouki gimnazijalac :drinking: - treci razred


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 05 Nov 2004, 23:42 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
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 ;) Hajde pozdrav !

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


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 06 Nov 2004, 00:33 
OffLine
Stara kuka
Stara kuka
Korisnikov avatar

Pridružio se: 22 Maj 2003, 18:55
Postovi: 4706
E ovaj kada odes u Ameriku i postanes milioner ,hocemo li jos uvijek biti prijatelji ? :D :D

_________________
http://www.codebluestudio.com


Vrh
 Profil  
 
 Tema posta: Kraj prvog dijela
PostPoslato: 06 Nov 2004, 16:25 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
* Squall * je napisao:
E ovaj kada odes u Ameriku i postanes milioner ,hocemo li jos uvijek biti prijatelji ? :D :D

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 :)) :DD -
C++/Python rulez d world


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 06 Nov 2004, 17:13 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
Evo jedan primjer, slika drveta koje je nastalo potpunim parsiranjem funkcije
sin(x/2) ^ 2

Slika


Poslednji put menjao che.guevara dana 06 Nov 2004, 23:53, izmenjena samo jedanput

Vrh
 Profil  
 
 Tema posta:
PostPoslato: 06 Nov 2004, 19:10 
OffLine
Majstorski kandidat
Majstorski kandidat
Korisnikov avatar

Pridružio se: 12 Jul 2001, 01:00
Postovi: 457
Lokacija: Banjaluka
mislim da je losa slika sin(x/2) ^ 3 ali nema veze ionako ne znam javu pa ne pratim pretjerano ovo ;)

_________________
Ivan M.


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 06 Nov 2004, 21:33 
OffLine
Stara kuka
Stara kuka
Korisnikov avatar

Pridružio se: 22 Maj 2003, 18:55
Postovi: 4706
mozda je mislio sin(x/2) ^ 2

_________________
http://www.codebluestudio.com


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 06 Nov 2004, 23:52 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
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


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 07 Nov 2004, 18:43 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
GOTOVO
Rad mozete pogledati na stranici
http://members.lycos.co.uk/sreckotoroman/

GG !


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 07 Nov 2004, 21:59 
OffLine
Početnik
Početnik
Korisnikov avatar

Pridružio se: 16 Apr 2002, 01:00
Postovi: 70
mozes li nam reci ko te nagovori da pravis uopste ovu klasu :)


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 08 Nov 2004, 21:51 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
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 !


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 08 Nov 2004, 23:13 
OffLine
Stara kuka
Stara kuka
Korisnikov avatar

Pridružio se: 22 Maj 2003, 18:55
Postovi: 4706
E srele mozda te ovo bude zanimalo ,mislim taman skupis pare za wireless :D

http://www.yubecom.com/serbia_shareware.html

_________________
http://www.codebluestudio.com


Vrh
 Profil  
 
 Tema posta:
PostPoslato: 09 Nov 2004, 20:37 
OffLine
Urednik
Urednik

Pridružio se: 26 Jun 2003, 21:50
Postovi: 2669
* Squall * je napisao:
E srele mozda te ovo bude zanimalo ,mislim taman skupis pare za wireless :D

http://www.yubecom.com/serbia_shareware.html


lol


Vrh
 Profil  
 
Prikaži postove u poslednjih:  Poređaj po  
Započni novu temu Odgovori na temu  [ 26 Posta ]  Idi na stranicu 1, 2  Sledeća

Sva vremena su u UTC [ DST ]


Ko je OnLine

Korisnici koji su trenutno na forumu: Nema registrovanih korisnika i 2 gostiju


Ne možete postavljati nove teme u ovom forumu
Ne možete odgovarati na teme u ovom forumu
Ne možete monjati vaše postove u ovom forumu
Ne možete brisati vaše postove u ovom forumu
Ne možete slati prikačene fajlove u ovom forumu

Pronađi:
Idi na:  
cron
Powered by phpBB® Forum Software © phpBB Group
Hosting BitLab
Prevod - www.CyberCom.rs