• 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?

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
603 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 (6,100 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ź 353 wizyt
pytanie zadane 7 listopada 2020 w Mikrokontrolery przez xdmik23 Gaduła (3,000 p.)
0 głosów
1 odpowiedź 629 wizyt
pytanie zadane 6 maja 2020 w C i C++ przez Ladro Nowicjusz (140 p.)
0 głosów
1 odpowiedź 1,082 wizyt
pytanie zadane 27 grudnia 2018 w JavaScript przez kacperl95 Obywatel (1,980 p.)

93,103 zapytań

142,077 odpowiedzi

321,562 komentarzy

62,445 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...