1 / 1 / 0
Регистрация: 07.01.2014
Сообщений: 22
1

Неправильные результаты вычислений. Как исправить?

15.06.2014, 17:47. Показов 687. Ответов 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
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
public class ExpressionUtils {
    InputStream fis;
    OutputStream fos;
    BufferedReader br;
    String line;
    PrintWriter pw;
    public ArrayList<String> results = new ArrayList<String>();
    public static final Map<String, Integer> MAIN_MATH_OPERATIONS = new HashMap<String, Integer>();
 
    static {
        MAIN_MATH_OPERATIONS.put("*", 1);
        MAIN_MATH_OPERATIONS.put("/", 1);
        MAIN_MATH_OPERATIONS.put("+", 2);
        MAIN_MATH_OPERATIONS.put("-", 2);
        MAIN_MATH_OPERATIONS.put("sin", 1);
        MAIN_MATH_OPERATIONS.put("cos", 1);
        MAIN_MATH_OPERATIONS.put("tg", 1);
        MAIN_MATH_OPERATIONS.put("log", 1);
        MAIN_MATH_OPERATIONS.put("^", 1);
    }
 
    public void read() throws IOException {
        try {
            fis = new
                    FileInputStream("input.txt");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        br = new
 
                BufferedReader(new InputStreamReader(fis, Charset.forName("UTF-8")));
        pw = new PrintWriter(new File("output.txt"));
 
        while ((line = br.readLine()) != null) {
            StringBuilder currentResult = new StringBuilder();
            currentResult.append(line + "=" + calculate(line));
            pw.println(currentResult);
        }
        br.close();
        br = null;
        pw.close();
        pw = null;
        fis = null;
    }
 
    public static String sortingStation(String expression, Map<String, Integer> operations,
                                        String leftBracket, String rightBracket) {
        if (expression == null || expression.length() == 0)
            throw new IllegalStateException("Expression isn't specified.");
        if (operations == null || operations.isEmpty())
            throw new IllegalStateException("Operations aren't specified.");
        // Выходная строка, разбитая на "символы" - операции и операнды.
        List<String> out = new ArrayList<String>();
        // Стек операций.
        Stack<String> stack = new Stack<String>();
 
        // Удаление пробелов из выражения.
        expression = expression.replace(" ", "");
 
        // Множество "символов", не являющихся операндами (операции и скобки).
        Set<String> operationSymbols = new HashSet<String>(operations.keySet());
        operationSymbols.add(leftBracket);
        operationSymbols.add(rightBracket);
 
        // Индекс, на котором закончился разбор строки на прошлой итерации.
        int index = 0;
        // Признак необходимости поиска следующего элемента.
        boolean findNext = true;
        while (findNext) {
            int nextOperationIndex = expression.length();
            String nextOperation = "";
            // Поиск следующего оператора или скобки.
            for (String operation : operationSymbols) {
                int i = expression.indexOf(operation, index);
                if (i >= 0 && i < nextOperationIndex) {
                    nextOperation = operation;
                    nextOperationIndex = i;
                }
            }
            if (nextOperationIndex == expression.length()) {
                findNext = false;
            } else {
                // Если оператору или скобке предшествует операнд, добавляем его в выходную строку.
                if (index != nextOperationIndex) {
                    out.add(expression.substring(index, nextOperationIndex));
                }
                // Обработка операторов и скобок.
                // Открывающая скобка.
                if (nextOperation.equals(leftBracket)) {
                    stack.push(nextOperation);
                }
                // Закрывающая скобка.
                else if (nextOperation.equals(rightBracket)) {
                    while (!stack.peek().equals(leftBracket)) {
                        out.add(stack.pop());
                        if (stack.empty()) {
                            throw new IllegalArgumentException("Unmatched brackets");
                        }
                    }
                    stack.pop();
                }
                // Операция.
                else {
                    while (!stack.empty() && !stack.peek().equals(leftBracket) &&
                            (operations.get(nextOperation) >= operations.get(stack.peek()))) {
                        out.add(stack.pop());
                    }
                    stack.push(nextOperation);
                }
                index = nextOperationIndex + nextOperation.length();
            }
        }
        // Добавление в выходную строку операндов после последнего операнда.
        if (index != expression.length()) {
            out.add(expression.substring(index));
        }
        // Преобразование выходного списка к выходной строке.
        while (!stack.empty()) {
            out.add(stack.pop());
        }
        StringBuffer result = new StringBuffer();
        if (!out.isEmpty())
            result.append(out.remove(0));
        while (!out.isEmpty())
            result.append(" ").append(out.remove(0));
 
        return result.toString();
 
    }
 
    public static String sortingStation(String expression, Map<String, Integer> operations) {
        return sortingStation(expression, operations, "(", ")");
    }
 
    public static BigDecimal calculate(String expression) {
        String rpn = sortingStation(expression, MAIN_MATH_OPERATIONS);
        StringTokenizer tokenizer = new StringTokenizer(rpn, " ");
        Stack<BigDecimal> stack = new Stack<BigDecimal>();
        while (tokenizer.hasMoreTokens()) {
            String token = tokenizer.nextToken();// Операнд.
            if (!MAIN_MATH_OPERATIONS.keySet().contains(token)) {
                stack.push(new BigDecimal(token));
            } else {
                BigDecimal operand2 = stack.pop();
                BigDecimal operand1 = stack.empty() ? BigDecimal.ZERO : stack.pop();
                if (token.equals("*")) {
                    stack.push(operand1.multiply(operand2));
                } else if (token.equals("/")) {
                    stack.push(operand1.divide(operand2));
                } else if (token.equals("+")) {
                    stack.push(operand1.add(operand2));
                } else if (token.equals("-")) {
                    stack.push(operand1.subtract(operand2));
                } else if (token.equals("^")) {
                    stack.push(operand1.pow(Integer.valueOf(String.valueOf(operand2))));
                } else if (token.equals("sin")) {
                    stack.push(BigDecimal.valueOf(Math.sin(Double.valueOf(String.valueOf(operand2)))));
                } else if (token.equals("cos")) {
                    stack.push(BigDecimal.valueOf(Math.cos(Double.valueOf(String.valueOf(operand2)))));
                } else if (token.equals("tg")) {
                    stack.push(BigDecimal.valueOf(Math.tan(Double.valueOf(String.valueOf(operand2)))));
                } else if (token.equals("log")) {
                    stack.push(BigDecimal.valueOf(Math.log(Double.valueOf(String.valueOf(operand2)))));
                }
            }
        }
        if (stack.size() != 1)
            throw new IllegalArgumentException("Expression syntax error.");
        return stack.pop();
    }
}
 
public class MainClass {
    public static void main(String[] args) throws IOException {
        ExpressionUtils main = new ExpressionUtils();
        main.read();
    }
}
Добавлено через 7 минут
это пример результата работы программы(
5+4 - (100*5) + sin(88)=0.03539830273366068

Добавлено через 3 часа 36 минут
делала перевод в радианы (Math.toRadians) но результат все тот же. Помогите кто-нибудь!(
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.06.2014, 17:47
Ответы с готовыми решениями:

Как вывести промежуточные результаты вычислений
есть такое выражение: как сделать так,что б выводило промежуточное вычисление: выражение =...

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

Как занести результаты вычислений в двумерный массив?
Задача: найти значения y=e^(x^(2)-10), если -1&lt;x&lt;1 с шагом в 0,1. Результаты оформить в виде...

Программа выводит неправильные результаты
program d; uses crt; var a:array of integer; s:real; i,n,k: integer; begin randomize;...

2
Эксперт Java
2390 / 2216 / 564
Регистрация: 28.12.2010
Сообщений: 8,655
15.06.2014, 19:26 2
используйте дебаг (режим отладки) и смотрите где получается не тот ответ что вы ожидаете.
0
1 / 1 / 0
Регистрация: 07.01.2014
Сообщений: 22
15.06.2014, 20:23  [ТС] 3
Использовала. однако особой пользы это не принесло. ведь выражение начинает выполняться но в результате записывается только результат синуса. к примеру 5+43+sin(88) в опз переводится как 5 43 + + 88 sin и в результате выходит 5+43 + sin(88)=0.03539830273366068
Остальные примеры без sin/cos/tg/log даже со скобками и прочим получаются верно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2014, 20:23
Помогаю со студенческими работами здесь

Неправильные результаты математических функций
#include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt; int main() { //const float PI =...

Может ли memtest показывать неправильные результаты
Всем привет. Знакомый принес ноутбук. Сказал, что иногда появляются синии экраны. Я стал прогонять...

Решение СЛАУ методом Гаусса. Неправильные результаты
Всем добрый день. Программа неправильно находит корни. Не могу понять почему. Правильные корни:...

Операции с булевыми массивами в классе выполняются, но возвращают неправильные результаты
class set {private: int max; int n; bool *a; public: set(int ms) { n=ms; max=ms;

Результаты вычислений
Ребят, создала две модели не получается их нормально про интерпретировать. Помогите пожалуйста! ...

Результаты вычислений с копейками в 1С 6.0
Да, 6.0, раритет. Но приходится работать. Знания в 1С практически нулевые. Человек, который...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru