Example #1
0
 // 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
 }
Example #2
0
 // 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;
 }