Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,189
Записей в блоге: 5
#1

Обратная польская запись - Программирование Android

05.06.2013, 16:49. Просмотров 1027. Ответов 10
Метки нет (Все метки)

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

Вот код:
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
import java.util.Stack;
 
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
 
@SuppressLint("ShowToast")
public class Main extends Activity implements OnClickListener{
    
    private static final int LENGTH_LONG = 0;
    Button b1,b2,b3,b4,b5,b6,b7,b8,b9,b0,bRes,bDiv,bMul,bPlus,bMinus,bClear;
    TextView strInput,strRes;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        strInput = (TextView) findViewById(R.id.str);
        strRes = (TextView) findViewById(R.id.resWiew);
        
        b1 = (Button) findViewById(R.id.b1);
        b2 = (Button) findViewById(R.id.b2);
        b3 = (Button) findViewById(R.id.b3);
        b4 = (Button) findViewById(R.id.b4);
        b5 = (Button) findViewById(R.id.b5);
        b6 = (Button) findViewById(R.id.b6);
        b7 = (Button) findViewById(R.id.b7);
        b8 = (Button) findViewById(R.id.b8);
        b9 = (Button) findViewById(R.id.b9);
        b0 = (Button) findViewById(R.id.b0);
        
        bRes = (Button) findViewById(R.id.resultB);
        bDiv = (Button) findViewById(R.id.divB);
        bMul = (Button) findViewById(R.id.mulB);
        bPlus = (Button) findViewById(R.id.plusB);
        bMinus = (Button) findViewById(R.id.minusB);
        bClear = (Button) findViewById(R.id.clearB);
        
        b1.setOnClickListener(this);
        b2.setOnClickListener(this);
        b3.setOnClickListener(this);
        b4.setOnClickListener(this);
        b5.setOnClickListener(this);
        b6.setOnClickListener(this);
        b7.setOnClickListener(this);
        b8.setOnClickListener(this);
        b9.setOnClickListener(this);
        b0.setOnClickListener(this);
        
        bRes.setOnClickListener(this);
        bDiv.setOnClickListener(this);
        bMinus.setOnClickListener(this);
        bMul.setOnClickListener(this);
        bPlus.setOnClickListener(this);
        bClear.setOnClickListener(this);    
    }
    
    public void onClick(View v) {
        
        String t = "Create by Sanu0074";
        if (t.equals(strInput.getText())){strInput.setText("");}
        
        switch(v.getId()){
        case R.id.b1: strInput.setText(strInput.getText()+"1"); break;
        case R.id.b2: strInput.setText(strInput.getText()+"2"); break;
        case R.id.b3: strInput.setText(strInput.getText()+"3"); break;
        case R.id.b4: strInput.setText(strInput.getText()+"4"); break;
        case R.id.b5: strInput.setText(strInput.getText()+"5"); break;
        case R.id.b6: strInput.setText(strInput.getText()+"6"); break;
        case R.id.b7: strInput.setText(strInput.getText()+"7"); break;
        case R.id.b8: strInput.setText(strInput.getText()+"8"); break;
        case R.id.b9: strInput.setText(strInput.getText()+"9"); break;
        case R.id.b0: strInput.setText(strInput.getText()+"0"); break;
        case R.id.plusB: strInput.setText(strInput.getText()+"+"); break;
        case R.id.minusB: strInput.setText(strInput.getText()+"-"); break;
        case R.id.mulB: strInput.setText(strInput.getText()+"*"); break;
        case R.id.divB: strInput.setText(strInput.getText()+"/"); break;
        case R.id.clearB: strInput.setText(""); break;
        
        case R.id.resultB: 
                    String txt = TranslationInScr.inPolishNotation((strInput.getText().toString()));
                    strRes.setText(txt);
                    
                    Toast.makeText(this, txt, LENGTH_LONG).show();
            break;
        }
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}
 
 
class TranslationInScr {
     public static String inPolishNotation(String expression) {
      expression = "(" + expression;
      expression += ")";
      String rezNotation = "";
      final Stack<Character> stack = new Stack<Character>();
      final Stack<Character> outString = new Stack<Character>();
 
      for (int i = 0; i < expression.length(); i++) {
       if (expression.charAt(i) == ')') {
        while (String.valueOf(stack.peek()).charAt(0) != '(') {
         outString.push(stack.pop());
        }
 
        stack.pop();
       }
       if (expression.charAt(i) == '(') {
        stack.push('(');
       }
 
       if ((expression.charAt(i) == '+') || (expression.charAt(i) == '-')
         || (expression.charAt(i) == '/') || (expression.charAt(i) == '*')
         || (expression.charAt(i) == '^')) {
        if (stack.size() == 0) {
         stack.push(expression.charAt(i));
        } else if (priority(expression.charAt(i)) > priority(String
          .valueOf(stack.peek()).charAt(0))) {
         stack.push(expression.charAt(i));
        } else {
         while ((stack.size() != 0)
           && (priority(String.valueOf(stack.peek()).charAt(0)) >= priority(expression
             .charAt(i)))) {
          outString.push(stack.pop());
         }
         stack.push(expression.charAt(i));
        }
       } else if (expression.charAt(i) != '(' && expression.charAt(i) != ')')
        outString.push(expression.charAt(i));
      }
      for (int j = 0; j < outString.size(); j++) {
       rezNotation = rezNotation + String.valueOf(outString.get(j));
      }
      return rezNotation;
     }
 
