Cześć, chciałem dziś pokazać bardzo prosty parser wyrażeń matematycznych.
Rozpatrujemy tylko przypadki dodawania cyfr.
Czyli nasz program może liczyć tylko np:
1+2+4+2+1+3+5+9+9+3+3
Na początek musimy sprawdzić czy to co wpisał użytkownik jest poprawnym wyrażeniem.
Zrobimy to za pomocą wyrażeń regularnych.
1 | ([0-9] *\\+{1} *)([0-9]{1} *\\+{1} *)*[0-9]{1} * |
Zakładamy w nim że poprawny ciąg będzie składał się z (od lewej):
1. Jednej cyfry, dowolnej ilości spacji i jednego znaku plus.
2. Następnie może być dowolna ilość wyrażeń:
Cyfra, dowolna ilość spacji, jeden znak plus.
3. I kończące to rzecz jasna cyfra + dowolna ilość spacji.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public static void main(String[] args) throws IOException { Scanner sc = new Scanner(System.in); System.out.println("Wpisz wyrazenie: "); while(sc.hasNextLine()) { String line = sc.nextLine(); if(line.matches("([0-9] *\\+{1} *)([0-9]{1} *\\+{1} *)*[0-9]{1} *")) { line = line.replaceAll(" " , ""); String digits[] = line.split("\\+"); int wynik =0; for(String w: digits) wynik+=Integer.parseInt(w); System.out.println("Wynik: "+wynik); } else { System.out.println("Niepoprawna skladnia."); continue; } } } |
Korzystając z tego wyrażenia regularnego tworzymy program widoczny powyżej. Klasa Scanner pobiera od użytkownika wyrażenie, sprawdzamy czy jest ono poprawne, jeśli tak to usuwamy spacje i dzielimy wyrażenie, ustawiając jako delimeter znak „+”. W wyniku tego mamy tablicę liczb z których składa się wyrażenie. W pętli je dodajemy.
Proste strasznie :)
PS. Czy umiałbyś rozszerzyć program tak żeby dodawał liczby a nie tylko cyfry? Podpowiem że wszystko do tego jest napisane, tylko musisz zmienić wyrażenie regularne tak, żeby było dostosowane do powyższego, nowego założenia.
Mateusz Mazurek