Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] konwerter wyrażeń na ONP

Ostatnio zmodyfikowano 2013-10-10 17:36
Autor Wiadomość
Katruf
Temat założony przez niniejszego użytkownika
[C] konwerter wyrażeń na ONP
» 2013-10-09 22:05:00
Witam
napisałem prosty konwerter, ale nie we wszystkich przypadkach działa tak jak powinien, przy niektórych wyrażeniach po prostu program przestaje działać.
nie potrafię znaleźć zgrzytu ... problem leży albo przy operatorach albo przy nawiasach tylko ja nie wiem co może być tam źle

wklejam kod, w komentarzach umieszczam kolejne kroki algorytmu według którego postępowałem
C/C++
stos * wsk = NULL;
char wyraz[ ile ] = { "a*a*a" };
char pom;
int i;


for( i = 0; i < ile; i++ ) {
   
    if((( int ) wyraz[ i ] > 96 ) &&(( int ) wyraz[ i ] < 123 ) ) {
        printf( "%c ", wyraz[ i ] );
        /* Jeśli symbol jest liczbą dodaj go do kolejki wyjście. */
    } else if(( wyraz[ i ] == '+' ) ||( wyraz[ i ] == '-' ) ||( wyraz[ i ] == '*' ) ||( wyraz[ i ] == '/' ) ||( wyraz[ i ] == '^' ) ) {
        if( wsk != NULL ) {
            while( porownaj( wyraz[ i ], wsk->symbol ) ) { /*wsk->symbol to najwyższy element stosu*/
               
               
                printf( "%c ", zdejmij_ze_stosu( & wsk ) );
               
               
            }
        }
       
        dodaj_na_stos( & wsk, wyraz[ i ] );
        /*
        Jeśli symbol jest operatorem, o1, wtedy:
        1) dopóki na górze stosu znajduje się operator, o2 taki, że:
        o1 jest lewostronnie łączny i jego kolejność wykonywania jest mniejsza lub równa kolejności wyk. o2,
        lub
        o1 jest prawostronnie łączny i jego kolejność wykonywania jest mniejsza od o2,
        zdejmij o2 ze stosu i dołóż go do kolejki wyjściowej i wykonaj jeszcze raz 1)
        2) włóż o1 na stos operatorów.
        */
    } else if( wyraz[ i ] == '(' ) {
        dodaj_na_stos( & wsk, wyraz[ i ] );
        //Jeżeli symbol jest lewym nawiasem to włóż go na stos.
    } else if( wyraz[ i ] == ')' ) {
        pom = zdejmij_ze_stosu( & wsk );
        while( pom != '(' ) {
            printf( "%c ", pom );
            pom = zdejmij_ze_stosu( & wsk );
        }
        /*
        Jeżeli symbol jest prawym nawiasem to zdejmuj operatory ze stosu i dokładaj je do kolejki wyjście,
        dopóki symbol na górze stosu nie jest lewym nawiasem, kiedy dojdziesz do tego miejsca zdejmij lewy
        nawias ze stosu bez dokładania go do kolejki wyjście. Teraz, jeśli najwyższy element na stosie jest
        funkcją, także dołóż go do kolejki wyjście. Jeśli stos zostanie opróżniony i nie napotkasz lewego
        nawiasu, oznacza to, że nawiasy zostały źle umieszczone.
        */
    }
   
   
   
}

while( wsk != NULL ) printf( "%c", zdejmij_ze_stosu( & wsk ) );
//Jeśli nie ma więcej symboli do przeczytania, zdejmuj wszystkie symbole ze stosu (jeśli jakieś są) i dodawaj je do kolejki wyjścia.
//(Powinny to być wyłącznie operatory, jeśli natrafisz na jakiś nawias oznacza to, że nawiasy zostały źle umieszczone.)

i funkcja porównująca
C/C++
int porownaj( char p, char d ) {
   
   
    int wp = 0, wd = 0;
    if( p == '(' ) wp = 0;
   
    if( d == '(' ) wd = 0;
   
    if(( p == '+' ) ||( p == '-' ) ) wp = 1;
   
    if(( d == '+' ) ||( d == '-' ) ) wd = 1;
   
    if(( p == '*' ) ||( p == '/' ) ) wp = 2;
   
    if(( d == '*' ) ||( d == '/' ) ) wd = 2;
   
    if( p == '^' ) wp = 3;
   
    if( d == '^' ) wd = 3;
   
    printf( "p: %i d:%i\n", wp, wd );
    return( wp <= wd );
   
   
   
}
P-93453
DejaVu
» 2013-10-10 17:08:39
Wystarczy, że wyrażenie będzie niepoprawne i program się wysypie.
P-93477
Katruf
Temat założony przez niniejszego użytkownika
» 2013-10-10 17:17:51
tylko że np a*a*a jest poprawne a program się wysypuje :(
P-93478
DejaVu
» 2013-10-10 17:36:19
Uruchom debbugger i z miejsca masz miejsce wystąpienia błędu.
P-93481
« 1 »
  Strona 1 z 1