Почему println в цикле for печатает только один раз и неправильное значение?

Мне нужно создать код, который по заданному имени многоугольника и координатам его вершин печатает периметр. Даже если я изменяю входные значения, он всегда печатает 5.0 . Что я делаю не так?

Я попытался использовать цикл for и напечатать длину каждой стороны треугольника, но результат по-прежнему равен 5,0 и печатается только один раз. Теперь я попытался напечатать рекурсивную сумму на каждом шаге, но безрезультатно.

public static void main(String[] args) {
        int i;
        double result = 0;
        double x1 = Double.valueOf(args[1]);
        double y1 = Double.valueOf(args[2]);
        Punto p1 = new Punto(x1, y1);
        double x2 = Double.valueOf(args[3]);
        double y2 = Double.valueOf(args[4]);
        Punto p2 = new Punto(x2, y2);
        double x3 = Double.valueOf(args[5]);
        double y3 = Double.valueOf(args[6]);
        Punto p3 = new Punto(x3, y3);
        Punto[] punti = {p1, p2, p3};
        Poligono A = new Poligono(args[0], punti);
        for (i = 0; i < punti.length - 1; i++) {
            double xa = Punto.getX(punti[i++]);
            double xb = Punto.getX(punti[i]);
            double ya = Punto.getY(punti[i++]);
            double yb = Punto.getY(punti[i]);
            result = result + Math.sqrt(Math.pow(Math.abs(xa - xb), 2) + Math.pow(Math.abs(ya - yb), 2));
            System.out.println(result);
        }
    }

(Punto означает точку) Правильный ответ — 12, но он всегда печатает 5 и только один раз.


person Clarissa De Simoni    schedule 15.04.2019    source источник
comment
i < punti.length - 1 условие неверно. В вашем случае punti.length равно 3, поэтому цикл будет выполняться только для i=0 и i=1. Более того, punti[i++] также увеличивает i после первого запуска i==3, поэтому не будет запускаться еще раз.   -  person Amongalen    schedule 15.04.2019


Ответы (2)


Вероятно, вам следует заменить double xa = Punto.getX(punti[i++]); на double xa = Punto.getX(punti[i + 1]);, чтобы не изменять i, так как он используется для перебора массива.

person devgianlu    schedule 15.04.2019
comment
кроме того, i++ возвращает старое i, затем добавляет 1. - person vincrichaud; 15.04.2019

Правильный ответ на ваш вопрос уже есть у @devgianlu!

Однако я хотел бы добавить, что когда происходит что-то явно неразумное, попробуйте отладить свой код (например, пошаговое выполнение строк). Вы обнаружите, что машина всегда делает то, что мы говорим. Иногда мы думаем объявить конкретную задачу, но на самом деле мы непреднамеренно объявляем что-то другое.

person Leos313    schedule 26.03.2020