// obliczanie wyniku z segmentów static String segments_calculate(Vector segmenty) throws StringException { while (segmenty.size() > 1) { // znajdź operator o najwyższym priorytecie int operator_max = -1; // szukaj * lub / for (int i = 0; i < segmenty.size(); i++) { ParserSegment segment2 = (ParserSegment) (segmenty.elementAt(i)); if (segment2.type == SegmentType.OPERATOR) { if (segment2.text.equals("*") || segment2.text.equals("/")) { operator_max = i; break; } } } if (operator_max == -1) { // jeśli nic nie znaleziono // szukaj + lub - for (int i = 0; i < segmenty.size(); i++) { ParserSegment segment2 = (ParserSegment) (segmenty.elementAt(i)); if (segment2.type == SegmentType.OPERATOR) { if (segment2.text.equals("+") || segment2.text.equals("-")) { operator_max = i; break; } } } } if (operator_max == -1) { // jeśli nic nie znaleziono throw new StringException("Błąd składni (1)"); } if (operator_max <= 0 || operator_max >= segmenty.size() - 1) { throw new StringException("Błąd składni (2)"); } // odczytanie argumentów ParserSegment argument_l = (ParserSegment) (segmenty.elementAt(operator_max - 1)); ParserSegment operator = (ParserSegment) (segmenty.elementAt(operator_max)); ParserSegment argument_r = (ParserSegment) (segmenty.elementAt(operator_max + 1)); // wykonanie pojedynczej operacji double wynik = Parser.calculate_operator(argument_l.text, argument_r.text, operator.text); argument_l.text = "" + wynik; // jeśli wynik zawiera kropkę if (argument_l.text.indexOf('.') >= 0) { // obcięcie zer na końcu while (argument_l.text.charAt(argument_l.text.length() - 1) == '0') { argument_l.text = argument_l.text.substring(0, argument_l.text.length() - 1); } // obcięcie kropki na końcu if (argument_l.text.charAt(argument_l.text.length() - 1) == '.') { argument_l.text = argument_l.text.substring(0, argument_l.text.length() - 1); } } // usunięcie operatora i prawego argumentu segmenty.removeElementAt(operator_max); segmenty.removeElementAt(operator_max); } return ((ParserSegment) segmenty.firstElement()) .text; // wynik = ostatni (jedyny) segment na liście }
// podział ciągu znaków na segmenty static Vector segmentuj(String formula) throws StringException { Vector segmenty = new Vector(); String segment = ""; for (int i = 0; i < formula.length(); i++) { char znak = formula.charAt(i); // jeśli znak nie jest ani liczbą ani operatorem if (Parser.segment_type(znak) == 0) { throw new StringException("Błąd: nieprawidłowy znak: " + znak); } if (segment.length() == 0) { // pusty segment segment += znak; continue; } // jeśli nowy znak (liczba) należy do tej samej grupy (liczby) if (Parser.segment_type(znak) == SegmentType.NUMBER && Parser.segment_type(segment) == SegmentType.NUMBER) { // dopisz znak do segmentu segment += znak; } else { // zakończ segment, dodaj go do listy segmenty.addElement(new ParserSegment(segment, Parser.segment_type(segment))); // znak jest teraz początkiem nowego segmentu segment = "" + znak; } } // dodanie ostatniego segmentu if (segment.length() > 0) { segmenty.addElement(new ParserSegment(segment, Parser.segment_type(segment))); } // jeśli pierwsze segmenty to liczba z minusem if (segmenty.size() > 1) { ParserSegment segment_pierwszy = (ParserSegment) (segmenty.firstElement()); if (segment_pierwszy.type == SegmentType.OPERATOR && segment_pierwszy.text.equals("-")) { ParserSegment segment_drugi = (ParserSegment) (segmenty.elementAt(1)); if (segment_drugi.type == SegmentType.NUMBER) { // drugi segment - liczba segment_drugi.text = "-" + segment_drugi.text; // przepisanie minusa do liczby segmenty.removeElementAt(0); } } } return segmenty; }