Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как это реальзовать(рекурсивный ко)мпилятор формул 
V
    Опции темы
insense
Дата 12.7.2007, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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++;

      /*  smile  */    str[index]= str[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();
    }
}
PM MAIL   Вверх
batigoal
Дата 12.7.2007, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



insense, если у тебя массив символов, то как ты надеешься впихнуть в его ячейку строку? У тебя же вместо "a" получится "a % ".


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
insense
Дата 13.7.2007, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 12.7.2007

Репутация: нет
Всего: нет



вот именно это мне и нужно, только я не знаю как это реализовать, поэтому я написала хоть смысл)
мне надо чтобы потом с а%(которая тип унарный +) он дальше и работал, когда вызывается операция %


основная идея, того что мне надо сделать заключается в том, чтобы впихнуть унарный +(%) и -(~) в компилятор формул, чтобы при наборе:
~a+~b
он выводил
a ~ b ~ +
а программка, которая все запускает:

Это сообщение отредактировал(а) insense - 13.7.2007, 00:48

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  RunRecursCompf.java 0,45 Kb
PM MAIL   Вверх
nornad
Дата 13.7.2007, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Цитата(insense @  13.7.2007,  01:28 Найти цитируемый пост)
    /*  smile  */    str[index]= str[index]+ " % "; /*Вся проблема в эой сторочке!!!!!!!!!!!!!!!!!!!!!!!!!!! надо что-то сделать, чтобы это могло выполняться!!!!!!!*/

Не сможет эта строка выполняться - ты в один символ пытаешься впихнуть строку.
В код особо не вникал, но подозреваю, что тебе поможет использование массива строк вместо массива символов.

Добавлено через 54 секунды
Кстати, при выкладывании кода пользуйся специальной кнопочкой для стилевого оформления (список "Код" над полем ввода сообщения).


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
batigoal
Дата 13.7.2007, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



insense, попробуй сделать что-то подобное моему коду внизу. Учти, я его не проверял, потому что не понял задачу.
Обрати внимание, что я увеличиваю индекс на три из-за вставки " % ".

Но лучше сделай так: объясни задачу подробнее, и мы попробуем упростить твой код, или хотя бы сделать его более читабельным, потому что названия методов 

compileF
compileK
compileL
compileT
compileM
compileV


- это никуда не годится.


Код

public class RecursCompf
{
    private String str;
    private int index;
    private String out;

    private void compileF()
    {
        if (str.charAt(index) == '%')
        {
            index++;
            str = str.substring(0, index) + str.charAt(index) + " % " + str.substring(index+1);
            index += 3;
            compileL();
        }
        else
        {
            compileK();
        }
    }

    private void compileK()
    {
        if (str.charAt(index) == '~')
        {
            index++;
            compileL();
            out += " ~ ";


        }
        else
        {
            compileL();
        }

    }

    private void compileL()
    {
        compileT();
        if (index >= str.length())
        {
            return;
        }
        if (str.charAt(index) == '+')
        {
            index++;
            compileL();
            out += "+ ";
            return;
        }
        if (str.charAt(index) == '-')
        {
            index++;
            compileL();
            out += "- ";
        }
    }

    private void compileT()
    {
        compileM();
        if (index >= str.length())
        {
            return;
        }
        if (str.charAt(index) == '*')
        {
            index++;
            compileT();
            out += "* ";
            return;
        }
        if (str.charAt(index) == '/')
        {
            index++;
            compileT();
            out += "/ ";
        }
    }

    private void compileM()
    {
        if (str.charAt(index) == '(')
        {
            index++;
            compileF();
            index++;
        }
        else
        {
            compileV();
        }
    }

    private void compileV()
    {
        out += "" + str.charAt(index++) + " ";
    }

    public RecursCompf()
    {

    }

    public String compile(String _str)
    {
        this.str = _str;
        out = "";
        index = 0;
        compileF();
        return out.trim();
    }
}



--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
insense
Дата 13.7.2007, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 12.7.2007

Репутация: нет
Всего: нет



batiqoal, тво1й код работает точно также, как и мой без str[index]= str[index]+ " % ";

изначально код был:
Код

// тЕЛХТУЙЧОЩК ЛПНРЙМСФПТ ЖПТНХМ.
public class RecursCompf {
    private static final int DEFSIZE = 255;
    private char[] str;
    private int    index;
    private String out;
    
    private void compileF() {
        compileT();
        if (index >= str.length) return;
        if (str[index] == '+'){
            index++;
            compileF();
            out += "+ ";
            return;
        }
        if (str[index] == '-'){
            index++;
            compileF();
            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();
    }
}




и мне в него надо вставить два метода, которые выводят  унарный +(%) и -(~), так чтобы при вводе %a(~a) программа выводила а%(a~),
а при вводе ~a+~b  __   a~ b~ +. Допустим, если бы просто ввели a+b програма бы вывела a b +:
т.е унарные операции(~,%) как бы скрепляются с последующими символами.


Поэтому, я и хотела сделать так, чтобы когда он встречает %(~) он бы скреплял его с последующей буковкой  и выводил вместо a(a~) в итоговой строке.
PM MAIL   Вверх
nornad
Дата 13.7.2007, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



То есть, как я понимаю, нужно просто поменять местами а и %. А если так:
Код

    private void compileF() {
        if (str[index] == '%' ){
            str[index] = str[index+1];
            str[++index] = '%';
            compileL();
         }else
            compileK();
    }


Добавлено через 47 секунд
Думаю, что это тебе подойдёт. smile 


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
insense
Дата 13.7.2007, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 12.7.2007

Репутация: нет
Всего: нет



nornad, если делать как ты предложил, то теряется a.) smile 

