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

Prosty parser wyrażeń arytmetycznych

Object Storage Arubacloud
0 głosów
1,211 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,060 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 (630 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 (53,800 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 (33,970 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ź 639 wizyt
pytanie zadane 30 października 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
0 głosów
2 odpowiedzi 307 wizyt
pytanie zadane 15 marca 2020 w PHP przez szaman219 Nowicjusz (140 p.)
0 głosów
1 odpowiedź 199 wizyt
pytanie zadane 17 lipca 2019 w Python przez Jakub 0 Pasjonat (23,120 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 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!

...