Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
 Аватар для _Azazel_
0 / 0 / 2
Регистрация: 06.11.2009
Сообщений: 85

Удаление дублирующихся символов.Вывод сообщения об ошибке

07.12.2012, 12:25. Показов 1440. Ответов 1

Студворк — интернет-сервис помощи студентам
Здравствуйте. Имеется программа, преобразующая строку в обратный польский код. Пользователь вводит, скажем, выражение с (( или ++ или последовательно два числа без оператора между ними, задача - удалить лишнюю скобку или оператор (или вывести сообщение об ошибке).

Добавлено через 1 час 55 минут
Вот сама программа
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
import java.math.BigDecimal;
import java.util.*;
import java.io.*;
public class Calc {
    /**
     * @param args
     */
    public static  Map<String, Integer> MAIN_MATH_OPERATIONS;
     static {
         MAIN_MATH_OPERATIONS = new HashMap<String, Integer>();
         MAIN_MATH_OPERATIONS.put("*", 1);
         MAIN_MATH_OPERATIONS.put("/", 1);
         MAIN_MATH_OPERATIONS.put("+", 2);
         MAIN_MATH_OPERATIONS.put("-", 2);
         }
     public static String sortingStation(String expression, Map<String, Integer> operations, String leftBracket, String rightBracket) 
     {
         if (expression == null || expression.length() == 0)
             throw new IllegalStateException("Введите выражение");
             if (operations == null || operations.isEmpty())
             throw new IllegalStateException("Операторы отсутствуют!");
             List<String> out = new ArrayList<String>();
             Stack<String> stack = new Stack<String>();
             expression = expression.replace("=", "");
             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("Некорректное количество скобок");
                         }
                         }
                         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 calculateExpression(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));
         
         }
         }
         }
         if (stack.size() != 1)
         throw new IllegalArgumentException("Некорректно введено выражение.");
         return stack.pop();
         }
     
    public static void main(String[] args) throws IOException 
    { String key;
    do
    {
        BufferedReader bReader = new
    BufferedReader (new InputStreamReader(System.in)); 
    System.out.println("\n" +
            "Выберите действие\n" +
            "1 - Вычислить произвольное выражение\n" +
            "2 - Выйти");
    key=bReader.readLine();
    if (key.equals("1"))
        
    {System.out.println("Введите выражение для вычисления.");
    //String expression = " 3 + 4 * 2 / (1 - 5) + 2";
    String expression;
    expression = bReader.readLine();
    System.out.println("Исходное выражение: " + expression);
    String rpn = sortingStation(expression, MAIN_MATH_OPERATIONS);
    System.out.println("Обратная польская нотация: " + rpn);
    System.out.println("\tРезультат " + calculateExpression(expression));
    }
    else if (key.equals("2")) 
    {System.exit(0);}
    else {
        System.out.println("Неправильно выбраный пункт!!!");
    }
    }while(!key.equals("1,2"));
    }
    }
Как убрать дублирующиеся скобки, операторы? Или как правильно отловить ошибку?

Добавлено через 23 часа 55 минут
Все, спасибо, тему можно закрывать...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.12.2012, 12:25
Ответы с готовыми решениями:

IOException сообщения об ошибке
Добрый день. Есть ли где-нибудь лист с возможными сообщениями IOException при ошибке. Хочу выводить определённое сообщение в...

Если больше 10 символов в textBox, то вывод сообщения об ошибке
как сделать если в textbox введено более 10 символов то вывод ошибки Добавлено через 20 минут как сделать если число введенное...

Удаление циклом дублирующихся символов
В общем: public string Editencriptkey(string _encriptkey) { ...

1
130 / 117 / 30
Регистрация: 14.11.2010
Сообщений: 707
07.12.2012, 12:43
Цитата Сообщение от _Azazel_ Посмотреть сообщение
Все, спасибо, тему можно закрывать...
Вы бы написали, как проблему решили...
Думаю, кому-нибудь интересно было бы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.12.2012, 12:43
Помогаю со студенческими работами здесь

Удаление дублирующихся символов из строки
string text2 = Convert.ToString(textBox3.Text).ToUpper(); string alpha = &quot;abcdefghiklmnopqrstuvwxyz&quot;; string...

Вывод сообщения об ошибке
Подскажите как сделать , чтобы если программа не видит БД выводился только Mes Box с описанием проблемы, обработчик исключений сделал,...

Вывод сообщения об ошибке из C++ в QML
В книжке М. Шлее описан пример взаимодействия C++ и QT с помощью регистрирования своего типа. Но: под типом понимается класс, который...

Вывод сообщения об ошибке на этой же странице
Есть форма, которая запрашивает адрес (улица, дом, кв) и отправляет эти данные на обработку скрипту, который проверяет есть ли в базе...

Вывод на экран сообщения об ошибке ввода на строке
Здравствуйте все! У меня уже есть готовый код, который вычисляет в textBox количество элементов массива, их сумму, произведение и среднее,...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru