Форум программистов, компьютерный форум, киберфорум
Java EE (J2EE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 1
Регистрация: 11.11.2016
Сообщений: 3
1

Алгоритм калькулятора для вычисления множества значений

25.10.2017, 16:59. Показов 3004. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго дня. В кодинге я новичек.
В целях самообразования в данный момент пишу калькулятор на Android.
Действия над 2-мя простыми числами типа 2+5 или 198 / 8 работает без проблем.
Но вот подойти к действиям как: 2*7+200 или 100+100-50 пока не получается придумать правильный алгоритм.

Собственно перейдем к моему кривокоду:
Каждая кнопка на циферблате калькулятора делает вызов метода TempCheker() и передает туда свой Character.
Все кнопки писать сюда не буду.
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
@Override
    public void onClick(View v) {
 
        switch (v.getId()) {
 
            case R.id.button_1: {
                TempCheker('1');
 
                break;
            }
case R.id.button_plus: {
                TempCheker('+');
 
                break;
            }
case R.id.button_clear: {
                expression = "";
                textView1.setText("");
 
                break;
            }
            case R.id.button_equall: {
                IsCalculator(expression);
 
                break;
            }
     }
}
Далее метод TempChecker() передает char в метод IsWriter() а также вызывает метод ShowText() который обновляет информацию в textView.

Java
1
2
3
4
5
6
    private void TempCheker(char v) {
 
        IsWriter(v);
        ShowText();
 
    }
Метод IsWriter() при каждом нажатии кнопки записывает её char в последовательность строки вида 1+3222-1 итд ,
Также тут есть несколько булевских методов которые определяют входной char как цифру или действие:

Java
1
2
3
4
5
6
7
8
9
10
11
12
    private static void IsWriter(char v) {
 
        if (expression == null || IsNumber(v)) {
 
            expression += v;
            
        } else if (expression.toCharArray().length > 0) {
            expression += v;
            
        }
 
    }
Ну и конечно после нажатия кнопки "=" происходит вызов метода IsCalculator() в который передается готовая стройка вида a+b:

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
private void IsCalculator(String inexpression) {
 
 
        char[] input = inexpression.toCharArray();
        Stack<String> numbersStack = new Stack<>();
        Stack<Character> characterStack = new Stack<>();
 
 
        for (int i = 0; i < input.length; i++) {
 
            if (Character.isDigit(input[i])) {
                String a = "";
                while (!IsOperand(input[i])) {
                    a += input[i];
                    i++;
                    if (i == input.length)
                        break;
                }
 
                numbersStack.push(a);
 
            }
        }
        for (int z = 0; z < input.length; z++) {
            if (!Character.isDigit(input[z])) {
                characterStack.push(input[z]);
 
            }
        }
 
        for (int x = 1; x <= numbersStack.size(); x++) {
            num1 = Double.parseDouble(numbersStack.pop());
            num2 = Double.parseDouble(numbersStack.pop());
        }
 
        switch (characterStack.peek()) {
            case '+':
 
                resultat = num1 + num2;
 
                break;
            case '-':
                resultat = num1 - num2;
                break;
            case '*':
                resultat = num1 * num2;
                break;
            case '/':
                resultat = num1 / num2;
                break;
        }
 
        textView1.setText("" + resultat);
    }
В данном методе числа уходят в stack1 а знаки дейтсвия в characterStack после чего свичуются и вичисляются, затем результат записывается в textView.

По сути в stack1 и characterStack я могу записывать любое колличество чисел и знаков действия, но как совместить их пока не могу понять, изветсно это чисел всегда на 1 больше чем знаков дейтсвия, в голове есть мысли по поводу временных переменных итд.
Писать патерны и свичи на каждый вариант выражения нереально так как может быть a+b+c*y/z+g

В каком направлении копать ?
Также прошу дать коментарии по стилистике моего говнокода так как в будущем не охото писать индустский код.

Заранее всем спасибо за помощ.

Ну и view калькулятора
Алгоритм калькулятора для вычисления множества значений
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.10.2017, 16:59
Ответы с готовыми решениями:

Разработать алгоритм для вычисления значений
Разработать алгоритм с применением вложенных базовых структур «цикл с предусловием» или «цикл с...

Разработать алгоритм для вычисления значений функции
помогите сделать пожалуйста!!!!

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

Создайте алгоритм и программу для вычисления значений y по формулам

2
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
25.10.2017, 18:43 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
public class Parser {
    private final String str;
    private int pos = -1;
    private int c;
    private boolean parsed = false;
    private double state;
 
    public Parser(String str) {
        this.str = str;
    }
 
    private void readChar() {
        pos++;
        if (pos < str.length()) {
            c = str.charAt(pos);
        } else {
            c = -1;
        }
    }
 
    private void skipSpaces() {
        while (Character.isWhitespace(c)) {
            readChar();
        }
    }
 
    public double parse() {
        if (parsed) {
            return state;
        }
        readChar();
        double result = adder();
        if (c != -1) {
            throw new RuntimeException("Неправильный символ: " + (char) c);
        }
        parsed = true;
        state = result;
        return result;
    }
 
    private double adder() {
        double result = multiplier(); 
        while (true) {
            skipSpaces();
            if (c == '+') {
                readChar();
                result += multiplier();
            } else if (c == '-') {
                readChar();
                result -= multiplier();
            } else {
                return result;
            }
        }
    }
 
    private double multiplier() {
        double result = tokenizer(); 
        while (true) {
            skipSpaces();
            if (c == '/') {
                readChar();
                result /= tokenizer();
            } else if (c == '*' || c == '(') {
                if (c == '*')
                    readChar();
                result *= tokenizer();
            } else {
                return result;
            }
        }
    }
 
    private double tokenizer() {
        double result;
        boolean n = false;
        skipSpaces();
        if (c == '+' || c == '-') {
            n = c == '-';
            readChar();
            skipSpaces();
        }
        if (c == '(') {
            readChar();
            result = adder();
            if (c == ')')
                readChar();
        } else {
            StringBuilder sb = new StringBuilder();
            while ((c >= '0' && c <= '9')) {
                sb.append((char) c);
                readChar();
            }
            if (sb.length() == 0)
                throw new RuntimeException("Неправильный символ: " + (char) c);
            result = Double.parseDouble(sb.toString());
        }
        skipSpaces();
 
        if (n) {
            result = -result;
        }
 
        return result;
    }
}
0
0 / 0 / 1
Регистрация: 11.11.2016
Сообщений: 3
28.10.2017, 09:48  [ТС] 3
Спасибо за помощь. Задача решина , осталась косметика и обработка ошибок и мелочей.
Скидываю краткий код.

Java
1
2
 Queue<String> numbersQueue = new LinkedList<>();
     Queue<Character> characterQueue = new LinkedList<>();
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
    private void IsStackGenerator(String expression) {
 
        char[] input = expression.toCharArray();
        for (int i = 0; i < input.length; i++) {
 
            if (Character.isDigit(input[i])) {
                String a = "";
                while (!IsOperand(input[i])) {
 
                    a += input[i];
 
                    i++;
                    if (i == input.length)
                        break;
                }
                numbersQueue.add(a);
            }
        }
        for (int z = 0; z < input.length; z++) {
            if (!Character.isDigit(input[z])) {
                characterQueue.add(input[z]);
 
            }
        }
 
    }
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
 private void IsCalculator() {
        Log.d(MyTAG,"Before peeak"+ tempvalue);
    tempvalue = Double.parseDouble(numbersQueue.peek());
        Log.d(MyTAG,"After peeak"+ tempvalue);
        numbersQueue.remove();
        for (String num : numbersQueue){
            Log.d(MyTAG,"NUM peeak "+ num);
            Log.d(MyTAG,"tempvalue "+ tempvalue);
 
                switch (characterQueue.peek()){
                    case '+':{
 
                        IsPlus(Double.parseDouble(num));
                        break;
                    }
                    case '-':{
 
                        IsMinus(Double.parseDouble(num));
                        break;
                    }
                    case '*':{
                        ;
                        IsMultiply(Double.parseDouble(num));
                        break;
                    }
                    case '/':{
 
                        IsDevide(Double.parseDouble(num));
                        break;
                    }
                }
                characterQueue.remove();
 
        }
    }


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void IsPlus(double value) {
 
        tempvalue = tempvalue + value;
 
 
    }
 
    private void IsMinus(double value) {
 
        tempvalue = tempvalue - value;
    }
 
    private void IsMultiply(double value) {
        tempvalue = tempvalue * value;
 
    }
 
    private void IsDevide(double value) {
        tempvalue = tempvalue / value;
 
    }
0
28.10.2017, 09:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.10.2017, 09:48
Помогаю со студенческими работами здесь

Построить алгоритм для вычисления значений функции y(x) = Sin(x)+2
Построить алгоритм для вычисления значений функции y(x) = Sin(x)+2 на интервале (0;50) с шагом...

Составить алгоритм и программу вычисления функции f(x) для N значений аргумента X
Составить алгоритм и программу вычисления функции f(x) для N значений аргумента X равномерно...

Разработать алгоритм и составить по нему программу для вычисления значений функции z = f(x,y)
Разработать алгоритм и составить по нему программу для вычисления значений функции z = f(x,y)....

Разработать алгоритм и составить программу для вычисления значений переменных a и b по формуле
Разработать алгоритм и составить программу для вычисления значений переменных a и b по формуле: a...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru