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

Konwerter ONP problem z ładowaniem łańcucha do po programu.

Ostatnio zmodyfikowano 2018-05-14 20:10
Autor Wiadomość
lewozmywak
Temat założony przez niniejszego użytkownika
Konwerter ONP problem z ładowaniem łańcucha do po programu.
» 2018-05-12 15:44:45
Hej

Mam problem z kalkulatore ONP. Poniższy kod działa i zamienia normalną postać infiksową na ONP. To nie jest mój kod przyznaje się bez bicia.
http://eduinf.waw.pl/inf/utils/010_2010/0410.php
Szukam jakiegoś sposobu na konwersje infiksa na ONP, dlatego wspieram się rozwiązaniami które pomogą mi napisać własny kod.

C/C++
#include <iostream>

using namespace std;

int main()
{
    char stos[ 256 ], el[ 256 ];
    int ws = 0;
   
    do
    {
        cin >> el;
       
        if( el[ 0 ] >= '0' && el[ 0 ] <= '9' ) cout << el << " ";
        else
        switch( el[ 0 ] )
        {
        case '+':;
        case '-': while( ws && stos[ ws - 1 ] != '(' ) cout << stos[ --ws ] << " ";
           
            stos[ ws++ ] = el[ 0 ];
            break;
        case '*':;
        case '/': while( ws && stos[ ws - 1 ] != '(' &&
            stos[ ws - 1 ] != '+' &&
            stos[ ws - 1 ] != '-' ) cout << stos[ --ws ] << " ";
           
            stos[ ws++ ] = el[ 0 ];
            break;
        case '^': while( ws && stos[ ws - 1 ] == '^' ) cout << stos[ --ws ] << " ";
           
            stos[ ws++ ] = el[ 0 ];
            break;
        case '(': stos[ ws++ ] = '(';
            break;
        case ')': while( stos[ ws - 1 ] != '(' ) cout << stos[ --ws ] << " ";
           
            ws--;
            break;
        case '=': while( ws ) cout << stos[ --ws ] << " ";
           
            cout << " =\n\n";
            break;
        }
       
    } while( el[ 0 ] != '=' );
   
    return 0;
}

Chce by program przyjmował łańcuch z zmiennej, a nie podany z klawiatury przez cin. Wydawało mi się to banalnie proste. Dlatego sztywno przed pętlą deklaruje łańcuch.
Ale nie wiem czemu program później się zapętla i nic nie działa.

C/C++
#include <iostream>

using namespace std;

int main()
{
    char stos[ 256 ];
    char el[] = "23 + 5 - 5 =";
    int ws = 0;
    do
    {
       
       
       
        if( el[ 0 ] >= '0' && el[ 0 ] <= '9' ) cout << el << " ";
        else
        switch( el[ 0 ] )
        {
        case '+':;
        case '-': while( ws && stos[ ws - 1 ] != '(' ) cout << stos[ --ws ] << " ";
           
            stos[ ws++ ] = el[ 0 ];
            break;
        case '*':;
        case '/': while( ws && stos[ ws - 1 ] != '(' &&
            stos[ ws - 1 ] != '+' &&
            stos[ ws - 1 ] != '-' ) cout << stos[ --ws ] << " ";
           
            stos[ ws++ ] = el[ 0 ];
            break;
        case '^': while( ws && stos[ ws - 1 ] == '^' ) cout << stos[ --ws ] << " ";
           
            stos[ ws++ ] = el[ 0 ];
            break;
        case '(': stos[ ws++ ] = '(';
            break;
        case ')': while( stos[ ws - 1 ] != '(' ) cout << stos[ --ws ] << " ";
           
            ws--;
            break;
        case '=': while( ws ) cout << stos[ --ws ] << " ";
           
            cout << " =\n\n";
            break;
        }
       
    } while( el[ 0 ] != '=' );
   
    return 0;
}
P-171024
pekfos
» 2018-05-12 16:58:02
Wczytywanie było w pętli, ty wstawiłeś jeden łańcuch przed pętlą. To nie miało prawa zadziałać i powinieneś doskonale o tym wiedzieć.

[C++] Tworzenie parsera matematycznego
P-171030
lewozmywak
Temat założony przez niniejszego użytkownika
» 2018-05-12 22:10:31
Ale to jest ten sam program główny... W każdym razie jeśli zadeklaruje ten łańcuh w pętli też nie działa. Nie wiem gdzie mam braki ale na moje oko to powinno działać, w końcu to ten sam program główny. Jeśli mógłbyś podpowiedzieć gdzie miałbym w takim razie zadeklarować ten łańcuch?
P-171035
jankowalski25
» 2018-05-12 22:17:38
A dlaczego zawsze sprawdzasz pierwszy znak? Przez cały czas korzystasz z
el[ 0 ]
, a
el[ 1 ]
,
el[ 2 ]
 i cała reszta jest nietknięta.
P-171037
pekfos
» 2018-05-12 23:06:53
C/C++
cin >> el;
std::cout << "Wczytano: \"" << el << "\"\n";
P-171038
lewozmywak
Temat założony przez niniejszego użytkownika
» 2018-05-13 00:12:34
Troche mam problem z zrozumieniem tego kodu, jak napisałem na początku kod jest wzięty strony którą podałem. Nie rozumiem, dane są kopiowane dalej z tego ciągu, a ciągle wisi na pozycji 0... Kod działa i poprawnie zamienia notacje infiksową na ONP.

@pekfos nie mówi to za wiele :/
P-171039
pekfos
» 2018-05-13 00:24:32
@pekfos nie mówi to za wiele :/
Litości.. Dopisz tego couta do działającej wersji, to zrozumiesz czemu twoja nie ma prawa działać.
P-171040
YooSy
» 2018-05-13 00:31:32
Litości.. Dopisz tego couta do działającej wersji, to zrozumiesz czemu twoja nie ma prawa działać.
Żeby to zrobić trzeba przeanalizować kod, który się wstawiło.
Poradnik dla początkującego.
P-171041
« 1 » 2 3
  Strona 1 z 3 Następna strona