2014-11-07 2 views
0

Моя текущая цель - проанализировать фракции и создать неправильные фракции. Например:Разделительные фракции

1_1/3 + 5/3

должны прийти в консоль, как

4/3 + 5/3

Может кто-нибудь сказать мне, я буду в праве и что я должен сосредоточить?

import java.util.Scanner; 

public class FracCalc { 
    public static void main (String[] args) { 
     Scanner input = new Scanner(System.in); 
      System.out.println("Welcome to FracCalc"); 
      System.out.println("Type expressions with fractions, and I will evaluate them."); 

     boolean isTrue = true; 
     String in = ""; 
     while(isTrue) { 
      in = input.nextLine(); 
      if (in.equals("quit")) { 
       System.out.println("Thanks for running FracCalc!"); 
       isTrue = false; 
      }else{ 
       System.out.println("You asked me to compute" + in); 
       } 
      } 
     } 
     public static void parse(String in){ 
      int underscore = in.indexOf("_"); 
      int slash = in.lastIndexOf("/"); 

      String wholenumber = in.substring(0, underscore); 
      String numerator = in.substring(underscore + 1,slash); 
      String denominator = in.substring(slash + 1); 

      if (underscore<0 & slash<0) { 
       in = wholenumber; 
      } else if (underscore<0 & slash>0) { 
       in = in; 
      } else if (underscore>0 & slash>0) { 

      } else if (underscore>0 & slash<0) { 
       in = "Error"; 
     } 
    } 
} 
+0

Я бы сказал, что вы '.split (" _ ")' эту строку и автоматически имеют обе стороны за один шаг. – ChiefTwoPencils

+0

В чем проблема? – Tetramputechture

+0

мы не узнали о .split («_») У меня возникают проблемы с выяснением, что делать для else else if (underscore> 0 & slash> 0) {, а также в System.out.println («Вы попросили меня вычислить« + in », я попытался заменить синтаксический анализ, но он не работает. –

ответ

0

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

Я бы проанализировал символ строки символом. Итерируйте по строке, и если ваш текущий символ является числом, добавьте его в StringBuffer, называемый «currentNumber» или что-то в этом роде. Если ваш текущий персонаж не является числом, вам нужно решить, что делать. Если это знак подчеркивания, вы знаете, что значение в вашей переменной currentNumber является частью всего числа. Затем вы можете сохранить это в отдельной переменной и очистить свой текущий буфер. Если ваш текущий символ является символом косой черты, вы должны знать, что значение в currentNumber является числителем вашей дроби. Если текущий символ является символом пробела, вы можете просто проигнорировать его. Если это «+» или «-», вы узнаете, что то, что у вас есть в переменной currentNumber, является вашим знаменателем дроби. Затем вы также должны сохранить символ в отдельной переменной как ваш «оператор». Существует множество способов реализовать это. Например, у вас может быть логика, в которой говорилось: «если у меня есть действительное значение в моем числителе, а не в моем знаменателе, и персонаж, который я сейчас просматриваю, не является допустимым числовым символом, тогда я добавил все цифры в свой знаменатель к переменной currentNumber, и поэтому он должен теперь содержать мой знаменатель. Поэтому поместите значение в currentNumber в мою переменную знаменателя и перейдите к следующему символу ».

Надеюсь, я не потерял вас полностью здесь ... но, конечно, это может быть слишком продвинутым для того, что вам нужно делать. Например, вы не указали формат входной строки, всегда ли она будет в том же формате, что и вы, или можете выглядеть иначе? Может ли целая часть номера иметь две цифры или ее можно пропустить полностью?

Метод, описанный выше, называется конечным автоматом, и если вы еще не узнали о них, ваш учитель должен, вероятно, быть впечатлен, если вы передали задание с использованием этой техники. В FSM есть много материалов для чтения, поэтому Google - ваш друг.

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

+0

. Хорошо, судя по вашему комментарию выше, я бы сказал, что вы, вероятно, не узнали о FSM, и вышеупомянутый подход будет наиболее вероятно, будет слишком много для вас, чтобы заняться пока. Но все равно стоит подумать ... и немного почитать о FSM. Это того стоит. – StFS

Смежные вопросы