Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 2
Регистрация: 25.10.2014
Сообщений: 48

Калькулятор с преферансом и куртизанками

10.06.2016, 14:13. Показов 541. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, решил написать свой калькулятор с использованием обратной польской записи с разными функциями (синусы, косинусы и т.д.). Сам алгоритм взял тут, в итоге получилось вот что:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import java.util.ArrayList;
import java.util.Stack;
 
 
public class Calculator {
    private final String[] functions = {"Sin", "Cos", "Tan", "Ctg","ASin", "ACos", "ATan", "ACtg", "powTwo", "powThree", "powHalf", "powThird", "fact", "ln", "log", "powTen"};
    private final String[][] left_associativity = {{"*", "/", "+", "-"}, {"2", "2", "1", "1",}};
    private final String[][] right_associativity = {{"^"}, {"3"}};
    private ArrayList<String> expression;
    private Stack<String> stack = new Stack<>();
    Calculator (ArrayList<String> expr){
        expression = expr;
    }
 
    private boolean isFunction(String str){
        for(String curr: functions)
            if(curr.equals(str))
                return true;
        return false;
    }
 
    private boolean isLeftAssociativityOperator(String str){
        for (int i = 0; i < left_associativity[0].length; i++)
            if(left_associativity[0][i].equals(str)) {
 
                return true;
            }
        return false;
    }
 
    private boolean isRightAssociativityOperator(String str){
        for (int i = 0; i < right_associativity[0].length; i++)
            if(left_associativity[0][i].equals(str)) {
                return true;
            }
        return false;
    }
 
    private void parenthesesIsPair()throws ParenthesesIsNotPairException{
        int parentheses = 0;
        for ( String curr : expression){
            switch(curr){
                case "(":
                    parentheses++;
                    break;
                case ")":
                    parentheses--;
                    break;
            }
            if (parentheses < 0) throw new ParenthesesIsNotPairException();
        }
        if (parentheses != 0) throw new ParenthesesIsNotPairException();
    }
 
    private int priority(String func){
        for(int i = 0; i < left_associativity[0].length; i++)
            if(left_associativity[0][i].equals(func))
                return Integer.valueOf(left_associativity[1][i]);
        for(int i = 0; i < right_associativity[0].length; i++)
            if(right_associativity[0][i].equals(func))
                return Integer.valueOf(right_associativity[1][i]);
        return 4;
    }
 
    public ArrayList<String> parser() throws ParenthesesIsNotPairException{
        ArrayList<String> output_string = new ArrayList<>();
        for (String curr: expression){
            if(curr.equals("("))
                stack.push(curr);
            else if(curr.equals(")")) {
                while (!stack.peek().equals("(")) {
                    output_string.add(stack.pop());
                    if (stack.isEmpty()) throw new ParenthesesIsNotPairException();
                }
                stack.pop();
            }
            else if(isFunction(curr))
                stack.push(curr);
            else if(isLeftAssociativityOperator(curr))
                while(!stack.isEmpty() && priority(curr) >= priority(stack.peek()))
                    output_string.add(stack.pop());
            else if(isRightAssociativityOperator(curr))
                while(!stack.isEmpty() && priority(curr) > priority(stack.peek()))
                    output_string.add(stack.pop());
            else if(!stack.isEmpty()) stack.pop();
        }
        return output_string;
    }
 
    public static void main(String[] args) {
        ArrayList<String> str = new ArrayList<>();//
        String[] str1 =  {"( ", "12", "+", "4", ")", "/", "(", "3", "+", "tg", "(", "30", "-", "20", ")", ")"};  // (12+4)/(3+tg(30-20))  12 4 + 3 30 20 - tg + /
        for (String s: str1)
            str.add(s);
        Calculator calc = new Calculator(str);
        try {
            System.out.println(calc.parser());
        }
        catch (ParenthesesIsNotPairException exc) {
            System.out.println("Not pair");
        }
    }
}

Класс ParenthesesIsNotPairException - просто наследник Exception.
Там много всего лишнего, но не могу разобраться с ошибкой:
Exception in thread "main" java.util.EmptyStackException
at java.util.Stack.peek(Stack.java:102)
at Calculator.parser(Calculator.java:71)
at Calculator.main(Calculator.java:97)
at sun.reflect.NativeMethodAccessorImpl.inv oke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.inv oke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl .invoke(DelegatingMethodAccessorImpl.jav a:43)
at java.lang.reflect.Method.invoke(Method.j ava:498)
at com.intellij.rt.execution.application.Ap pMain.main(AppMain.java:144)
Я понимаю, что он ругается на вызов пустого стека в методе parser(), но там, вроде всё нормально...
Подскажите пожалуйста где я ошибся.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.06.2016, 14:13
Ответы с готовыми решениями:

Как преобразовать обычный калькулятор в калькулятор использующий класс стек?
#include &lt;iostream&gt; int main(){ int a = 0; int b = 0; char operation; std::cout &lt;&lt; &quot;Enter first number: &quot;; ...

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

Калькулятор
Здравствуйте. Нужна ваша помощь. написал простой калькулятор, можно сделать так, чтобы он считал большие вещественные числа типа...

2
 Аватар для SergioO
261 / 209 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
10.06.2016, 20:31
Stack is depricated
Цитата Сообщение от kroak Посмотреть сообщение
java.util.EmptyStackException
скорее всего пытаетесь выполнить pop из пустого стека
0
2 / 2 / 2
Регистрация: 25.10.2014
Сообщений: 48
23.06.2016, 18:38  [ТС]
Начал дебажить и заметил такую штуку: при первом проходе метода parser(), при curr == "(" условие if(curr.equals("(")) (строка 68) проскакивается, т.е. stack.push(curr); не выполняется. Подскажите где косяк, а то сам в упор не вижу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.06.2016, 18:38
Помогаю со студенческими работами здесь

Калькулятор
Делаю свой первый калькулятор. Получилась такая проблема: 1.При сложении все впорядке 2.При вычетании происходит сложение 3.При...

Калькулятор
Доброго времени суток!Подскажите, как реализовать, чтобы кнопка, которая выделена на скрине, стирала один символ из строки(label)? На...

Калькулятор
#include &quot;stdafx.h&quot; #include &quot;iostream&quot; using namespace std; int main() { double sot; int num1, num2, result,...

Калькулятор
Всем привет.Подскажите пожалуйста как сделать калькулятор на сайт примерно такой как тут http://tennis.telegrammbots.ru/calc.php чтобы...

Калькулятор
Помогите пожалуйста, нужно добавить в этот калькулятор действие степени, чтобы находить степень. Вот код: &lt;?php require_once...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru