2014-10-30 3 views
0

Я хочу сделать расчет 1_1/2 * 1_1/2. Я не мог понять, как это сделать, но ниже мой текущий код, а ниже это мой код мысли для этой реализации. Я знаю, что мой код ограничен базовым num1 op. и num2. Я хочу, если num1 или num2 равно 1_1/2, это то, что 1 будет выглядеть как целое число и сделать его 2/2, и он будет добавлен к 1/2, чтобы сделать 3/2 и сделать разделение, чтобы сделать его 1.5 и следовать уравнение соответствует.** ПОМОЩЬ ** Расчет смешанной фракции в Java Код

static int DO_DEBUG = 0; // set to 1 for messages on, or 0 for messages off 

static final boolean BASIC_VERSION = true; 


public static void main(String[] args) { 

    calculator(); 
    //test(); 
} 


public static void test() { 
    String[] tests = { 
      "1+1", 
      "12 * 12", 
      "1_1/2 * 1_1/2", 
      "12 + mom", 
      "12/3/3", 
      "1_/3 + 5", 
      "1 & 4", 
      "12 +5", 
      "1/3 - 1_4/5/6" 
    }; 
    for (int i = 0; i < tests.length; i++) { 
     System.out.println("TESTING: " + tests[i]); 
     processInput(tests[i]); 
    } 

} 
static void calculator() { 

    Scanner console = new Scanner (System.in); //turing input on 

    System.out.println(); 
    String level = "Basic"; 
    if (! BASIC_VERSION) { 
     level = "Advanced"; 
    } 
    System.out.println("Welcome to the " + level + " Calculator");// have the option to pick basic or advance 

    String input = ""; 
    while (true) { 
     printPrompt();//this prompt is introduced in a different method 
     input = console.nextLine(); 
     if (isQuitRequest(input)) {//method to quit, says 'bye' 
      break;//ends 
     } 
     processInput(input);// doing the task 
    } 
    System.out.println("bye"); 
    System.out.println(); 
    console.close(); // quite keyword that closes console 
} 

static boolean isQuitRequest(String input) { 
    return input.equalsIgnoreCase("quit"); 
} 

static void processInput(String input) { 

    if (isQuitRequest(input)) { // if quit, does not reach here 
     return; 
    } 

    String error = null; 

    String[] tokens = input.split(" "); 
    if (tokens.length < 3) { 
     error = "Not enough entires."; 
    } else if (tokens.length > 3) { 
     error = "Too many entries."; 
    } 
    if (error != null) { 
     printError(input, error); 
     return; 
    } 

    String operator = tokens[1]; 
    String addition = "+"; 
    String subtraction = "-"; 
    String multiplication = "*"; 
    String division = "/"; 
    double num1 = Double.parseDouble(tokens[0]); 
    double num2 = Double.parseDouble(tokens[2]); 
    double result; 
    String number1 = tokens[0]; 
    String operation = tokens[1]; 
    String number2 = tokens[2]; 
    debug("processInput: parse result number1='" + number1 + "' " 
      + "number2='" + number2 + "' " 
      + "operation='" + operation + "'." 
     ); 

    if ((! isNumberValid(number1)) 
      || (! isNumberValid(number2) 
      || (operation.length() != 1) 
      || ("+-*/".indexOf(operation) < 0))) { 
     error = "Syntax error."; 
    } 
     // If there is an error, print it, 
     // else print the parse results. 
    if (error != null) { 
     printError(input, error); 
    } else { 
     //System.out.println("Numbers are " + number1 + " and " 
      // + number2 + ". Operation is " + operation +"."); 

     if (operator.equals(addition)){ 
      result = num1 + num2; 
      System.out.println("Answer is " + result);   
     } 
     else if (operator.equals(subtraction)){ 
      result = num1 - num2; 
      System.out.println("Answer is " + result);   
     } 
     else if (operator.equals(multiplication)){ 
      result = num1 * num2; 
      System.out.println("Answer is " + result);   
     } 
     else if (operator.equals(division)) { 
      result = num1/num2; 
      System.out.println("Answer is " + result);   
     } 
     else { 

     } 

      } 
    } 



//just validating -_- 
static boolean isNumberValid(String numstr) { 
    boolean isValid = true; 
    if (BASIC_VERSION) { 
     isValid = isValidInt(numstr); 
    } else { // ADVANCED version. 
     isValid = isValidMixedFraction(numstr);; 
    } 
    return isValid; 
} 

//This is to assure that everything entered is valid 
static boolean isValidInt(String numstr) { 
    boolean isValid = true; 
    for(int i = 0; i < numstr.length(); i++) { 
     char c = numstr.charAt(i); 
     if (! Character.isDigit(c)) { 
      isValid = false; 
     } 
    } 
    return isValid; 
} 


// formating of mixed numbers 
static boolean isValidMixedFraction(String numstr) { 
    boolean isvalid = true; 

     // get parts this string around the _ 
    String[] underscoreTokens = numstr.split("_"); 
    String firstPart = underscoreTokens[0]; 
    String secondPart; 
    if(underscoreTokens.length == 1) { 
     secondPart = null; 
    } else if(underscoreTokens.length == 2) { 
     secondPart = underscoreTokens[1]; 
    } else { // underscoreTokens.length > 2 length matters 
     return false; 
    } 


    debug("isValidMixedFraction: firstPart='"+ firstPart + "', secondPart='" 
      + secondPart +"'");   
    if (secondPart == null) { 
     // first part can be "n" or "n/n" 
     if((! isValidInt(firstPart)) && (! isValidFraction(firstPart))) { 
      isvalid = false; 
     } 
    } else { // 2nd part not null. 

     if (! isValidInt(firstPart)) { 
      isvalid = false; 
     } 
     if (! isValidFraction(secondPart)) { 
      isvalid = false; 
     } 
    } // end else second part not null 
    return isvalid; 
} 