     private static int priority(final char operator) {
      switch (operator) {
      case '^':
       return 4;
      case '*':
       return 3;
      case '/':
       return 3;
      case '-':
       return 2;
      case '+':
       return 2;
      case '(':
       return 1;
      }
      return 0;
     }
    }
так же прилаживаю strings и main.xml для тех кто хочет потесть:
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
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".Main" >
 
    <TextView
        android:id="@+id/str"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:background="#cfeef8"
        android:paddingLeft="10dp"
        android:text="@string/str"
        android:paddingTop="11dp"
        android:textAppearance="@style/AppTheme"
        android:textSize="20sp" />
 
    <Button
        android:id="@+id/b1"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_alignLeft="@+id/str"
        android:layout_below="@+id/str"
        android:layout_marginTop="21dp"
        android:text="@string/one" />
 
    <Button
        android:id="@+id/b3"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_alignBaseline="@+id/b2"
        android:layout_alignBottom="@+id/b2"
        android:layout_marginLeft="14dp"
        android:layout_toRightOf="@+id/b2"
        android:text="@string/three" />
 
    <Button
        android:id="@+id/b2"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_alignBaseline="@+id/b1"
        android:layout_alignBottom="@+id/b1"
        android:layout_marginLeft="14dp"
        android:layout_toRightOf="@+id/b1"
        android:text="@string/two" />
 
    <Button
        android:id="@+id/b4"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_alignLeft="@+id/b1"
        android:layout_below="@+id/b1"
        android:layout_marginTop="16dp"
        android:text="@string/four" />
 
    <Button
        android:id="@+id/b5"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_alignBaseline="@+id/b4"
        android:layout_alignBottom="@+id/b4"
        android:layout_toLeftOf="@+id/b3"
        android:text="@string/five" />
 
    <Button
        android:id="@+id/b7"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_alignLeft="@+id/b4"
        android:layout_below="@+id/b4"
        android:layout_marginTop="17dp"
        android:text="@string/seven" />
 
    <Button
        android:id="@+id/b8"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_alignBaseline="@+id/b7"
        android:layout_alignBottom="@+id/b7"
        android:layout_toLeftOf="@+id/b3"
        android:text="@string/eight" />
 
    <Button
        android:id="@+id/b6"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_alignBaseline="@+id/b5"
        android:layout_alignBottom="@+id/b5"
        android:layout_alignLeft="@+id/b3"
        android:text="@string/six" />
 
    <Button
        android:id="@+id/b9"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_alignBaseline="@+id/b8"
        android:layout_alignBottom="@+id/b8"
        android:layout_alignLeft="@+id/b6"
        android:text="@string/nine" />
 
    <Button
        android:id="@+id/b0"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_below="@+id/b8"
        android:layout_marginTop="15dp"
        android:layout_toLeftOf="@+id/b3"
        android:text="@string/nul" />
 
    <Button
        android:id="@+id/clearB"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_alignBaseline="@+id/b0"
        android:layout_alignBottom="@+id/b0"
        android:layout_toLeftOf="@+id/b2"
        android:background="#f14141"
        android:text="@string/clear" />
 
    <Button
        android:id="@+id/plusB"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:background="#8fcaf8"
        android:layout_above="@+id/b4"
        android:layout_alignParentRight="true"
        android:text="@string/plus" />
 
    <Button
        android:id="@+id/minusB"
        android:layout_width="wrap_content"
        android:background="#8fcaf8"
        android:layout_height="50dp"
        android:layout_above="@+id/b7"
        android:layout_alignLeft="@+id/plusB"
        android:text="@string/minus" />
 
    <Button
        android:id="@+id/mulB"
        android:layout_width="wrap_content"
        android:background="#8fcaf8"
        android:layout_height="50dp"
        android:layout_above="@+id/b0"
        android:layout_alignLeft="@+id/minusB"
        android:text="@string/mul" />
 
    <Button
        android:id="@+id/divB"
        android:layout_width="wrap_content"
        android:background="#8fcaf8"
        android:layout_height="50dp"
        android:layout_alignBaseline="@+id/resultB"
        android:layout_alignBottom="@+id/resultB"
        android:layout_alignLeft="@+id/mulB"
        android:text="@string/div" />
 
    <Button
        android:id="@+id/resultB"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_alignBaseline="@+id/b0"
        android:layout_alignBottom="@+id/b0"
        android:layout_alignLeft="@+id/b9"
        android:background="#f1a441"
        android:text="@string/res" />
 
    <TextView
        android:id="@+id/resWiew"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_alignRight="@+id/b0"
        android:layout_marginBottom="30dp"
        android:layout_marginRight="36dp"
        android:background="#d9ffed"
        android:padding="15dp"
        android:text="@string/result" />
 
