[C] Notacja polska - sposób
Ostatnio zmodyfikowano 2012-11-08 13:01
wisien92 Temat założony przez niniejszego użytkownika |
» 2012-11-06 21:43:55 to ja mam inne pytanie ... mam narazie zrobione że sprawdzam kiedy są 2 liczy i biore np. dla * 2 2 mam 4 i teraz problem bo chce w miejsce * wpisać wynik czyli 4 natomiast reszte tablicy przesunąć o 2 w miejsca gdzie były te 2jki ...
ktoś mógłby mi powiedzieć jak to w miare prostym sposobem zrobić? |
|
Admixior |
» 2012-11-06 23:05:55 Nie jestem bardzo w temacie ale jeżeli masz dane [* 2 2 x y z] to może (o ile się da) spróbowałbyś odwrócić to na [z y x 2 2 *] i wtedy masz działanie, dwie liczby i po prostu je zamieniasz. Jeżeli takie coś nie przejdzie to możesz zrobić na pojemniku typu lista on jest do tego przystosowany żeby usuwać w dowolnym miejscu bez długich kopiowań.
|
|
yogi |
» 2012-11-06 23:55:30 <<Removed by DejaVu - jak chcesz bana to od razu to napisz>> |
|
wisien92 Temat założony przez niniejszego użytkownika |
» 2012-11-07 10:48:30 hmmm ale niekoniecznie jest odrazu +11+1+111 moze być np. +1+1+11+1+12 to moze +11 wrzucic na koniec i potem 2 ostatnie elementy po prostu wyzerowac .... tylko tez niestety nie do konca wiem jak to zrobic
|
|
notsopro |
» 2012-11-07 22:20:12 narazie napisałem coś takiego ... i teraz pytanie pomógłby ktoś uprościć kod ew. żeby mniej pamięci zużywało ? #include <iostream> #include <stdlib.h> #include <math.h> #include <istream>
#define MAX 10
using namespace std;
char napis[ MAX ]; char tab1[ MAX ]; char tab2[ MAX ]; int a, b; int w; int t, i = 1;
int notacja( char napis[ MAX ] ) { if( napis[ 0 ] == '\0' ) return 0; else { switch( napis[ 0 ] ) { case '+': cin >> tab1; if(( tab1[ 0 ] == '*' ) ||( tab1[ 0 ] == '/' ) ||( tab1[ 0 ] == '+' ) ||( tab1[ 0 ] == '-' ) ||( tab1[ 0 ] == '^' ) ) { a = notacja( tab1 ); cin >> tab2; w = a + notacja( tab2 ); return w; } else { cin >> tab2; w = notacja( tab1 ) + notacja( tab2 ); return w; } break; case '-': cin >> tab1; if(( tab1[ 0 ] == '*' ) ||( tab1[ 0 ] == '/' ) ||( tab1[ 0 ] == '+' ) ||( tab1[ 0 ] == '-' ) ||( tab1[ 0 ] == '^' ) ) { a = notacja( tab1 ); cin >> tab2; w = a - notacja( tab2 ); return w; } else { cin >> tab2; w = notacja( tab1 ) - notacja( tab2 ); return w; } break; case '*': cin >> tab1; if(( tab1[ 0 ] == '*' ) ||( tab1[ 0 ] == '/' ) ||( tab1[ 0 ] == '+' ) ||( tab1[ 0 ] == '-' ) ||( tab1[ 0 ] == '^' ) ) { a = notacja( tab1 ); cin >> tab2; w = a * notacja( tab2 ); return w; } else { cin >> tab2; w = notacja( tab1 ) * notacja( tab2 ); return w; } break; case '/': cin >> tab1; if(( tab1[ 0 ] == '*' ) ||( tab1[ 0 ] == '/' ) ||( tab1[ 0 ] == '+' ) ||( tab1[ 0 ] == '-' ) ||( tab1[ 0 ] == '^' ) ) { a = notacja( tab1 ); cin >> tab2; w = a / notacja( tab2 ); return w; } else { cin >> tab2; w = notacja( tab1 ) / notacja( tab2 ); return w; } break; default: return atoi( napis ); break; } } }
int main( int argc, char * argv[] ) { cin >> t; while( t-- ) { cin >> napis; cout << notacja( napis ) << "\n"; } system( "PAUSE" ); return EXIT_SUCCESS; }
http://ideone.com/s01Zrk |
|
crash |
» 2012-11-08 13:01:26 Jak dla mnie nieco dziwne rozwiązanie. Wyrażenie powinno zostać wczytane jako całość, a pętla / funkcja / pętla w funkcji powinna wyrażenie rozłożyć znak po znaku, a nie w pętli wczytywać kolejne elementy wyrażenia i jeszcze wywoływać się rekurencyjnie - strasznie łatwo o błąd. A i staraj się nie stosować zmiennych globalnych. |
|
1 « 2 » |