PM MAIL   Вверх
nornad
Дата 13.7.2007, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Ничего там не должно теряться.
Давай сделаем так. Ты нормально напишешь свой код - так, чтобы каждый метод имел нормальное имя. А то в первом примере кода у тебя метод с +/- называется compileL, а во втором уже compileF.
Вот кода сделаешь читабельный код, который не будет возможности путать с предыдущими примерами - тогда и поговорим, что и куда у тебя надо приделать.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
insense
Дата 13.7.2007, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 12.7.2007

Репутация: нет
Всего: нет



Код

public class RecursCompf {
    private static final int DEFSIZE = 255;
    private char[] str;
    private int    index;
    private String out;
    
    private void uplus() {
        if (str[index] == '%' ){
            index++;

     str[index]= str[index]+ " % "; 
         slogenie();
         }else
            uminus();
    }
    
    private void uminus() {
        if (str[index] == '~'){
            index++;
            slogenie();  
            out += " ~ ";
           
           
        } else slogenie();
       
    }
    private void slogenie() {
        umnogenie();
        if (index >= str.length) return;
        if (str[index] == '+'){
            index++;
            slogenie();
            out += "+ ";
            return;
        }
        if (str[index] == '-'){
            index++;
            slogenie();
            out += "- ";
        }
    }
    private void umnogenie() {
        scobka();
        if (index >= str.length) return;
        if (str[index] == '*'){
            index++;
            umnogenie();
            out += "* ";
            return;
        }
        if (str[index] == '/'){
            index++;
            umnogenie();
            out += "/ ";
        }
    }
    private void scobka() {
        if (str[index] == '(') {
            index++;
            uplus();
            index++;
        } else
        bukva();
    }
    private void bukva() {
        out += "" + str[index++] + " ";
    }

    public RecursCompf() {    
        str = new char[DEFSIZE];
    }
    
    public String compile(String _str) {
        str = _str.toCharArray();
        out = "";
        index = 0;
        uplus();
        return out.trim();
    }
}



исходник
Код

public class RecursCompf {
    private static final int DEFSIZE = 255;
    private char[] str;
    private int    index;
    private String out;
    
    private void slogenie() {
        umnogenie();
        if (index >= str.length) return;
        if (str[index] == '+'){
            index++;
            slogenie();
            out += "+ ";
            return;
        }
        if (str[index] == '-'){
            index++;
            slogenie();
            out += "- ";
        }
    }
    private void umnogenie() {
        scobka();
        if (index >= str.length) return;
        if (str[index] == '*'){
            index++;
            umnogenie();
            out += "* ";
            return;
        }
        if (str[index] == '/'){
            index++;
            umnogenie();
            out += "/ ";
        }
    }
    private void scobka() {
        if (str[index] == '(') {
            index++;
            slogenie();
            index++;
        } else
        bukva();
    }
    private void bukva() {
        out += "" + str[index++] + " ";
    }

    public RecursCompf() {    
        str = new char[DEFSIZE];
    }
    
    public String compile(String _str) {
        str = _str.toCharArray();
        out = "";
        index = 0;
        slogenie();
        return out.trim();
    }
}

ну, вот такое название методов понятней) 
а эта программка запускает:
Код

import java.io.BufferedReader;
import java.io.InputStreamReader;


public class RunRecursCompf {
    public static void main(String[] args) throws Exception {
        RecursCompf c = new RecursCompf();
        BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
        String s; 
        while (true) {
         System.out.print("vvedite formulu -> ");
         System.out.println(c.compile(r.readLine()));
         
        }
    }
}


PM MAIL   Вверх
nornad
Дата 14.7.2007, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Почему-то я сразу не подумал, что у тебя проблема совсем в другом. Всё дело в приоритете операций. Приоритет унарных +|- выше приоритета обычных +|- или *|/. Вот код, который отрабатывает верно:
Код


public class RecursCompf {
    private static final int DEFSIZE = 255;
    private char[] str;
    private int    index;
    private String out;
    
    private void slogenie() {
        umnogenie();
        if (index >= str.length) return;
        if (str[index] == '+'){
            index++;
            slogenie();
            out += "+ ";
            return;
        }
        if (str[index] == '-'){
            index++;
            slogenie();
            out += "- ";
        }
    }
    private void umnogenie() {
        scobka();
        if (index >= str.length) return;
        if (str[index] == '*'){
            index++;
            umnogenie();
            out += "* ";
            return;
        }
        if (str[index] == '/'){
            index++;
            umnogenie();
            out += "/ ";
        }
    }
    private void scobka() {
        if (str[index] == '(') {
            index++;
            slogenie(); // .nornad
            index++;
        } else
        bukva();
    }
    private void bukva() {
        if (str[index] == '%' ){ // .nornad
         out += str[++index] + " % ";
         ++index;
        } else if (str[index] == '~') {
            out += str[++index] + " ~ ";
            ++index;
        } else
         out += str[index++] + " ";
    }
    public RecursCompf() {    
        str = new char[DEFSIZE];
    }
    
    public String compile(String _str) {
        str = _str.toCharArray();
        out = "";
        index = 0;
        slogenie(); // .nornad
        return out.trim();
    }
}

Изменения я отметил комментариями [// .nornad]


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
solve
Дата 14.7.2007, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 9.5.2007

Репутация: нет
Всего: 1



Разработка рекурсивного парсера выражений есть в книге
The Art of Java Herbert Schildt, James Holmes , McGraw-Hill/Osborne
PM MAIL   Вверх
insense
Дата 22.7.2007, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 12.7.2007

Репутация: нет
Всего: нет



nornad спасибо большое, все оч хорошо работает)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0590 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.