</RelativeLayout>
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
<?xml version="1.0" encoding="utf-8"?>
<resources>
 
    <string name="app_name">YarCalc</string>
    <string name="action_settings">Settings</string>
    
     
     <string name="str">Create by Sanu0074</string>
     <string name="result">Результат</string>
    <string name="plus">+</string>
    <string name="minus">-</string>
    <string name="div">/</string>
    <string name="mul">*</string>
    <string name="res">=</string>
    <string name="nul">0</string>
    <string name="one">1</string>
    <string name="two">2</string>
    <string name="three">3</string>
    <string name="four">4</string>
    <string name="five">5</string>
    <string name="six">6</string>
    <string name="seven">7</string>
    <string name="eight">8</string>
    <string name="nine">9</string>
    <string name="clear">C</string>
 
</resources>
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2013, 16:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обратная польская запись (Программирование Android):

Обратная связь - Программирование Android
Как можно реализовать с приложении подобие обратной связи, как на сайтах. Т.е. в эдит текст написал, что угодно, и по кнопке отработал...

Функция обратная getString() - Программирование Android
Здравствуйте, всем. Часто использую getString(R.string.somestring, value1, value2) применительно к TextView.setText(); Далее...

Обратная связь в приложении на Андроид - Программирование Android
Здравствуйте, такой вопрос. Как реализовать обратную связь на андроид ? с полями ФИО, текст, и 2-3 фотографии. И так чтобы все это...

Отчеты ошибок в релизе приложения, обратная связь - Программирование Android
Привет. Я хотел поинтересоваться у разработчиков какими средствами пользуетесь чтобы отлавливать ошибки как в отладке так и в релизе...

Обратная польская запись - C++
Пожалуйста помогите, всю голову себе сломал. Задание: &quot;Обеспечить перевод инфиксного выражения в ОПЗ и вычислить его результат. Входные...

Обратная польская запись - C++
Здравствуйте, изучаю обратную польскую запись, столкнулся с такой проблемой: Перерыл множество алгоритмов перевода из обычной записи в...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
05.06.2013, 17:28 #2
суть проблемы не понятна.
Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,189
Записей в блоге: 5
05.06.2013, 17:30  [ТС] #3
Цитата Сообщение от V0v1k Посмотреть сообщение
суть проблемы не понятна.
Строка: 21+3*2-2

Результат вычислений: 2132*+2-

А должно быть: 25
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
05.06.2013, 17:48 #4
имел ввиду конкретную проблему с кодом...

Добавлено через 4 минуты
не вижу в коде никаких арифметических операций...
Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,189
Записей в блоге: 5
05.06.2013, 18:13  [ТС] #5
Цитата Сообщение от V0v1k Посмотреть сообщение
имел ввиду конкретную проблему с кодом...

Добавлено через 4 минуты
не вижу в коде никаких арифметических операций...
я взял пример обратной польской записи.. надо выполнить вычисления
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
05.06.2013, 18:19 #6
Цитата Сообщение от Sanu0074 Посмотреть сообщение
я взял пример обратной польской записи..
загуглил, почитал...
обработку вы только реализовали, еще нужно вычисление реализовать, алгоритм есть даже в википедии.
Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,189
Записей в блоге: 5
05.06.2013, 18:21  [ТС] #7
Цитата Сообщение от V0v1k Посмотреть сообщение
загуглил, почитал...
обработку вы только реализовали, и то, вроде, неправильно, еще нужно вычисление реализовать, алгоритм есть даже в википедии.
вот мне нужна помощь
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
05.06.2013, 18:28 #8
http://k-ai.ru/obratnaya-polskaya-za...tsiya-na-java/

