Умножение / деление с учетом массива операторов и массива чисел - PullRequest
0 голосов
/ 22 февраля 2019

Задача: Учитывая массив символов с '*' или '/' (назовите это операторным массивом) и массивом с плавающей запятой, умножьте / разделите числа в порядке символов в массиве операторов.Последняя запись в массиве должна содержать окончательный ответ, в то время как остальные индексы равны нулю.

Допустим, у вас есть 1/2 * 3 * 4/5 * 6 Массив чисел будет [1.0,2.0,3.0,4.0,5.0,6.0], а массив операторов будет [/, *,*, /, *].Я получаю ошибку индекса из границ для строки nums [i] = null, но я не понимаю, почему (потому что если я получаю ошибку индекса из границ для nums [i], почему я не получаю ее для nums [i ++]?).

ops - это массив операторов, а nums - это массив чисел.

for(int i = 0; i < ops.length; i++){
    if(ops[i] == '*') {
       nums[i++] = nums[i]*nums[i++];
       nums[i] = null;
     }else if(ops[i] == '/') {
       nums[i++] = nums[i]/nums[i++];
       nums[i] = null;
     }
}

Спасибо!

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

i++ возвращает значение i для выражения, затем после вычисления выражения увеличивается i.

Скорее всего, вы захотите сделать:

for(int i = 0; i < ops.length; i++){
    if(ops[i] == '*') {
       nums[i+1] = nums[i]*nums[i+1];
       nums[i] = null;
     }else if(ops[i] == '/') {
       nums[i+1] = nums[i]/nums[i+1];
       nums[i] = null;
    }
}    

Из-за них вы увеличиваете i раньше, чем вам нужно.

Прочитайте это для получения дополнительной информации об увеличении постфикса / префикса (++).

0 голосов
/ 23 февраля 2019

Если ваш массив символов содержит только '*' или '/', вы можете использовать приведенный ниже код, чтобы уменьшить количество строк кода

  //Usage of Ternary Operator
  for(int i = 0; i < ops.length; i++){
          nums[i+1] = ops[i]=='*'?  nums[i] * nums[i+1]: nums[i]/nums[i+1];  
          nums[i]=null;
   }
0 голосов
/ 22 февраля 2019

Очевидно, что это не относится к порядку операций, но, поскольку вы имеете дело только с делением и умножением (они являются ассоциативными), оно все равно работает.числа и используйте соответствующий оператор для вычисления текущего числа с результатом выполнения.

public class Calculator {
    public static void main(String[] args) {
        double[] numbers = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 };
        String[] operators = { "/", "*", "*", "/", "*" };

        System.out.println(compute(numbers, operators)); // 1 ÷ 2 * 3 * 4 ÷ 5 * 6 = 7.2
    }

    private static double compute(double[] numbers, String[] operators) throws IllegalArgumentException {
        if (operators.length != numbers.length - 1) {
            throw new IllegalArgumentException("operator count must be one less than number count");
        }
        double result = numbers[0];
        if (numbers.length > 1) {
            for (int i = 1; i < numbers.length; i++) {
                switch (operators[i - 1]) {
                    case "+":
                        result += numbers[i];
                        break;
                    case "-":
                        result -= numbers[i];
                        break;
                    case "*":
                        result *= numbers[i];
                        break;
                    case "/":
                        result /= numbers[i];
                        break;
                }
            }
        }
        return result;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...