//validating the format of the fraction if it is to be valid 
static boolean isValidFraction(String numstr) { 
    boolean isValid = true; 
     // get parts this string around the _ 
    String[] slashTokens = numstr.split("/"); 
    if(slashTokens.length != 2) { 
     return false; 
    } 

    String firstPart = slashTokens[0]; 
    String secondPart = slashTokens[1]; 

    if (! isValidInt(firstPart)) { 
     isValid = false; 
    } else if (! isValidInt(secondPart)) { 
     isValid = false; 
    } 
    return isValid; 
} 


static void printError(String input, String error) { 
    System.out.println("ERROR: " + error + " for input '" + input + "'."); 
} 

static void printPrompt() { 
    System.out.print("> "); 
} 

static void debug(String s) { 
    if (0 < DO_DEBUG) { 
     System.out.println("DBG: " + s);} 
    } 

} 

Другое:

String num1; 
String num2; 

d1 = Double.parse.Double(num 1); 
d1 = convtMixed(num1); 



double convertMixed(String fract) 
double result = 0; 
fract.split(_); 

result + = Double.parseDouble(token[0]); 

Как? Что бы вы сделали? Я использую область действия? Где?

+0

Спасибо за изменения, @kickbuttowski. Вы можете мне помочь? – Integral

+0

другой человек попросил вас объяснить, что означает 1_1/2 в вашем коде? –

+0

Какой еще человек? Я знаю, что это значит. Я просто смущен. 1 - целое число, и это часть того, что было перед ним, а затем - это раскол, который говорит, что 1/2 является дробью. Я хочу преобразовать 1 в 2/2 и добавить его в 1/2, чтобы быть 3/2, и быть разделенным на 1,5, чтобы следовать введенному выражению – Integral

ответ

0

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

* не использовать много, если заменить его с переключателем

String number1 = tokens[0]; 
String operation = tokens[1]; 
String number2 = tokens[2]; 

if(number2 == '('){ 
tempNum = number1 ; 
tempOP =operation ; 

number1 = tokens[2]; 
operation = tokens[3]; 
number2 = tokens[4]; 
    } 

if(tokens[5] == ')'){ 
number1 = tempNum ; 
operation = tempOP ; 
number2 = result 

} 

Мой Консультировать уточнить код

String addition = "+"; 
    String subtraction = "-"; 
    String multiplication = "*"; 
    String division = "/"; 



if (operator.equals(addition)){ 
      result = num1 + num2; 
      System.out.println("Answer is " + result);   
     } 
     else if (operator.equals(subtraction)){ 
      result = num1 - num2; 
      System.out.println("Answer is " + result);   
     } 
     else if (operator.equals(multiplication)){ 
      result = num1 * num2; 
      System.out.println("Answer is " + result);   
     } 
     else if (operator.equals(division)) { 
      result = num1/num2; 
      System.out.println("Answer is " + result);   
     } 

Заменить весь этот код, (если у вас есть много сопоставляются не использовать вложенные если использовать переключатель)

switch (operator) { 
    case "+": 
     result = num1 + num2; 
     System.out.println("Answer is " + result); 
    break; 
// other compare here 
    default: 
     break; 
    } 


String[] tokens = input.split(" "); 
    if (tokens.length < 3) { 
     error = "Not enough entires."; 
    } else if (tokens.length > 3) { 
     error = "Too many entries."; 
    } 

Здесь ограничить работу только с три элемента, используйте StringTokenizer

           // any input here 
StringTokenizer string = new StringTokenizer("1/(1/2)"); 
     for(int i = 0 ; i<string.countTokens() ; i++){ 
      // you can put result in array of string to refer to it alter 
      //String [] result , and fill it with tokens from StringTokenizer 
      String result = string.nextToken(); 
      if(result.equalsIgnoreCase("(")){ 
       // write my syntax here 

      } 
     } 
+0

Это просто смутило меня больше. Как мой код неправилен во всей полноте? – Integral

+0

@Integral Я обновляю свой ответ, получаю некоторую идею и стараюсь сделать это сам. –

0

Я очень надеюсь, что вам не нужна помощь в разборе уравнений, только в создании все это работать. Если это правда, вы можете найти мой ответ полезным.

Попробуйте создать новый класс для числа. Этот новый класс будет иметь два поля:

int divisor 
int divident 

Целые числа будут сохранены и таким образом: 1 = 1/1, 2 = 2/1.

Вам необходимо обеспечить нормализованную функцию funtion, которая меняет 25/5 на 5/1. Это относительно легко, так как вам нужно только найти самые общие делители этих чисел, а затем просто разделить их.

Вы должны переопределить операции, такие как добавление, умножение, деление и т.д. Например (псевдокод дополнение)

Number a; 
Number b; 
divident = a.divident * b.divident; 
divisor = a.divisor * b.divident + b.divisor*a.divident; 
normalise(); 

В, и если вы хотите просто необработанный результат можно реализовать функцию, которая будет просто разделить divident и делитель и возвращают результат в виде двойного

Например: 1_1/2 с использованием этого метода будет обработан следующим образом (после разбора): номер а: 1/1 номер B: 1/2 действия: дополнение если добавление выполнено правильно, оно вернет результат 3/2.

В модели вашего приложения я бы не советовал менять 3/2 до 1,5. Такие более или менее односторонние преобразования должны выполняться в части вашего приложения. Таким образом, вы можете быть гибкими, когда дело доходит до результата отображения.Вы можете дать его каким-либо образом пользователю, как в реальных калькуляторах.

+0

Очень полезно, но моя проблема заключалась в анализе уравнения и его правильном выполнении. – Integral

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

  • Нет связанных вопросов^_^