Добавлено через 3 минуты
Обратная польская нотация

Добавлено через 21 секунду
http://javatalks.ru/topics/23322

Добавлено через 33 секунды
http://forum.oszone.net/thread-228785.html
Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,189
Записей в блоге: 5
05.06.2013, 18:36  [ТС] #9
Цитата Сообщение от V0v1k Посмотреть сообщение
http://k-ai.ru/obratnaya-polskaya-za...tsiya-na-java/

Добавлено через 3 минуты
Обратная польская нотация

Добавлено через 21 секунду
http://javatalks.ru/topics/23322

Добавлено через 33 секунды
http://forum.oszone.net/thread-228785.html
я гуглил, этот пример у меня выдавал ошибку..(http://k-ai.ru/obratnaya-polskaya-za...tsiya-na-java/).. может вы сможете его прицепить к моему коду? помоему в этом коде есть строка где закодированы амперсанты, ну и еще какието косяки..

я их все видел, и не с одним не смог сделать..
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
05.06.2013, 18:41 #10
не работает один пример - пробуйте другой.
начните с последней ссылки.

Добавлено через 15 секунд
или попробуйте сами реализовать алгоритм.
Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,189
Записей в блоге: 5
06.06.2013, 01:54  [ТС] #11
Цитата Сообщение от V0v1k Посмотреть сообщение
не работает один пример - пробуйте другой.
начните с последней ссылки.

Добавлено через 15 секунд
или попробуйте сами реализовать алгоритм.
Вот сделал, пример работает, но можете помоч добавить вычисление чисел FLOAT??
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
class PPN {
      static boolean isDelim(char c) {
      return c == ' ';
      }
      static boolean isOperator(char c) {
      return c == '+' || c == '-' || c == '*' || c == '/' || c == '%';
      }
      static int priority(char op) {
        switch (op) {
        case '+':
        case '-':
          return 1;
        case '*':
        case '/':
        case '%':
          return 2;
        default:
          return -1;
        }
      }
      static void processOperator(LinkedList<Float> st, char op) {
        Float r = ((Deque<Float>) st).removeLast();
        Float l = ((Deque<Float>) st).removeLast();
        switch (op) {
        case '+':
          st.add(l + r);
          break;
        case '-':
          st.add(l - r);
          break;
        case '*':
          st.add(l * r);
          break;
        case '/':
          st.add(l / r);
          break;
        case '%':
          st.add(l % r);
          break;
        }
      }
        public static String eval(String s) {
        LinkedList<Float> st = new LinkedList<Float>();
        LinkedList<Character> op = new LinkedList<Character>();
        for (int i = 0; i < s.length(); i++) {
          char c = s.charAt(i);
          if (isDelim(c))
            continue;
          if (c == '(')
            op.add('(');
          else if (c == ')') {
           while (op.getLast() != '(')
            processOperator(st,op.removeLast());       
            op.removeLast();     
          } else if (isOperator(c)) {
            while (!op.isEmpty() && priority(op.getLast()) >= priority(c))
            processOperator(st, op.removeLast());
            op.add(c);      
          } else {
            String operand = "";
            while (i < s.length() && Character.isDigit(s.charAt(i)))
            operand += s.charAt(i++);        
            --i;        
            st.add((float) Float.parseFloat(operand));
          }
        }    
        while (!op.isEmpty())
          processOperator(st, op.removeLast());
        return st.toString();
      }}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2013, 01:54
Привет! Вот еще темы с ответами:

Обратная польская запись - Информатика
Помогите пожалуйста найти обратную польскую запись выражения: 3-25+2/(31*5--3)*7*2 Заданы приоритеты и ассоциативности операций...

Обратная польская запись - JavaScript
помогите написать обратную польскую запись с учетом скобок и желательно с комментариями

Обратная польская запись - C++
Нужно создать класс с++ для вычисления обратной польской записи с помощь стека.

Обратная польская запись - Дискретная математика
Для выражения \left(a + b \right) + \left(c + \left(d + e \right) \right) . Добавлено через 4 минуты ab+cde+++ ???


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.06.2013, 01:54
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru