Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 1
Регистрация: 17.03.2015
Сообщений: 17

Как сделать, чтобы калькулятор читал строку типа "2+2" и выводил результат?

25.06.2015, 17:01. Показов 1005. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые форумчане.Сижу сегодня уже пол дня и ни как не могу разобраться, как мне сделать чтобы мой калькулятор читал строку типа 2+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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package Swing;
 
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.*;
 
 
 
public class swing extends JFrame  {
    String array[] = {"+","-"};  
    String title;
    Dimension d;
    
    JPanel panel = new JPanel();
    JButton b1= new JButton("1");
    JButton b2= new JButton("2");
    JButton b3= new JButton("3");
    JButton b4= new JButton("-");
    JButton b5= new JButton("+");
    JButton b6= new JButton("=");
    JTextField field = new JTextField(10);
    
    public swing( String title, Dimension d){
        this.title = title;
        this.d = d;
    }
    
    public  void r() {
        
        setSize(d);
        setTitle(title);
        b1.addActionListener(new ButtonActionListener());
        b2.addActionListener(new ButtonActionListener());
        b3.addActionListener(new ButtonActionListener());
        b4.addActionListener(new ButtonActionListener());
        b5.addActionListener(new ButtonActionListener());
        b6.addActionListener(new ButtonResActionListener());
        
        panel.setLayout(new FlowLayout());
        panel.add(field);
        panel.add(b1);
        panel.add(b2);
        panel.add(b3);
        panel.add(b4);
        panel.add(b5);
        panel.add(b6);
        
        
        
        add(panel,BorderLayout.CENTER);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
 
    }
    
    public class ButtonActionListener implements ActionListener{
    
    public void actionPerformed(ActionEvent e) {
        String n = ((JButton) e.getSource()).getText();
        String b = field.getText();
        field.setText(b + n);
        
        }
 
    }
    
    public class ButtonResActionListener implements ActionListener{
 
        @Override
        public void actionPerformed(ActionEvent ex) {
            String a = field.getText();
            String array[] = {"*","/","+","-"};  
            
            
                
                if(a.length()<3){
                    System.out.println("Введите корректные данные");
                    
                }
                
                if(a.equals ("end")){
                    boolean isNumber = true;
                    
                }
                
                
        for (int i = 0; i < array.length; i++) {
            
            if(a.indexOf(array[i]) != -1)
            {
                String array_st[] = a.split("//"+array[i]);
                long rez=0;
                switch (i) {
                
                  case 0:  rez = Integer.valueOf(array_st[0])* Integer.valueOf(array_st[1]);
                  break;
                  
                  case 1:  rez = Integer.valueOf(array_st[0])/ Integer.valueOf(array_st[1]);
                  break; 
                  
                  case 2:  rez = Integer.valueOf(array_st[0])+ Integer.valueOf(array_st[1]);
                  break; 
                  
                  case 3:  rez = Integer.valueOf(array_st[0])- Integer.valueOf(array_st[1]);
                  break;      
                  
                }
            System.out.println("Результат: "+rez);
        
        }
        
            
                
        
}
    }
}}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.06.2015, 17:01
Ответы с готовыми решениями:

Как сделать чтобы код выводил результат без обновления страницы?
Доброго времени суток, господа! Есть данный код: &lt;form action=&quot;qq.php&quot; method=&quot;post&quot;&gt; &lt;?php if(isset($_POST)) ...

Как сделать так,чтобы при решении 2 функций выводил результат одной функции
#include&lt;stdio.h&gt; #include&lt;math.h&gt; #include&lt;stdlib.h&gt; int main (int argc, char *argv) { float a=2, b=3.1, x=a, y, h=0.2; ...

как сделать в программе, чтобы на печать выводил один результат а не все окошко интерфейса?
как сделать в программе, чтобы на печать выводил один результат а не все окошко интерфейса? какие параметры нужно писать вместо...

3
 Аватар для we2seek
84 / 84 / 42
Регистрация: 25.01.2010
Сообщений: 386
25.06.2015, 23:02
Подумай над этим Обратная польская запись
0
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 17
27.06.2015, 21:23
Если совсем лень думать, в этой статье есть 2 алгоритма. Единственное, они не на Java написаны. Один из них перевести несложно, другой посложнее. + в комментариях есть решения.
0
 Аватар для Геомеханик
838 / 641 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
28.06.2015, 17:29
Легко.

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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
import java.io.*;
import java.util.*;
import java.lang.*;
 
 
final class Expr {
    private final static long LONG_MIN = Long.MIN_VALUE / 10L;
    private final static long LONG_MAX = Long.MAX_VALUE / 10L;
 
