ediepl Opublikowano 23 Maja 2016 Udostępnij Opublikowano 23 Maja 2016 Mój stary skrypt Odwrotnej Notacji Polskiej, może się komuś przyda. Tak wiem, mały bałagan w kodzie, ale chociaż jest wyjście na debug :D Użycie: liczba = ONP("2+2*2/(3-3*3)"); GML (ONP) var line = argument0; var stos; var wyjscie; var a = 0; var b = 0; var c = ""; var str = ""; var wsk = 1; var l1 = 0; var l2 = 0; var wynik = 0; var size = 0; show_debug_message("line = " + line) while(1) { str = ""; c = string_copy(line,wsk,1); if( ord(c) >= ord('0') && ord(c) <= ord('9') ) { while(1) { c = string_copy(line,wsk,1); if(ord(c) >= ord('0') && ord(c) <= ord('9')) { str += c; wsk++; }else { break; } } wyjscie[b++] = str; } else if( c == '+' || c == '-') { while(stos[a-1] == "*" || stos[a-1] == "/" || stos[a-1] == '+' || stos[a-1] == '-' || stos[a-1] == ")") { wyjscie[b++] = stos[--a]; if(a == 0) break; } if(a == -1) a = 0; stos[a++] = c; wsk++; }else if(c == '*' || c == '/') { if( a == 0 ) { stos[a++] = c; } else { while(stos[a-1] == "*" || stos[a-1] == "/") { wyjscie[b++] = stos[--a]; if(a == 0) break; } if(a == -1) a = 0; stos[a++] = c; } wsk++; } else if( c == "(" ) { stos[a++] = c; wsk++; } else if( c == ")" ) { while(stos[a-1] != "(") { wyjscie[b++] = stos[--a]; } a--; wsk++; } else if( c == " " ) wsk++; if(wsk > string_length(line)) { while(a > 0) { wyjscie[b++] = stos[--a]; } break; } } wyjscie = 0; size = b; a = 0; b = 0; show_debug_message("_______________________________________") while( 1 ) { c = wyjscie[b++]; if( ord(c) >= ord('0') && ord(c) <= ord('9') ) { stos[a++] = c; }else if(c == "+" || c == "-" || c == "*" || c == "/") { l1 = real(stos[--a]); l2 = real(stos[--a]); switch(c) { case "+": { stos[a++] = string(l1 + l2); show_debug_message( string(l1) + " + " + string(l2) + " = " + stos[a-1] ); break; } case "-": { stos[a++] = string(l2 - l1); show_debug_message( string(l2) + " - " + string(l1) + " = " + stos[a-1] ); break; } case "*": { stos[a++] = string(l1 * l2); show_debug_message( string(l1) + " * " + string(l2) + " = " + stos[a-1] ); break; } case "/": { stos[a++] = string(l2 / l1); show_debug_message( string(l2) + " / " + string(l1) + " = " + stos[a-1] ); break; } } } if(b >= size ) { wynik = real(stos[a-1]); break; } } show_debug_message("_______________________________________") show_debug_message("wynik = "+string(wynik)) return wynik; Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Danielus Opublikowano 24 Maja 2016 Udostępnij Opublikowano 24 Maja 2016 GML else if( c == '+' || c == '-') { if( c == '*' || c == '/' || a == 0) { stos[a++] = c; } wtf : d I coś strasznie długie : f Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 24 Maja 2016 Autor Udostępnij Opublikowano 24 Maja 2016 :D napisałem że stary, pisałem na szybko do kompilatora, ale ten kawałek kodu hmmm wena mnie poniosła ;p BTW: I coś strasznie długie : f that was she said E: Poprawione :) dzięki czujne oko Danielusa Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się