Konwerter ONP problem z ładowaniem łańcucha do po programu.
Ostatnio zmodyfikowano 2018-05-14 20:10
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 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 } while( el[ 0 ] != '=' );
ok, zgadza się wartosc el[0] jest rożna od "=" przechodzimy znowu na początek kodu 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: 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... |
|
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. |
|
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. #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 ); schowek = strtok( NULL, korektor ); if( el[ 0 ] >= '0' && el[ 0 ] <= '9' ) { cout << el << " "; tymczasowy += el; } else switch( el[ 0 ] ) { case '+':; case '-': while( ws && stos[ ws - 1 ] != '(' ) { cout << stos[ --ws ] << " "; tymczasowy += stos; } stos[ ws++ ] = el[ 0 ]; break; case '*':; case '/': while( ws && stos[ ws - 1 ] != '(' && stos[ ws - 1 ] != '+' && stos[ ws - 1 ] != '-' ) { cout << stos[ --ws ] << " "; tymczasowy += stos; } stos[ ws++ ] = el[ 0 ]; break; case '^': while( ws && stos[ ws - 1 ] == '^' ) { cout << stos[ --ws ] << " "; tymczasowy += stos; } stos[ ws++ ] = el[ 0 ]; break; case '(': stos[ ws++ ] = '('; break; case ')': while( stos[ ws - 1 ] != '(' ) { cout << stos[ --ws ] << " "; tymczasowy += stos; } ws--; break; case '=': while( ws ) { cout << stos[ --ws ] << " "; tymczasowy += stos; } cout << " =\n\n"; break; } } while( el[ 0 ] != '=' ); } cout << endl << tymczasowy; return 0; }
Mam jeszcze jedno pytanie. Chciałbym wydrukować na koniec w zmiennej tymczasowy wynik przekształcenia. O ile 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. |
|
pekfos |
» 2018-05-14 18:52:37 cout << stos[ --ws ] << " "; tymczasowy += stos;
|
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. |
|
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. 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 case '*':; case '/': while( ws && stos[ ws - 1 ] != '(' && stos[ ws - 1 ] != '+' && stos[ ws - 1 ] != '-' ) { cout << stos[ --ws ] << " "; tymczasowy += stos; } stos[ ws++ ] = el[ 0 ]; break;
ale generuje to powyższe śmieci, także coś źle robię... jeżeli z kolei użyje zapisu tymczasowy += stos[ - ws ];
generuje to zapętlenie programu... Takżę nie wiem czy mam tu problem z konwersją danych... |
|
1 2 « 3 » |