Усовершенствованный калькулятор

  1. import java.io.ByteArrayInputStream;
  2. import java.io.EOFException;
  3.  
  4. public class Calculator{
  5.  
  6.     InputStream input; //Входной поток
  7.     int look; //Анализируемый символ
  8.  
  9.     public Calculator(String expression){
  10.         input = (InputStream)new ByteArrayInputStream(expression.getBytes());
  11.         look = getchar();
  12.     }
  13.  
  14.     public Calculator(InputStream is){
  15.         input = is;
  16.         look = getchar();
  17.     }
  18.  
  19.     private int getchar(){ //Получает следующий символ
  20.         return input.read();
  21.     }
  22.  
  23.     private int getNum(){  //Считывает следующее число
  24.         int value = 0;
  25.         while(Character.isDigit(look)){
  26.             value += look;
  27.             look = getchar();
  28.         }
  29.         return value;
  30.     }
  31.  
  32.     private int getFactor(){ //Считывает число(положительное или отрицательное) или считывает и вычисляет выражение в скобках
  33.         int a;
  34.         if(Character.isDigit(look)) a = getNum();
  35.         else if(look=='-'){
  36.             look = getchar();
  37.             a = -getNum();
  38.         }
  39.         else if(look=='('){
  40.             look = getchar();
  41.             a = calculate();
  42.             if(look!=')') throw new Exception("Scope is not closed!");
  43.             else look = getchar();
  44.         }
  45.         return a;
  46.     }
  47.  
  48.     public int getTerm(){  //Вычисляет произведение и частное(Это нужно для того, чтобы умножение/деление выполнялось раньше сложения/вычитания)
  49.         int a = getFactor();
  50.         while((look=='*')||(look=='/'))
  51.         {
  52.             char oldlook = look;
  53.             look = getchar();
  54.             ((oldlook=='*')?(a*=getTerm()):(a/=getTerm());
  55.         }
  56.         return a;
  57.     }
  58.  
  59.     public int calculate(){ //Метод, собственно и вычисляющий выражение
  60.         int a = getTerm()
  61.         while((look == '+')||(look=='-')){
  62.             char oldlook = look;
  63.             look = getchar();
  64.             (oldlook=='+')?(a+=getTerm()):(a-=getTerm());
  65.         }
  66.         return a;
  67.     }
  68. }
Возник достаточно давно, как ответ на этот калькулятор, но возникло недоразумение, из-за которого я не смог его выложить.
Калькулятор поддерживает все 4 действия, скобки и приоритеты.

Реклама

Мы в соцсетях

tw tg yt gt