Усовершенствованный калькулятор
- import java.io.ByteArrayInputStream;
- import java.io.EOFException;
- public class Calculator{
- InputStream input; //Входной поток
- int look; //Анализируемый символ
- public Calculator(String expression){
- input = (InputStream)new ByteArrayInputStream(expression.getBytes());
- look = getchar();
- }
- public Calculator(InputStream is){
- input = is;
- look = getchar();
- }
- private int getchar(){ //Получает следующий символ
- return input.read();
- }
- private int getNum(){ //Считывает следующее число
- int value = 0;
- while(Character.isDigit(look)){
- value += look;
- look = getchar();
- }
- return value;
- }
- private int getFactor(){ //Считывает число(положительное или отрицательное) или считывает и вычисляет выражение в скобках
- int a;
- if(Character.isDigit(look)) a = getNum();
- else if(look=='-'){
- look = getchar();
- a = -getNum();
- }
- else if(look=='('){
- look = getchar();
- a = calculate();
- if(look!=')') throw new Exception("Scope is not closed!");
- else look = getchar();
- }
- return a;
- }
- public int getTerm(){ //Вычисляет произведение и частное(Это нужно для того, чтобы умножение/деление выполнялось раньше сложения/вычитания)
- int a = getFactor();
- while((look=='*')||(look=='/'))
- {
- char oldlook = look;
- look = getchar();
- ((oldlook=='*')?(a*=getTerm()):(a/=getTerm());
- }
- return a;
- }
- public int calculate(){ //Метод, собственно и вычисляющий выражение
- int a = getTerm()
- while((look == '+')||(look=='-')){
- char oldlook = look;
- look = getchar();
- (oldlook=='+')?(a+=getTerm()):(a-=getTerm());
- }
- return a;
- }
- }
Возник достаточно давно, как ответ на этот калькулятор, но возникло недоразумение, из-за которого я не смог его выложить.
Калькулятор поддерживает все 4 действия, скобки и приоритеты.
Калькулятор поддерживает все 4 действия, скобки и приоритеты.