2016-09-20 7 views
0

Я пишу по существу небольшой калакулятор, в который вы вводите два числа, операнд типа «+, -, *, /» и т. Д., И он будет преформировать эту функцию.Собственная математическая операция в Java

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

package hw2p1; 

import java.util.Scanner; 
import javax.script.*; 

public class Calculator { 
public static void PrintCalculator(){ 

    Scanner input = new Scanner(System.in); 

    double num1; //1st entered number 
    double num2; //2nd entered number 
    String val1; //Math operator like + - * /. 
    double math1; //the results. 
    String equation = ""; 


    System.out.print("Enter the first number:"); 
     num1 = input.nextDouble(); 
    System.out.print("Enter the second number:"); 
     num2 = input.nextDouble(); 
    System.out.print("Enter an operator:"); 
     val1 = input.next(); 

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

+0

Не могли бы вы настроить оператор switch и выполнить операции соответственно? – Li357

+1

Когда вы говорите «изначально вычисляете значения», вы пытаетесь выполнить строку как исходный код? Вы можете использовать [ScriptEngine' для запуска JavaScript] (http://stackoverflow.com/q/14320308/5743988) ... – 4castle

+2

Что вы подразумеваете под «изначально вычислять значения»? –

ответ

1

я не мог удалить if-else, но может быть, вы можете попробовать что-то вроде этого

public static void main(String[] args) { 
    int result = operate("+").applyAsInt(10, 20); 
    System.out.println(result); 
} 

private static IntBinaryOperator operate(String op){ 
    switch(op){ 
    case "+": return Math::addExact; 
    case "-": return Math::subtractExact; 
    //other cases 
    } 
    throw new RuntimeException("incorrect operator"); 
} 

Один вопрос, хотя, Math не имеют методы двойного

+0

Я никогда не видел '::' в Java. Это что-то новое в Java 8? –

+0

Да, новый в java-8. вы можете Google для этого – sidgate

+0

Извините, но я не могу заставить это работать на моем конце. Кроме того, это вне основного метода, потому что его вызывает другой файл. – bonzo

0

ТЛ; Др

You должны явно указывать, что «+» означает добавление.

Long Anwser

Когда пользователь вводит что-то при запуске вашей программы, все это просто символы. Это зависит от вашей программы, чтобы интерпретировать эти символы, чтобы сделать что-то значимое. Scanner может быть полезным, потому что он знает, как интерпретировать символы 1234 как int. Однако, за пределами данных для встроенных типов, Scanner полностью тупой.

При создании собственной калькуляторной программы вы в основном пишете упрощенную версию компилятора Java. Компилятор - это программа, которая считывает символы из файла и преобразует их во что-то, что может выполняться на виртуальной машине Java. Вы будете делать то же самое в своей собственной программе калькулятора. Это означает, что вы должны явно писать правила, которые интерпретируют символы, которые представляют математические операторы, в операции, которые они фактически выполняют.

Если вам интересно узнать больше об этой теме, вы можете сделать некоторые исследования по составителям и переводчикам. Обычно они состоят из двух частей: лексического анализатора или лексера и анализатора. Это особенно необходимо, если вы хотите разрешить пользователю вводить полное математическое выражение, например 2 + 3, а не запрашивать их для каждой части выражения отдельно.

Надеюсь, это даст вам некоторую терминологию, которую вы можете использовать в поиске Google.

+0

Я думаю, что это может помочь. Я уверен, что буду использовать несколько операторов if else. К сожалению, я тоже не могу заставить их вести себя правильно, но это похоже на тему для другого вопроса. – bonzo

1

Самым простым решением было бы

public static double calculate(double a, String op, double b) { 
    switch(op) { 
     case "+": return a+b; 
     case "-": return a-b; 
     case "*": return a*b; 
     case "/": return a/b; 
     case "%": return a%b; 
     case "^": return Math.pow(a, b); 
     default: throw new IllegalArgumentException("no such operator '"+op+"'"); 
    } 
} 

, который семантически эквивалентен последовательности if - else заявлений, но ясно показывая намерение и потенциально более эффективным, хотя не так много стоит в рассуждали о производительности здесь.

Он может быть вызван как

double math1 = calculate(num1, val1, num2); //the results. 

, но вы действительно должны retink вашей переменной схемы именования. Если вам нужно добавить комментарий, рассказывающий о цели, стоящей за каждым объявлением, вы явно делаете что-то неправильно. Почему бы не назвать переменные, например. firstInputNumber, secondInputNumber, operator и result в первую очередь? Затем вам не нужны комментарии, рассказывающие о целях переменной.

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