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-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.
P-171042
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.
P-171043
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ą,
P-171044
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.
P-171045
pekfos
» 2018-05-13 10:51:02
To co z tym całym rozumieniem problemu? Odrobiłeś może pracę domową?
P-171047
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:

C/C++
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.

C/C++
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.
P-171048
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.

C/C++
#include <iostream>

using namespace std;

int main()
{
    char stos[ 256 ], el[ 256 ];
    int ws = 0;
   
    do
    {
       
       
        cin >> el; //pobranie cin
       
        if( el[ 0 ] >= '0' && el[ 0 ] <= '9' ) cout << el << " "; //jesli pierwszy element tablicy el[0] to cyfra wyswietl ja
        else
        switch( el[ 0 ] ) //jesli nie to sprawdzamy operator
        {
        case '+':;
        case '-': while( ws && stos[ ws - 1 ] != '(' ) cout << stos[ --ws ] << " "; //jeśli jest + lub -, jeżeli ws jest dodatni i jesli na stosie, o poziom niżej nie ma nawiasu otwierajacego
            //to wyswietlamy element stosu o 1 poziom nizej
            stos[ ws++ ] = el[ 0 ]; //dodajemy do stosu wartosc el[0] i inkrementujemy wartoscia ws
            break;
        case '*':;
        case '/': while( ws && stos[ ws - 1 ] != '(' && //jezeli jest * lub /, jeżeli ws jest dodatni i czy na stosie, poziom nizej nie ma nawiasu otwierajacego
            stos[ ws - 1 ] != '+' && //i nie ma +, - to dekrementujemy stos i wysietlamy go
            stos[ ws - 1 ] != '-' ) cout << stos[ --ws ] << " ";
           
            stos[ ws++ ] = el[ 0 ]; //dodajemy do stosu wartosc el[0] i inkrementujemy
            break;
        case '^': while( ws && stos[ ws - 1 ] == '^' ) cout << stos[ --ws ] << " "; //jeżeli ws jest dodatni i jeżeli na stosie poziom niżej, jest potega, to wyswietlamy zdekrementowany stos
           
            stos[ ws++ ] = el[ 0 ]; //dodajemy do stosu el[0] i inkrementujemy ws
            break;
        case '(': stos[ ws++ ] = '('; //jezeli jest nawias otwierajacy to dodajemy go do stosu i inkrementujemy
            break;
        case ')': while( stos[ ws - 1 ] != '(' ) cout << stos[ --ws ] << " "; //jezeli jest zamykajacy nawias to sprawdzamy czy na na stosie nizej nie ma otwierajacego
            //jeśli nie to wyswietlamy stos nizej do czasu napotkania otwierajacego
            ws--; //dekrementacja wskaznika
            break;
        case '=': while( ws ) cout << stos[ --ws ] << " "; //wyswietla stos dopoki ws jest wartoscia dodatnia
           
            cout << " =\n\n";
            break;
        }
       
    } while( el[ 0 ] != '=' ); //wykonuje operacje dopóki el[0] jest rozny od '='
   
    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

C/C++
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

int main()
{
    char stos[ 256 ]; // el[ 256 ];
    int ws = 0;
    int i = 0;
    char el[] = "25 - 3 + 11 =";
   
    cout << endl;
   
    do
    {
       
       
        //cin >> el;                                                     
       
        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

C/C++
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.
P-171094
pekfos
» 2018-05-14 13:56:39
C/C++
cin >> el;
std::cout << "Wczytano: \"" << el << "\"\n";
Przetestuj to (w końcu).
P-171095
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona