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

Prosty parser wyrażeń arytmetycznych

0 głosów
610 wizyt
pytanie zadane 31 października 2015 w C i C++ przez Dywan Nowicjusz (170 p.)
Mam problem z napisaniem prostego parsera. W zasadzie nie wiem jak się za niego zabrać. Chcę uzyskać coś takiego.

string a, b, wyrazenie;

char op;

i podaje cos takiego do cin >> wyrazenie; 2+3
Chciałbym pod a mieć 2 ( a = "2"; b = "3"; op = '+'. Funkcje do liczenia już mam napisane. Pomoże ktoś?

4 odpowiedzi

0 głosów
odpowiedź 31 października 2015 przez notabigthreat Mądrala (7,100 p.)
edycja 31 października 2015 przez notabigthreat
 
Najlepsza

Jeśli na pewno wejście jest poprawne:

size_t pozycja_op = wyrazenie.find_first_not_of("1234567890");
op = wyrazenie[pozycja_op];
a = wyrazenie.substr(0, pozycja_op);
b = wyrazenie.substr(pozycja_op+1);

Pamiętaj, że w ten sposób spacje nie zostaną usunięte ("5 +3" zostanie zamienione na: "5 ",'+',"3").

 

komentarz 31 października 2015 przez Dywan Nowicjusz (170 p.)
Bardzo dziękuję. O takie coś właśnie mi chodziło :)
0 głosów
odpowiedź 31 października 2015 przez krzemionskyy Użytkownik (650 p.)
Co w Twoim kodzie oznacza zmienna "wyrazenie"? Możesz rzutować zmienne a i b ze stringa na inta funkcją atoi() z biblioteki <cstdilb> i wtedy wykonać dodawanie tylko jaki w tym cel? Albo czegoś nie rozumiem, albo musisz uściślić swoje pytanie ; )

Pozdrawiam.
0 głosów
odpowiedź 31 października 2015 przez furas Maniak (54,200 p.)
Niektórzy do takich rzeczy używają narzędzi typu Lex i Yacc. Jedno pozwala zdefiniować poprawne "słowa" (np. liczby, znaki działania, itp.) a drugi pozwala zdefiniować poprawne połączenia "słów" np. 2+3 a nie 2++3, oraz przypisać do tego własne funkcje, które będą rozpoznane liczby odpowiednio dodawać, odejmowac,itd. Potem z tego jest generowany kod w C i po skompilowaniu otrzymuje się gotowy program do liczenia wyrażen arytmetycznych.

https://pl.wikipedia.org/wiki/Lex_(informatyka)
https://pl.wikipedia.org/wiki/Yacc

Przykład kodu Lex i Yacc, który ma wygenerować program do obliczania wyrażeń o dowolnej ilości operacji np. 5*8+3.

http://www.studytable.in/2013/03/yacc-program-to-evaluate-arithmetic.html#axzz3q6h8P9yR
0 głosów
odpowiedź 31 października 2015 przez hit02 Nałogowiec (34,210 p.)

Nie wiem, czy dokładnie o to ci chodzi, ale może przyda ci się Odwrotna Notacja Polska. Aby napisać parser matematyczny, najpierw zamieniasz ciąg w notacji infiksowej (zwykłej) na RPN (Reverse Polish Notantion), a potem wyliczasz wartość z RPN.

https://pl.wikipedia.org/wiki/Odwrotna_notacja_polska

 

Podobne pytania

0 głosów
1 odpowiedź 200 wizyt
pytanie zadane 30 października 2017 w C i C++ przez Jakub 0 Stary wyjadacz (13,240 p.)
0 głosów
1 odpowiedź 90 wizyt
pytanie zadane 17 lipca w Python, Django przez Jakub 0 Stary wyjadacz (13,240 p.)
0 głosów
1 odpowiedź 64 wizyt
pytanie zadane 29 września 2018 w Python, Django przez Piotr Jasiński Bywalec (2,120 p.)
Porady nie od parady
Wynikowy wygląd pytania, odpowiedzi czy komentarza, różni się od tego zaprezentowanego w edytorze postów. Stosuj więc funkcję Podgląd posta znajdującą się pod edytorem, aby upewnić się, czy na pewno ostateczny rezultat ci odpowiada.Podgląd posta

66,453 zapytań

113,211 odpowiedzi

239,683 komentarzy

46,704 pasjonatów

Przeglądających: 281
Pasjonatów: 14 Gości: 267

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...