Вычисление математических выражений в java

Я пытаюсь изучить Java в свободное время. До сих пор я люблю это. В настоящее время я работаю над более продвинутой версией простого калькулятора с 4 функциями. По сути, я хотел бы ввести выражение, скажем, «4 + 5», а затем разделить его на первый термин, второй термин и оператор, а затем вычислить ответ на основе обнаруженного символа оператора и вывести ответ. Моя проблема заключалась в том, что я сохраняю выражение в массиве символов, и это работает нормально, если только первый термин не является двузначным числом или пользователь не добавляет другой оператор. Как я могу сделать это достаточно динамичным, чтобы можно было использовать множество форм простых выражений?


person Andrew Graham    schedule 14.09.2013    source источник
comment
Не используйте массив символов для одного. Как насчет списка строк?   -  person Kayaman    schedule 14.09.2013
comment
Пожалуйста, опубликуйте свой код и приведите примеры, чтобы дать людям лучшую систему отсчета. Кроме того, пожалуйста, объясните, почему это не работает; если только первый термин не является двузначным числом, или если пользователь добавляет другой оператор, не указывает, что пойдет не так.   -  person Adi Inbar    schedule 14.09.2013


Ответы (2)


Я бы попробовал работать с классом StringTokenizer.

Захватите ввод в виде строки, затем сделайте StringTokenizer следующим образом:

String delimiter =" ";
StringTokenizer st = new StringTokenizer(inputString, delimiter);

Разделитель - это строка, которая у вас есть между интересными частями строки, поэтому вы можете установить ее как пробел.

После этого вы можете извлечь части ввода, вызвав метод nextToken.

Например:

String firstTerm=st.nextToken();
String operator=st.nextToken();
String secondTerm=st.nextToken();

double ft=Double.parseDouble(firstTerm);
double st=Double.parseDouble(secondTerm);

Затем вы можете принять решение, какую операцию выполнять, на основе оператора ввода, используя, например, оператор switch.

Здесь вам может понадобиться выполнить некоторую обработку исключений, поскольку StringTokenizer может генерировать исключения.

При желании вы можете остаться на более низком уровне и делать все это вручную. Просто создайте строку, а затем прочитайте свой массив символов символ за символом, пока не дойдете до разделителя. Вы можете сделать это в цикле, который закончится, когда вы достигнете разделителя. Затем вы можете использовать класс для анализа числа из строки. Вы заметили заглавную D в слове Double? Это означает, что мы вызываем функцию класса Double, которая будет анализировать число из строки. Существуют также классы Integer для int, Float для чисел с плавающей запятой одинарной точности и так далее.

Если выражение длиннее, вы все равно можете использовать StringTokenizer, так как есть метод hasMoreElements, который вы можете использовать, чтобы проверить, находитесь ли вы в конце ввода.

person AndrejaKo    schedule 14.09.2013

Это может быть излишним, если вы не собираетесь расширять свою программу и хотите сделать ее как можно более простой. (У нас был этот метод в нашем первом семестре программирования на Java, так что это должно быть хорошим упражнением). Вы можете использовать обратную польскую нотацию (Идея: Википедия), используя стек для ваших чисел. Это позволит вам использовать круглые скобки и выполнять несколько операций в правильном порядке (*,/ перед +,-). С другой стороны, вам понадобятся круглые скобки вокруг каждой базовой операции (например, " ((A+B)+C) ").

Когда я реализовывал калькулятор таким образом, я проходил символ за символом по строке, складывая числа с двумя цифрами или цифрами после запятой.

person RoHo    schedule 16.09.2013