    public static long Calc(String s) throws Exception {
        s = s.replaceAll("\\s+", ""); // удалим пробелы, '\n', '\t'...
 
        if(s.length() == 0)
            throw new IllegalArgumentException("Строка пуста!");
        if(! is_rules(s))
            throw new IllegalArgumentException("Ошибка в расстоновки скобок!");
 
        int[] index = {0};
        return SubExpr(s, index);
    }
 
 
    private static long SubExpr(String s, int[] index){
        boolean neg, loop;
        long    val, num;
        Stack<Character> sops = new Stack<Character>();
        Stack<Long>      sval = new Stack<Long>();
 
        neg  = false;
        loop = true;
 
        for(int i = index[0]; i < s.length(); ){
 
            switch(s.charAt(i)){
            case '+':
            case '/':
            case '*':
                sops.push(s.charAt(i));
                ++i;
                break;
            case '-':
 
                if((i == 0) || ((i > 0) && is_math(s.charAt(i - 1)))){
                    neg = true;
                    ++i;
                    break;
                }
                sops.push(s.charAt(i));
                ++i;
 
                break;
            case '(':
 
                index[0] = i + 1;
                val      = SubExpr(s, index);
                i        = index[0];
 
                if(neg)
                    val = 0L - val;
                neg = false;
 
                sval.push(val);
                calc_muldiv(sval, sops);
                break;
            case ')':
                index[0] = i + 1;
                loop     = false;
                break;
            default:
 
                if(! Character.isDigit(s.charAt(i)))
                    throw new NumberFormatException("Неизвестный символ!");
 
                index[0] = i;
                val      = ToLong(s, index);
                i        = index[0];
 
                if(neg)
                    val = 0L - val;
                neg = false;
 
                sval.push(val);
                calc_muldiv(sval, sops);
                break;
            }
 
            if(! loop)
                break;
        }
 
        if(sval.size() == 0)
            throw new IllegalArgumentException("Ошибка синтаксиса!");
 
        num = sval.get(0);
        sval.remove(0);
 
        for(int i = 0; (i < sops.size()) && (i < sval.size()); ++i){
            switch(sops.get(i)){
            case '+':
                num += sval.get(i);
                break;
            case '-':
                num -= sval.get(i);
                break;
            }
        }
        sops.clear();
        sval.clear();
        sops = null;
        sval = null;
        return num;
    }
 
    //приоритетные операции: умножение, деление
    private static void calc_muldiv(Stack<Long> sval, Stack<Character> sops){
        long val;
        char ch;
 
        while(! sops.isEmpty()){
            ch = sops.peek();
            if((ch == '+') || (ch == '-'))
                break;
 
            val = sval.peek();
            sval.pop();
            if(sval.size() == 0)
                throw new IllegalArgumentException("Ошибка синтаксиса!");
 
            if(ch == '*')
                sval.set(sval.size() - 1, sval.peek() * val);
            else if(ch == '/'){
                if(val == 0L)
                    throw new ArithmeticException("Деление на нуль!");
                sval.set(sval.size() - 1, sval.peek() / val);
            }             
            sops.pop();
        }
    }
 
    // конвертирование числа из строки
    private static long ToLong(String s, int[] index){
        long n = 0L;
        int  i;
 
        for(i = index[0]; i < s.length(); ++i){
            if(Character.isDigit(s.charAt(i))){
 
                if(n > LONG_MAX || n < LONG_MIN)
                    throw new NumberFormatException("Переполнение числа!");
 
                n = n * 10L + (long) (s.charAt(i) - '0');
            } else
                break;
        }
        index[0] = i;
        return n;
    }
 
    //проверка правильности расстановки скобочных выражений
    private static boolean is_rules(String s){
        int n = 0;
        for(int i = 0; i < s.length(); ++i){
            if(s.charAt(i) == '(')
                ++n;
            else if(s.charAt(i) == ')')
                --n;
        }
        return (n == 0);
    }
 
    private static boolean is_math(char ch){
        return (ch == '+' || ch == '-' || 
                ch == '*' || ch == '/' || ch == '(');
    }
}
 
 
class Project {
    public static void main(String[] args) {
        String s   = "-1-(-7*-7-(-(-(-(10-2)/2*3+1)/4)+2)+2/(1+(-(-2)+3+(-4))+5))/10";
        long   jvm = -1-(-7*-7-(-(-(-(10-2)/2*3+1)/4)+2)+2/(1+(-(-2)+3+(-4))+5))/10;
        try {
            long res = Expr.Calc(s);
            System.out.println("парсер: " + res);
            System.out.println("static: " + jvm);
        } catch(Exception e){
            System.err.println(e.getMessage());
        }
    }
}
Результат работы кода
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.06.2015, 17:29
Помогаю со студенческими работами здесь

Не получается чтобы он все символы с текста читал и типа счетчика который считает одинаковые символы как один и плюсует их....Как сделать правильно???
#include&lt; stdio.h&gt; #include&lt; conio.h&gt; #include&lt; string.h&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;cmath&gt; using...

Калькулятор: Как сделать чтобы результат не ограничивался выполнением двух операций
привет, кто - то может сталкивался, подскажите, пожалуйста... калькулятор, все работает (2+2 = 4 и т.д.,), но, есть нюанс (2+2+2 = 4 и...

Можно ли сделать так, чтобы Winamp выводил музыку на колонки, а PotPlayer выводил звук из фильма на наушники?
привет у меня мать Elitegroup со встроенным звуковым движком &quot;RealtekHD&quot; - на матери присутствует 6 различных гнёзд. Я хотел спросить у...

Как сделать чтобы se w200i читал флешку на 2 gb
как сделать чтобы se w200i читал флешку на 2 gb

Как сделать чтобы textbox читал числа, а не только цифры?
Здравствуйте. Хочу попросить помощи у вас. Я не очень понимаю программирование и у меня есть задание создать программу для вычисления...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru