• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Nieskończona pętla, konwersja z ONP- dlaczego jest nieskończona?

Object Storage Arubacloud
0 głosów
449 wizyt
pytanie zadane 29 października 2022 w C i C++ przez layla Początkujący (260 p.)

Hej!

Napisałam program konwertujący ciąg znaków z ONP na standardowy zapis. Nie jest to jeszcze do końca skończone bo nie uwzględniłam nawiasów ani potęg, ale najpierw chcę, żeby zadziałał na tym prostym przykładzie. Niestety pętla while która używa boolów jako warunku wykonuje się w nieskończoność. Dlaczego? (warunek to- dopóki pierwsza liczba na stosie nie jest znakiem (jest liczbą) i jednocześnie druga liczba na stosie też jest liczbą, wykonuj:...) Kiedy dochodzi do wykonania pętli, na stosie mam "3;2;*;5", więc dla zestawu "*;5" się wykona, po usunięciu 5 dla zestawu *, 2 też powinna się wykonać, jednak tu się zapętla. Dlaczego tak się dzieje?

#include <iostream> 

using namespace std;

string stos[20];
int r;
string pom, pom1;

bool empty(int r)
{
    if(r==0) return true;
}

void push(string znak)
{
    if(r>0) pom=stos[r];
    else pom="";
    r=r+1;
    stos[r]=znak;
    pom1=stos[r];
}

void pop(int r)
{
    stos[r]="";
    r=r-1;
    if(r>0) pom1=stos[r];
    else pom="";
}
void sprawdz_poprzedni(int r)
{
    pom1=stos[r];
    r=r-1;
    pom=stos[r];
    r=r+1;
    stos[r]=pom1;
}
bool czy_znak(string m)
{
    if(m=="+"||m=="-"||m=="*"||m=="/") return true;
}

int main()
{
    string w="325*+", znak, l, x;
    int i=0;
    while(i<w.length())
    {
        znak=w[i];
        if(czy_znak(znak)==false)
        {
            push(znak);
        }
        else
        {
            if(czy_znak(pom1)==false && czy_znak(pom)==false)
            {
                x=pom1;
                pop(r);
                push(znak);
                push(x);
            }
            else
            {
                while(czy_znak(pom)==true || czy_znak(pom1)==true) //NIESKONCZONA
                {
                    l+=pom1;
                    pop(r);
                    sprawdz_poprzedni(r);

                }
                l+=pom1;
                pop(r);
                sprawdz_poprzedni(r);
                push(znak);
                for(int j=l.length()-1; j>=0; j--)
                {
                    x=l[j];
                    push(x);
                }
                l=""; 
            }

            
        }
        i++;
    }

    for(int k=1; k<=r; k++) cout << stos[k];


    return 0;
}

 

komentarz 29 października 2022 przez PreZmyK Pasjonat (21,470 p.)
czy_znak() nie zwraca false, więc będzie się kręcić jak raz spełnisz warunek true.
komentarz 29 października 2022 przez layla Początkujący (260 p.)
Warunek pętli za pierwszym razem zostanie spełniony, za drugim też, ale za trzecim już nie (bo pom i pom1 się zmieniają), więc po drugim kroku pętla powinna zostać przerwana, czyż nie?
komentarz 29 października 2022 przez layla Początkujący (260 p.)

@PreZmyK, Próbowałam to nawet łopatologicznie przerwać break'iem gdy obydwa te znaki dadzą nam false, do funkcji bool dopisałam też else return false, nic nie pomaga... Tak jakby to pom i pom1 się nie zmieniało. Mógłbyś to wytłumaczyć? I podesłać rozwiązanie tego problemu?

komentarz 29 października 2022 przez PreZmyK Pasjonat (21,470 p.)
Nie znam rozwiązania, jestem leszczem :P. Dodaj konsolę i zobacz na czym ta iteracja się zatrzymuje. Gdzieś się zawiesza i kręci.
1
komentarz 29 października 2022 przez TOWaD Mądrala (5,700 p.)

pomieszanie r lokalnego z globalnym

//ani tak
void sprawdz_poprzedni(int &r);
void pop(int &r);
//ani tak
void pop();
void sprawdz_poprzedni();
//się nie zawiesza

 

 

komentarz 30 października 2022 przez layla Początkujący (260 p.)
Dzięki! Nie wpadłam na to :P

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 308 wizyt
pytanie zadane 7 listopada 2020 w Mikrokontrolery przez xdmik23 Gaduła (3,000 p.)
0 głosów
1 odpowiedź 537 wizyt
pytanie zadane 6 maja 2020 w C i C++ przez Ladro Nowicjusz (140 p.)
0 głosów
1 odpowiedź 907 wizyt
pytanie zadane 27 grudnia 2018 w JavaScript przez kacperl95 Obywatel (1,980 p.)

92,539 zapytań

141,381 odpowiedzi

319,466 komentarzy

61,926 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...