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

[C] Notacja polska - sposób

Ostatnio zmodyfikowano 2012-11-08 13:01
Autor Wiadomość
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ć?
P-68672
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ń.
P-68681
yogi
» 2012-11-06 23:55:30
<<Removed by DejaVu - jak chcesz bana to od razu to napisz>>
P-68688
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
P-68696
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 ?

C/C++
#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <istream>

#define MAX 10

using namespace std;

//deklaracja wszystkich zmiennych
char napis[ MAX ];
char tab1[ MAX ];
char tab2[ MAX ];
int a, b;
int w;
int t, i = 1;

//funkcja obliczająca notacje
int notacja( char napis[ MAX ] )
{
   
    //sprawdza czy pierwszy napis jest równy 0
    if( napis[ 0 ] == '\0' )
         return 0;
   
    else
    {
        //sprawdzamy przypadki odpowiednio:
        //'+' - dodawanie
        //'-' - odejmowanie 
        //'*' - mnożenie
        //'/' - dzielenie
        //'^' - podnoszenie do potęgi
        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;
           
            //jeszcze nie działa!!!!!!!!!!
            /*
                          case '^':
                               
                                cin>>tab1;
                                if((tab1[0]=='*')||(tab1[0]=='/')||(tab1[0]=='+')||(tab1[0]=='-')||(tab1[0]=='^'))
                                {
                                    a= notacja(tab1);
                                    cin>>tab2;
                                   
                                    w=a*notacja(tab2);
                                    return 0;
                                }
                       
                                else
                                {
                                    cin>>tab2;
                                    w=notacja(tab1)+notacja(tab2);
                                    return w;
                                }
                                break;
                                */
           
            default:
            return atoi( napis );
            break;
        }
       
    }
}

// Główna pętla programu
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
P-68795
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.
P-68828
1 « 2 »
Poprzednia strona Strona 2 z 2