lewozmywak Temat założony przez niniejszego użytkownika |
» 2018-05-13 01:12:53 @YooSy to twoja autoreklama czy jak? Jeżeli ktoś ma problem z przeanalizowaniem kodu do odsyłasz go do bloga o if'ach i for'ach... nie dzięki. Nie jestem programistą i nie zamierzam nim być, zmagam się z kodem i zadaniem. Mam wiedzę na poziomie obiektówki, a że brak mi praktyki, mało pisze i nie jest koderem to idzie mi jak idzie. |
|
YooSy |
» 2018-05-13 01:19:53 Tam są wskazówki jak czytać cudzy kod. Warto choć przejrzeć artykuł. Skoro nie masz zamiaru być programerem i nie masz zamiaru wkładać wysiłku w nauczenie się materiału, z który się zmagasz, wystaw ofertę i na pewno znajdzie się ktoś, kto zrobi to za ciebie.
PS: warto w pierwszym poście podać takie informacje. Ułatwisz innym życie.
|
|
lewozmywak Temat założony przez niniejszego użytkownika |
» 2018-05-13 01:45:44 @YooSy @pekfos nie zlecam takich rzeczy, sam chce się tego nauczyć, tylko ciężko mi idzie z programowaniem. Ćwiczenia i nauka to jedno, a pisanie i analizowanie czyjegoś kodu inna bajka - przynajmniej w moim wydaniu.. Pogubiłem się w tym kodzie. Przykro mi że moje trywialne pytania was denerwują, |
|
YooSy |
» 2018-05-13 01:54:49 Przykro mi że moje trywialne pytania was denerwują, |
Nie denerwują. Podesłałem materiał, który może ci pomóc, i tyle. Czy z niego skorzystasz to twoja sprawa. |
|
pekfos |
» 2018-05-13 10:51:02 To co z tym całym rozumieniem problemu? Odrobiłeś może pracę domową? |
|
garlonicon |
» 2018-05-13 13:11:09 Skoro na właściwym kodzie ciężko sobie z tym poradzić, to może sytuacja będzie jaśniejsza na uproszczonym przykładzie. Mamy sobie program, który czyta "Hello worlda" znak po znaku, jakoś tak: char znak; do { std::cin >> znak; std::cout << znak; } while( znak != '\n' ); I mamy drugi program, gdzie chcemy to samo zrobić na łańcuchu znaków. Robimy to tak samo, jak w niedziałającym przykładzie, czyli po prostu wklejamy ciąg znaków przed pętlą, a w pętli używamy pierwszego znaku. char hello[] = "Hello world!\n"; do { std::cout << hello[ 0 ]; } while( hello[ 0 ] != '\n' ); I teraz pytanie brzmi: dlaczego to nie działa? Przyczyna jest ta sama i została już podana: używasz pierwszego znaku przez cały czas. Może rozwiązanie tego uproszczonego przykładu pozwoli ruszyć dalej. |
|
lewozmywak Temat założony przez niniejszego użytkownika |
» 2018-05-14 13:23:39 W niedziele zrobiłem sobie przerwę heh. Żeby nie było sam przeanalizowałem sobie kod. #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; }
Do tej pory nie rozumiem jakim prawem to działa z cin'em. Nie ma żadnej inkrementacji łańcucha el... wszystko jest robione na pierwszym elemencie. Ale program działa prawidłowo, jak podam z klawiatury infix, to zmieni go na ONP. Oczywiście przy odpowiednim formacie np. 23 + 5 - 11 = Spacje są ważne. Związku z tym starałem, się to przerobić... Na chłopski rozum, postanowiłem stworzyć zmienną globalną int i = 0, która będzie licznikiem. Po pierwszym przejściu pętli będzie inkrementować się. W warunku while wrzuciłem funkcje strlen która liczy wilekość łancuch, i odjąłem od tego 1. Taką metodą wychodzi mi ostatnia pozycja w łańcuchu, i porównuje ją do '='. Dodaje też warunek że #include <iostream> #include <stdio.h> #include <string.h> using namespace std;
int main() { char stos[ 256 ]; int ws = 0; int i = 0; char el[] = "25 - 3 + 11 ="; cout << endl; do { if( el[ i ] >= '0' && el[ i ] <= '9' ) cout << el << " "; else switch( el[ i ] ) { case '+':; case '-': while( ws && stos[ ws - 1 ] != '(' ) cout << stos[ --ws ] << " "; stos[ ws++ ] = el[ i ]; break; case '*':; case '/': while( ws && stos[ ws - 1 ] != '(' && stos[ ws - 1 ] != '+' && stos[ ws - 1 ] != '-' ) cout << stos[ --ws ] << " "; stos[ ws++ ] = el[ i ]; break; case '^': while( ws && stos[ ws - 1 ] == '^' ) cout << stos[ --ws ] << " "; stos[ ws++ ] = el[ i ]; 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; } ++i; } while( strlen( el ) - 1 >= i && el[ strlen( el ) - 1 ] == '=' ); return 0; }
oczywiście program nie działa :/ ... taki wynik dostaje z programu 25 - 3 + 11 = 25 - 3 + 11 = 25 - 3 + 11 = - 25 - 3 + 11 = 25 - 3 + 11 = + =
Process returned 0( 0x0 ) execution time : 0.006 s Press any key to continue. Jakieś wskazówki i rady w bardziej obrazowym jezyku mile widziane. |
|
pekfos |
» 2018-05-14 13:56:39 cin >> el; std::cout << "Wczytano: \"" << el << "\"\n"; |
Przetestuj to (w końcu). |
|
1 « 2 » 3 |