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

Обратная польская запись - Android

Восстановить пароль Регистрация
 
Sanu0074
 Аватар для Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,186
Записей в блоге: 5
05.06.2013, 16:49     Обратная польская запись #1
Пишу калькулятор для 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
Android Запись в массив
Android Запись разговоров
Запись Wav Файлов Android
Запись видео TimerTask() Android
Запись Файла Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
05.06.2013, 17:28     Обратная польская запись #2
суть проблемы не понятна.
Sanu0074
 Аватар для Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,186
Записей в блоге: 5
05.06.2013, 17:30  [ТС]     Обратная польская запись #3
Цитата Сообщение от V0v1k Посмотреть сообщение
суть проблемы не понятна.
Строка: 21+3*2-2

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

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

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

Добавлено через 4 минуты
не вижу в коде никаких арифметических операций...
я взял пример обратной польской записи.. надо выполнить вычисления
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
05.06.2013, 18:19     Обратная польская запись #6
Цитата Сообщение от Sanu0074 Посмотреть сообщение
я взял пример обратной польской записи..
загуглил, почитал...
обработку вы только реализовали, еще нужно вычисление реализовать, алгоритм есть даже в википедии.
Sanu0074
 Аватар для Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,186
Записей в блоге: 5
05.06.2013, 18:21  [ТС]     Обратная польская запись #7
Цитата Сообщение от V0v1k Посмотреть сообщение
загуглил, почитал...
обработку вы только реализовали, и то, вроде, неправильно, еще нужно вычисление реализовать, алгоритм есть даже в википедии.
вот мне нужна помощь
V0v1k
1157 / 981 / 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
 Аватар для Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,186
Записей в блоге: 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
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
05.06.2013, 18:41     Обратная польская запись #10
не работает один пример - пробуйте другой.
начните с последней ссылки.

Добавлено через 15 секунд
или попробуйте сами реализовать алгоритм.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2013, 01:54     Обратная польская запись
Еще ссылки по теме:

Android Отчеты ошибок в релизе приложения, обратная связь
Обратная связь Android
Запись в файл из IntentService Android
Обратная связь в приложении на Андроид Android
Android Функция обратная getString()

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

Или воспользуйтесь поиском по форуму:
Sanu0074
 Аватар для Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,186
Записей в блоге: 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();
      }}
Yandex
Объявления
06.06.2013, 01:54     Обратная польская запись
Ответ Создать тему
Опции темы

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