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

Kalkulator, pliki .txt, ONP, stos i kolejka - reprezentacja na tablicach PROBLEM

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
478 wizyt
pytanie zadane 5 stycznia 2016 w C i C++ przez Cinas Nowicjusz (160 p.)
edycja 5 stycznia 2016 przez Cinas

Witam, mam problem z zadaniem. Odbiega ono od tego co robiliśmy na zajęciach, także z góry przepraszam za amatorszczyznę, ale do rzeczy. Ma to być kalkulator liczący równania zapisane linijkami w pliku tekstowym. Najpierw wczytaną linię chcę przetransformować do ONP. Niestety wszystkie materiały tego typu znalezione w sieci robione są na "<vector>'ach" jest mi to zupełnie obce i nie wiem jak w to włożyć palce. Dlatego reprezentację stosu i kolejki mam zamiar zrobić na tablicach. Póki co udało mi się stworzyć coś takiego (co oczywiście nie działa, inaczej by mnie tu nie było :)). 

Algorytm tworzyłem na podstawie przykładu z wikipedii w podrozdziale: "Algorytm konwersji z notacji infiksowej do ONP"

Nie czekam na gotowe rozwiązanie, proszę o pomoc w nakierowaniu na poprawne napisanie algorytmu ilczącego.

Poniżej kod mojej nieudolnej transformacji na ONP.

http://pastebin.pl/view/1bae2915

#include <iostream>
#include <fstream>
#include <conio.h>
#include <algorithm>
#include <string>

(...)
  
    string napis; // pobrana linia (równanie) z tekstu
    // STOS - reprezentacja zmiennych
    string stos;
    int rozmiar=0;

    // KOLEJKA - reprezentacja zmiennych
    string kolejka;
    int ile=0;
    int glowa=0;
    int ostatni_wolny=0;

(...)

        int dlugosc=napis.length();
        


            for(int i=1 ; i<(dlugosc-1); i++) 
// pierwszy i ostatni znak linii jest zarezerwowany w wymaganiach jako oznaczenie lini 
            {
                if ((napis[i]>= '0' && napis[i]<= '9')) 
// sprawdzamy czy pierwszy element jest liczba
                {
                    napis[i]=kolejka[ostatni_wolny];
                    ostatni_wolny+=1;
                    ile+=1;
                    if (!(napis[i+1]>= '0' && napis[i+1]<= '9')) 
// sprawdzamy czy kolejny element nie jest liczba i dodajemy spacje w celu rozdzielenia liczb
                    {
                        kolejka += " ";
                        ile++;
                    }
                }
                else if ((napis[i]=='*') || (napis[i]=='^') || (napis[i]=='/') || (napis[i]=='-') || (napis[i]=='+') || (napis[i]=='('))
                {
                    rozmiar=rozmiar+1;
                    napis[i]=stos[rozmiar];
                    stos += " ";
                }
                else if(napis[i]==')')
                {
                    stos[rozmiar]=kolejka[ostatni_wolny];       
// dodanie do kolejki znaku zdjetego ze stosu
                    rozmiar=rozmiar-1;                          
// zdjęcie ze stosu ostatniego znaku
                    ostatni_wolny+=1;
                    ile+=1;
                    rozmiar=rozmiar-1;   // zdjęcie ze stosu "("
                }
                else cout << "err" << endl;
            }
            for (int j=0; j<=ile; j++)
            {
                cout << "stan kolejki: " << kolejka[j] <<endl;
            }
        }
        else cout << "w równaniu błędne znaki" << endl;
      

Pozdrawiam iksnimolS

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

Podobne pytania

0 głosów
1 odpowiedź 669 wizyt
pytanie zadane 2 kwietnia 2020 w C i C++ przez SensejChmiel Nowicjusz (180 p.)
0 głosów
1 odpowiedź 189 wizyt
pytanie zadane 21 marca 2023 w C i C++ przez bananen Nowicjusz (170 p.)
0 głosów
2 odpowiedzi 508 wizyt
pytanie zadane 11 grudnia 2017 w C# przez garris Użytkownik (660 p.)

93,434 zapytań

142,429 odpowiedzi

322,662 komentarzy

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

...