![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| insense |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 12.7.2007 Репутация: нет Всего: нет |
public class RecursCompf {
private static final int DEFSIZE = 255; private char[] str; private int index; private String out; private void compileF() { if (str[index] == '%' ){ index++; /* compileL(); }else compileK(); } private void compileK() { if (str[index] == '~'){ index++; compileL(); out += " ~ "; } else compileL(); } private void compileL() { compileT(); if (index >= str.length) return; if (str[index] == '+'){ index++; compileL(); out += "+ "; return; } if (str[index] == '-'){ index++; compileL(); out += "- "; } } private void compileT() { compileM(); if (index >= str.length) return; if (str[index] == '*'){ index++; compileT(); out += "* "; return; } if (str[index] == '/'){ index++; compileT(); out += "/ "; } } private void compileM() { if (str[index] == '(') { index++; compileF(); index++; } else compileV(); } private void compileV() { out += "" + str[index++] + " "; } public RecursCompf() { str = new char[DEFSIZE]; } public String compile(String _str) { str = _str.toCharArray(); out = ""; index = 0; compileF(); return out.trim(); } } |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 24 Всего: 151 |
insense, если у тебя массив символов, то как ты надеешься впихнуть в его ячейку строку? У тебя же вместо "a" получится "a % ".
-------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| insense |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 12.7.2007 Репутация: нет Всего: нет |
вот именно это мне и нужно, только я не знаю как это реализовать, поэтому я написала хоть смысл)
мне надо чтобы потом с а%(которая тип унарный +) он дальше и работал, когда вызывается операция % основная идея, того что мне надо сделать заключается в том, чтобы впихнуть унарный +(%) и -(~) в компилятор формул, чтобы при наборе: ~a+~b он выводил a ~ b ~ + а программка, которая все запускает: Это сообщение отредактировал(а) insense - 13.7.2007, 00:48 Присоединённый файл ( Кол-во скачиваний: 2 )
RunRecursCompf.java 0,45 Kb |
|||
|
||||
| nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 16 Всего: 31 |
Не сможет эта строка выполняться - ты в один символ пытаешься впихнуть строку. В код особо не вникал, но подозреваю, что тебе поможет использование массива строк вместо массива символов. Добавлено через 54 секунды Кстати, при выкладывании кода пользуйся специальной кнопочкой для стилевого оформления (список "Код" над полем ввода сообщения). -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 24 Всего: 151 |
insense, попробуй сделать что-то подобное моему коду внизу. Учти, я его не проверял, потому что не понял задачу.
Обрати внимание, что я увеличиваю индекс на три из-за вставки " % ". Но лучше сделай так: объясни задачу подробнее, и мы попробуем упростить твой код, или хотя бы сделать его более читабельным, потому что названия методов compileF compileK compileL compileT compileM compileV - это никуда не годится.
-------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
| insense |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 12.7.2007 Репутация: нет Всего: нет |
batiqoal, тво1й код работает точно также, как и мой без str[index]= str[index]+ " % ";
изначально код был:
и мне в него надо вставить два метода, которые выводят унарный +(%) и -(~), так чтобы при вводе %a(~a) программа выводила а%(a~), а при вводе ~a+~b __ a~ b~ +. Допустим, если бы просто ввели a+b програма бы вывела a b +: т.е унарные операции(~,%) как бы скрепляются с последующими символами. Поэтому, я и хотела сделать так, чтобы когда он встречает %(~) он бы скреплял его с последующей буковкой и выводил вместо a(a~) в итоговой строке. |
|||
|
||||
| nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 16 Всего: 31 |
То есть, как я понимаю, нужно просто поменять местами а и %. А если так:
Добавлено через 47 секунд Думаю, что это тебе подойдёт. -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
| insense |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 12.7.2007 Репутация: нет Всего: нет |
nornad, если делать как ты предложил, то теряется a.)
|
|||
|
||||
| nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 16 Всего: 31 |
Ничего там не должно теряться.
Давай сделаем так. Ты нормально напишешь свой код - так, чтобы каждый метод имел нормальное имя. А то в первом примере кода у тебя метод с +/- называется compileL, а во втором уже compileF. Вот кода сделаешь читабельный код, который не будет возможности путать с предыдущими примерами - тогда и поговорим, что и куда у тебя надо приделать. -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
| insense |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 12.7.2007 Репутация: нет Всего: нет |
исходник
ну, вот такое название методов понятней) а эта программка запускает:
|
||||||
|
|||||||
| nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 16 Всего: 31 |
Почему-то я сразу не подумал, что у тебя проблема совсем в другом. Всё дело в приоритете операций. Приоритет унарных +|- выше приоритета обычных +|- или *|/. Вот код, который отрабатывает верно:
Изменения я отметил комментариями [// .nornad] -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
| solve |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 9.5.2007 Репутация: нет Всего: 1 |
Разработка рекурсивного парсера выражений есть в книге
The Art of Java Herbert Schildt, James Holmes , McGraw-Hill/Osborne |
|||
|
||||
| insense |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 12.7.2007 Репутация: нет Всего: нет |
nornad спасибо большое, все оч хорошо работает)
|
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |