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
» 2018-05-14 14:56:07
Testowałem. Tylko nie rozumiem pewnej rzeczy

PODANE z klawiatury ( 23 + 5 ) * 11 =

Wynik:



( 23 + 5 ) * 11 =
Wczytano: "("
Wczytano: "23"
23 Wczytano: "+"
Wczytano: "5"
5 Wczytano: ")"
+ Wczytano: "*"
Wczytano: "11"
11 Wczytano: "="
*  =


Process returned 0 (0x0)   execution time : 8.944 s
Press any key to continue.



Ok wprowadzony ciąg zaczyna się od "(", jak dla mnnie logiczne że el[0] będzie miał wartość '('.
Czyli

C/C++
if( el[ 0 ] >= '0' && el[ 0 ] <= '9' ) cout << el << " ";
else
switch( el[ 0 ] )

...

     case '('
: stos[ ws++ ] = '(';

break;

W tym miejscu wychodzimy z switcha

sprawdzamy warunek pętli while

C/C++
} while( el[ 0 ] != '=' );


ok, zgadza się wartosc el[0] jest rożna od "="

przechodzimy znowu na początek kodu

C/C++
if( el[ 0 ] >= '0' && el[ 0 ] <= '9' ) cout << el << " ";
else
switch( el[ 0 ] )


w którym momencie była inkrementowany lańcuch el do wartosci el[1], że badane są dalsze składowe ciagu...

druga sprawa

Jak dobrze wiem pętla do while, wykonuje przynajmniej raz wszystkie instrukcję przed zbadaniem warunku. Jeżeli wynik warunku jest true, pętla wraca na początek:
Mój mały przykład:

C/C++
using namespace std;

int main()
{
   
    int i = 0;
    int w = 0;
   
    do
    {
        ++i;
        cout << "podaj liczbe \n" << endl;
        cin >> w;
       
       
       
    } while( i < 3 );
   
    return 0;
}

Do trzech razy podajemy watość w z klawiatury, czyli kod po sprawdzeniu warunku przechodzi na sam poczatek i wykonuje cin'a też.

A w kodzie tego konwertera mimo że cin jest w pętli to po ponownym przejsciu na początek jest pomijany... oO ... nie rozumiem na jakeiej zasadzie to działa. Albo moja wiedza z podstaw programowania jest o kant dupy albo tutaj są użyte jakieś knify o których nigdy nie słyszałem...
P-171096
pekfos
» 2018-05-14 15:24:00
w którym momencie była inkrementowany lańcuch el do wartosci el[1], że badane są dalsze składowe ciagu...
To pytanie..? Nie jest nic inkrementowane. Wydawało mi się, że jak zobaczysz wyniki to będzie to oczywiste, ale jak widać nie. To nie jest jedno wczytywanie. Operator >> wczytuje do spacji, po to muszą tam być.

mimo że cin jest w pętli to po ponownym przejsciu na początek jest pomijany...
Wczytywanie jest pomijane, a zupełnie nowy "wczytany" napis się skąd wtedy bierze? Skoro wczytywanie twoim zdaniem odpada, to zostaje magia, albo promieniowanie kosmiczne.
P-171099
lewozmywak
Temat założony przez niniejszego użytkownika
» 2018-05-14 18:44:35
Nie wiedziałem że na takiej zasadzie cin i pobieranie jego danych. Tera zrozumiałem na jakiej zasadzie działa pobieranie tych danych.

Przerobiłem program i działa z wprowadzonym łańcuchem. łańcuch el2 jest rozkładany przez funkcje strtok, gdzie separatorem jest " ", kolejne jego elementy są ładowanie do łańcucha el.
Wynik przekształcenia wyrażenia jest poprawny.

C/C++
#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

