Java: практические задания седьмой недели начальных курсов

5 (100%) 4 vote[s]

Создать приложение для расчета выражений что задано в форме записи математических и логических выражений, в которой операнды расположены перед знаками операций (польской инверсной записи).

Реализуйте метод parse в классе, что приведен ниже:

class Application{
               public static double parse(String rpnString){
        
               }
} 

Для перевода строк в числа используйте классы обертки.
В случае если:

  • При расчетах выражения возникла ошибка разбора выражения метод должен «выбросить» RPNParserException:
public class RPNParserException extends RuntimeException{

 } 
  • В случае деления на ноль (когда результат выражения может стать NaN или Infinity) метод должен выбросить ArithmeticException (стандарт класса исключения доступен в пакете).

В выражении могут встречаться исключительно операции +, -, * и / (сумма, минус, умножение и деление). Если в выражении будет присутствовать другой оператор Вы должны выбросить RPNParserException

Для данной задачи НЕ нужно превращать обычную запись в бесскобочную. На входе метода будут присутствовать исключительно выражения в польском инверсном записи.

Дополнительные классы, которые Вам понадобятся: наиболее простым способом решения данной задачи будет использование стека.

Стек — это структура данных, которая работает по принципу (дисциплиной) «последний пришел — первый ушел» (LIFO, англ. Last in, first out). Все операции (например, удаление элемента) в стеке можно проводить только с одним элементом, который находится на верхушке стека и был введен в стек последним. В языке программирования Java для работы с такой структурой данных предлагается использовать интерфейс Deque и его методы push (e), pop () — это, соответственно, добавить элемент и вынуть элемент. В качестве реализации Вы можете использовать класс LinkedList.

Не забывайте добавлять строки import!
Например:

import java.util.Deque; 
import java.util.LinkedList; 

Примеры входных данных:

1). 10 20 + 30 40 + *       
    Что будет аналогом выражения (10 + 20) * (30 + 40).
     Результат вычисления: 2100

2). 10 20 30.0 * +       
    Что будет аналогом выражения  10 + 20 * 30.0
     Результат вычисления : 610

3). 10 20 30 () +       
    Должно вызывать исключение RPNParserException

4). 10 20 Е * +        
    Должно вызывать исключение  RPNParserException

5)  0 0 /        
    Должно вызывать исключение  ArithmeticException 

Шаблон для вставки кода:

import java.util.Deque;
import java.util.LinkedList;
 
public class Application {
 
       public static double parse(String rpnString) {
              
       }
 
       public static void main(String[] args) {
 
       }
 
} 

Пример реализации:

package com.tasks7.rpn;

import java.util.Deque;
import java.util.LinkedList;

public class Application {

	private final static String DELIM = " ";

	public static double parse(String rpnString) {
		if (rpnString == null || rpnString.isEmpty()) {
			throw new RPNParserException();
		}
		Deque<Double> stek = new LinkedList<Double>();
		String[] result = rpnString.split(DELIM);
		for (int i = 0; i < result.length; i++) {
			if (isNumber(result[i])) {
				stek.push(new Double(result[i]));
			} else if (isOperator(result[i])) {
				if (stek.size() < 2) {
					throw new RPNParserException();
				}
				switch (result[i]) {
				case "+":
					stek.push(new Double(stek.pop() + stek.pop()));
					break;
				case "-":
					stek.push(new Double(-stek.pop() + stek.pop()));
					break;
				case "/":
					if(stek.peek() == 0){
						throw new ArithmeticException();
					}
						stek.push(new Double(1/stek.pop() * stek.pop()));
					break;
				case "*":
					stek.push(new Double(stek.pop() * stek.pop()));
					break;
				}
			} else {
				throw new RPNParserException();
			}
		}
		if (stek.size() != 1) {
			throw new RPNParserException();
		}
		return stek.pop();
	}

	private static boolean isNumber(String string) {
		if (string == null)
			return false;
		return string.matches("^-?\\d+(\\.\\d+)?$");
	}

	private static boolean isOperator(String string) {
		if (string == null)
			return false;
		return string.matches("[+-/*]{1}");
	}

	public static void main(String[] args) {
		
		if (args == null || args.length == 0) {
			throw new RPNParserException();
		}
		System.out.println(parse(args[0]));
	}
}

 

Читайте больше по теме:

Подписаться
Уведомление о
guest
0 комментариев
Inline Feedbacks
View all comments
Просмотры: 375

Популярные записи