метод add()
От: Fraction  
Дата: 11.12.13 13:14
Оценка:
Здравствуйте. java изучаю совсем неадавно, поэтому извиняюсь за странный вопрос, задаётся ,например, выражение 1+2/3 (2/3 — дробь), разбивается на лексемы 1,+,2,/,3 и записывается в "lexems". В функции calculate пытаюсь сделать так: если встретится / — записать в "lexems", потом получить цифру перед / и после, чтобы затем собрать дробь (2 = a, 3 = b --> Fraction y = new Fraction (a, b), где Fraction — класс дробей.) Всё, конечно, не работает. ПОдскажите, пожалуйста, как это реализовать.

static List<String> lexems = new LinkedList<>();
...
if (str.charAt(i) == '/') lexems.add("/");
...

public static void calculat(List<String> lexems)
    {
    while (lexems.size() > 1)
    {
    
    for (int i = 0; i <= lexems.size();i++)
    {
        if (lexems.get(i) == "/")
        {
            String a = lexems.get(i-1); //попытка получить цифру перед /
            System.out.println(a);
            
        }
                
    }
    
    }
    }
Re: метод add()
От: Blazkowicz Россия  
Дата: 11.12.13 13:21
Оценка:
Здравствуйте, Fraction, Вы писали:

F>Здравствуйте. java изучаю совсем неадавно, поэтому извиняюсь за странный вопрос, задаётся ,например, выражение 1+2/3 (2/3 — дробь), разбивается на лексемы 1,+,2,/,3 и записывается в "lexems". В функции calculate пытаюсь сделать так: если встретится / — записать в "lexems", потом получить цифру перед / и после, чтобы затем собрать дробь (2 = a, 3 = b --> Fraction y = new Fraction (a, b), где Fraction — класс дробей.) Всё, конечно, не работает. ПОдскажите, пожалуйста, как это реализовать.

Пошаговая отладка уже освоена? Какая IDE используется?
Re[2]: метод add()
От: Fraction  
Дата: 11.12.13 13:41
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Fraction, Вы писали:


F>>Здравствуйте. java изучаю совсем неадавно, поэтому извиняюсь за странный вопрос, задаётся ,например, выражение 1+2/3 (2/3 — дробь), разбивается на лексемы 1,+,2,/,3 и записывается в "lexems". В функции calculate пытаюсь сделать так: если встретится / — записать в "lexems", потом получить цифру перед / и после, чтобы затем собрать дробь (2 = a, 3 = b --> Fraction y = new Fraction (a, b), где Fraction — класс дробей.) Всё, конечно, не работает. ПОдскажите, пожалуйста, как это реализовать.

B>Пошаговая отладка уже освоена? Какая IDE используется?

Не совсем IDE — eclipse.
Re[3]: метод add()
От: Blazkowicz Россия  
Дата: 11.12.13 13:45
Оценка:
F>Не совсем IDE — eclipse.
http://www.youtube.com/results?search_query=отладка+в+Eclipse
http://www.youtube.com/watch?v=czeWze5fWZY
http://khpi-iip.mipk.kharkiv.edu/library/extent/prog/eclJDT/I_12.html
Re: метод add()
От: avpavlov  
Дата: 11.12.13 14:06
Оценка:
F>if (str.charAt(i) == '/') lexems.add("/");
F> if (lexems.get(i) == "/")

Вот если у тебя в программе именно так, то я не понимаю почему не работает.

А в общем случае, в Яве лучше не сравнивать ссылки через ==, если ты на 146% не уверен в том, что делаешь.
Используй lexems.get(i).equals("/")
Re: метод add()
От: avpavlov  
Дата: 11.12.13 14:09
Оценка:
> for (int i = 0; i <= lexems.size();i++)

Ещё, конечно, здесь IndexOutOfBoundsException полетит
Re: метод add()
От: Аноним  
Дата: 11.12.13 15:04
Оценка:
Здравствуйте, Fraction, Вы писали:

F>Здравствуйте. java изучаю совсем неадавно, поэтому извиняюсь за странный вопрос, задаётся ,например, выражение 1+2/3 (2/3 — дробь), разбивается на лексемы 1,+,2,/,3 и записывается в "lexems". В функции calculate пытаюсь сделать так: если встретится / — записать в "lexems", потом получить цифру перед / и после, чтобы затем собрать дробь (2 = a, 3 = b --> Fraction y = new Fraction (a, b), где Fraction — класс дробей.) Всё, конечно, не работает. ПОдскажите, пожалуйста, как это реализовать.


Проще всего разбирать такие выражения рекурсивно в порядке приоритетов операций. Псевдокод:

разборка(лексемы) {
  встать_на_первую_лексему
  вернуть разобрать_сложения(лексемы)
}

разобрать_сложения(лексемы) {
  левое = разобрать_умножения(лексемы)
  пока текущая_лексема + или - 
  {
    оп = текущая_лексема
    встать_на_следующую_лексему
    правое = разобрать_умножения(лексемы)
    если оп == +
      левое += правое
    иначе
      левое -= правое
  }
  вернуть левое  
}
  
разобрать_умножения(лексемы) {
  левое = получить_число(лексемы)
  пока текущая_лексема * или / 
  {
    оп = текущая_лексема
    встать_на_следующую_лексему
    правое = получить_число(лексемы)
    если оп == *
      левое *= правое
    иначе
      левое /= правое
  }
  вернуть левое  
}


Такой алгоритм легко расширяется на скобки, унарные + — и т.п.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.