Здравствуйте. 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);
}
}
}
}
Здравствуйте, 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 используется?
Здравствуйте, 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 используется?
Ещё, конечно, здесь 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 — класс дробей.) Всё, конечно, не работает. ПОдскажите, пожалуйста, как это реализовать.
Проще всего разбирать такие выражения рекурсивно в порядке приоритетов операций. Псевдокод:
разборка(лексемы) {
встать_на_первую_лексему
вернуть разобрать_сложения(лексемы)
}
разобрать_сложения(лексемы) {
левое = разобрать_умножения(лексемы)
пока текущая_лексема + или -
{
оп = текущая_лексема
встать_на_следующую_лексему
правое = разобрать_умножения(лексемы)
если оп == +
левое += правое
иначе
левое -= правое
}
вернуть левое
}
разобрать_умножения(лексемы) {
левое = получить_число(лексемы)
пока текущая_лексема * или /
{
оп = текущая_лексема
встать_на_следующую_лексему
правое = получить_число(лексемы)
если оп == *
левое *= правое
иначе
левое /= правое
}
вернуть левое
}
Такой алгоритм легко расширяется на скобки, унарные + — и т.п.