В то время как условие разрыва цикла - PullRequest
1 голос
/ 29 октября 2010

Я хочу сделать некоторые расчеты с полигонами.Поэтому мне нужно, чтобы пользователь ввел координаты x и y.Это выполняется с помощью следующего кода:

private static boolean isX = true;
private static Scanner scanner = new Scanner(System.in);

private static double readDouble() {
    double value = 0;
    System.out.print("Koordinate " + (isX ? "X" : "Y") + " : ");
    value = scanner.nextDouble();
    if (!isX)
        System.out.println("--------------------");
    isX = !isX;
    return value;
}

Для вычисления контура многоугольника мне нужно общее количество многоугольников.Ввод осуществляется в цикле.Ввод должен заканчиваться, когда последние данные многоугольника имеют те же координаты, что и первые.Например, первым входом будет X: 1, Y: 1, X: 1, X: 2 будет завершать ввод.Так что что-то не так с условием разрыва.

есть идеи?

Ответы [ 2 ]

4 голосов
/ 29 октября 2010

Вы должны иметь или (||), а не и (&&)

   while((x != fX) || (y != fY)){
        nVertex++;
        x = readDouble(); y = readDouble();
    }

Вы хотите ограничиться, если x не равно fX или y не равно fY, то есть

NOT (x == fX AND y == fY)

в псевдокоде.С вашим текущим кодом вы завершите цикл, как только один из значений x и y совпадет с начальными значениями.

2 голосов
/ 29 октября 2010

Как говорит Павел, вы должны иметь "||"(или оператор) не "&&" (и оператор) в условии while.Вы хотите выполнить цикл, пока оба не будут одинаковыми, поэтому вы хотите продолжить, если оба неравны.

Не менее важно, что вы не должны использовать сравнения с равными для сравнения с плавающей запятой.Неточность с плавающей запятой означает, что вы не должны полагаться на значения, чтобы быть точно равными.Хотя весьма вероятно, что одно и то же значение, считанное из файла, будет давать точно такое же значение в машинном представлении, это не гарантируется.Вам следует подумать об изменении формата файла, чтобы указать конец многоугольника другим способом.Если это невозможно, рассмотрите возможность использования менее точного сравнения, такого как координаты, равные некоторому небольшому уровню точности (скажем, 1e-6).Итак:

while (Math.abs(x-fx)<1e-6 || Math.abs(y-fy)<1e-6) {
...