int main()
{
    char stos[ 256 ], el[ 256 ], el3[ 256 ];
    int ws = 0;
    char el2[] = "( ( 2 + 7 ) / 3 + ( 14 - 3 ) * 4 ) / 2 =";
    char korektor[] = " ";
    char * schowek;
    string tymczasowy;
   
    schowek = strtok( el2, korektor );
    cout << "rodzielenie tekstu" << endl;
    while( schowek != NULL )
    {
        do
        {
           
            strcpy( el, schowek );
            //cout << str2<<endl;
            schowek = strtok( NULL, korektor );
           
           
           
            //cin >> el;
            //std::cout << "Wczytano: \"" << el << "\"\n";
           
            if( el[ 0 ] >= '0' && el[ 0 ] <= '9' )
            {
                cout << el << " ";
                tymczasowy += el; //przypisanie kolejnych el do stringa tymczasowy
            }
            else
            switch( el[ 0 ] )
            {
            case '+':;
            case '-': while( ws && stos[ ws - 1 ] != '(' )
                {
                    cout << stos[ --ws ] << " ";
                    tymczasowy += stos; //zle
                }
               
                stos[ ws++ ] = el[ 0 ];
                break;
            case '*':;
            case '/': while( ws && stos[ ws - 1 ] != '(' &&
                stos[ ws - 1 ] != '+' &&
                stos[ ws - 1 ] != '-' )
                {
                    cout << stos[ --ws ] << " ";
                    tymczasowy += stos; //zle
                }
                stos[ ws++ ] = el[ 0 ];
                break;
            case '^': while( ws && stos[ ws - 1 ] == '^' )
                {
                    cout << stos[ --ws ] << " ";
                    tymczasowy += stos; //zle
                }
                stos[ ws++ ] = el[ 0 ];
                break;
            case '(': stos[ ws++ ] = '(';
                break;
            case ')': while( stos[ ws - 1 ] != '(' )
                {
                    cout << stos[ --ws ] << " ";
                    tymczasowy += stos; //zle
                }
                ws--;
                break;
            case '=': while( ws )
                {
                    cout << stos[ --ws ] << " ";
                    tymczasowy += stos; //zle
                }
                cout << " =\n\n";
                break;
            }
           
        } while( el[ 0 ] != '=' );
       
    }
   
    cout << endl << tymczasowy; //wyswietlenie w zmiennej string całego wyrazenia
   
    return 0;
}

Mam jeszcze jedno pytanie. Chciałbym wydrukować na koniec w zmiennej tymczasowy wynik przekształcenia. O ile

C/C++
if( el[ 0 ] >= '0' && el[ 0 ] <= '9' )
{
    cout << el << " ";
    tymczasowy += el;
}

Tutaj nie mam problemów bo ciągi się dodają. O tyle w reszcie punktów pobierania danych mam problemy. Musiałbym wystąpienie stos[ --ws ] skonwertować na stringa a później dodać do wynikowego. Wiem że konwersja nie jest jakimś cięzkim wielkim tematem, ale nie potrafię znaleźc rozwiązania.
P-171102
pekfos
» 2018-05-14 18:52:37
C/C++
cout << stos[ --ws ] << " ";
tymczasowy += stos; //zle
Z czym teraz masz problem? Nie potrafisz odtworzyć zapisu, który masz już napisany w linii wyżej..? Nie będzie wyglądać identycznie, ale wciąż, to już lekka przesada.
P-171103
lewozmywak
Temat założony przez niniejszego użytkownika
» 2018-05-14 20:10:24
No niestety mam problem z poskładaniem wyniku do zmiennej. Rozumiem że dla Was jest to trywialne.

Dostaje śmieci na trzeciej linii, a powinno być dokładnie to samo co w drugiej.

C/C++
rodzielenie tekstu
2 7 + 3 / 14 3 - 4 * + 2 / =


27(( + 3( /+ 143( +( - 4( +*- ( +*- 2 /+*-
Process returned 0( 0x0 ) execution time
    : 0.012 s Press any key to continue.

Pod każdym coutem który wypluwa składową odpowiedzi, próbuje ją przypisać do zmiennej tymczasowy

C/C++
case '*':;
case '/': while( ws && stos[ ws - 1 ] != '(' &&
stos[ ws - 1 ] != '+' &&
stos[ ws - 1 ] != '-' )
{
    cout << stos[ --ws ] << " ";
    tymczasowy += stos; //przypisanie
}
stos[ ws++ ] = el[ 0 ];
break;

ale generuje to powyższe śmieci, także coś źle robię...

jeżeli z kolei użyje zapisu

C/C++
tymczasowy += stos[ - ws ];

generuje to zapętlenie programu...

Takżę nie wiem czy mam tu problem z konwersją danych...
P-171108
1 2 « 3 »
Poprzednia strona Strona 3 z 3