Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
3 / 3 / 1
Регистрация: 06.07.2014
Сообщений: 145

Тестирование алгоритма на проверку вершин квадрата

24.10.2014, 13:55. Показов 2285. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! У меня есть алгоритм для выяснения, являются ли точки с координатами вершинами квадрата(задаются 4 точки). Тестируя алгоритм вручную(сверяя результаты алгоритма с правильными), ошибки не обнаруживал, а вот во время отправки программы(алгоритма) на сайт, выводится что алгоритм из всех подставленных в него значений, решает только 60%. Хотел бы узнать, в каком месте алгоритма я допустил ошибку:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.util.Scanner;
 
public class sDecision {
    static Scanner inputer = new Scanner(System.in);
    static long sC[][] = new long[4][2];
    static long sS;
    static boolean sSB;
    static int sCF;
    static String eA = "YES";
 
    public static void main(String args[]) {
        for (short cI = 0; cI <= 3; cI++)
            for (short cIi = 0; cIi <= 1; cIi++) sC[cI][cIi] = inputer.nextLong();
        for (short cI = 0; cI <= 3; cI++)
            for (short cIi = 0; cIi <= 3; cIi++)
                if ((cI != cIi) && (sC[cI][1] == sC[cIi][1])) {
                    if (sSB == false) {
                        sS = sSP(sC[cI][0], sC[cIi][0]);
                        sCF += 1;
                        sSB = true;
                    } else if (sSP(sC[cI][0], sC[cIi][0]) == sS) sCF += 1;
                } else if ((cI != cIi) && (sC[cI][0] == sC[cIi][0])) {
                    if (sSB == false) {
                        sS = sSP(sC[cI][1], sC[cIi][1]);
                        sCF += 1;
                        sSB = true;
                    } else if (sSP(sC[cI][1], sC[cIi][1]) == sS) sCF += 1;
                }
        if (sCF != 8) eA = "NO";
        System.out.print(eA);
    }
 
    public static long sSP(long c1, long c2) {
        if (((c1 <= 0) && (c2 >= 0)) || ((c1 >= 0) && (c2 <= 0))) 
            return Math.abs(c1) + Math.abs(c2) + 1;
        else 
            return Math.abs(Math.abs(c1) - Math.abs(c2)) + 1;
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.10.2014, 13:55
Ответы с готовыми решениями:

Заданы координаты двух вершин квадрата. Определить координаты двух других вершин и его площадь
Доброго времени суток) Прошу помочь с заданием не показывает четвертую точку в квадрате и еще надо что бы считало площадь этого квадрата...

Поиск вершин квадрата
мне надо найти остальные коорденаты вершин квадрата если известны 2 противоположных вершыны, дикартовая система координат

Поиск вершин квадрата
Мне нужно решить задачу на прологе: Даны целые числа х1,у1, х2,у2, ... хn,уn. Выяснить, найдуться ли среди точек с координатами...

13
12 / 12 / 4
Регистрация: 17.12.2012
Сообщений: 71
24.10.2014, 21:28
Если бы было отформатировано, прокомментировано, или хотя бы переменные по-человечески назывались - может кто-то и пробовал бы разобраться.
+ напишите задание
+ напишите, как собирались решать
1
3 / 3 / 1
Регистрация: 06.07.2014
Сообщений: 145
24.10.2014, 22:13  [ТС]
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.util.Scanner;
public class sDecision{
 static Scanner inputer = new Scanner(System.in); /* Ввод данных в консоль */
 static long sC[][] = new long[4][2]; /* Массив с 4 точками, каждая из которых содержит по 2 оси (x,y) */
 static long sS; /* Переменная в которую инициализируется размер одного из расстояний от одной точки до другой (размер одной из сторон квадрата) */
 static boolean sSB; /* Переменная со значением "Инициализирована ли переменная sS?" */
 static int sCF; /* Перменная хранит сумму прилежащих к каждой оси(x,y) каждой точки ещё одной точки (если точки образуют квадрат то переменная должная иметь число 8) */
 static String eA = "YES"; /* Конечный вывод - "Можно считать точки вершинами квадрата?" */
 public static void main(String args[]){
  for(short cI = 0; cI<=3; cI++) /* Инициализируем наш массив с точками */
   for(short cIi = 0; cIi<=1; cIi++) sC[cI][cIi] = inputer.nextLong();
  for(short cI = 0; cI<=3; cI++) /* Сравниваем каждую точку из массива с её соседями */
   for(short cIi = 0; cIi<=3; cIi++)
    if((cI!=cIi) && (sC[cI][1]==sC[cIi][1])){ /* Если это верно - то что точка на своём номере оси y имеет соседа с таким же номером y */
     if(sSB==false){sS = sSP(sC[cI][0],sC[cIi][0]); sCF+=1; sSB = true;} /* Если это верно то что не инициализирована переменная sS, то инициализируем её расстоянием осей x одной точки и другой и заносим в sCF - 1, то есть точка имеет правильного соседа на своём номере оси y */
     else if(sSP(sC[cI][0],sC[cIi][0])==sS) sCF+=1;} /* Иначе если расстояние по оси x этих точек соответствует расстоянию инициализированной переменной sS то заносим в sCF - 1, то есть точка имеет правильного соседа на своей оси y */
    else if((cI!=cIi) && (sC[cI][0]==sC[cIi][0])){ /* Иначе если верно - то что точка на своём номере оси x имеет соседа с таким же номером y */
     if(sSB==false){sS = sSP(sC[cI][1],sC[cIi][1]); sCF+=1; sSB = true;} /* Если это верно то что не инициализирована переменная sS, то инициализируем её расстоянием осей y одной точки и другой и заносим в sCF - 1, то есть точка имеет правильного соседа на своём номере оси x */
     else if(sSP(sC[cI][1],sC[cIi][1])==sS) sCF+=1;} /* Иначе если расстояние по оси y этих точек соответствует расстоянию инициализированной переменной sS то заносим в sCF - 1, то есть точка имеет правильного соседа на своей оси x */
  if(sCF!=8) eA="NO"; /* Если это неверно - то что каждая из точек на своих осях имеет по одной соседней точке, т.е. 1 точка имеет свою пару с таким же номером y(точку) и имеет пару с таким же номером x(точку) как и у неё и всего их 2, а т.к. точек 4 то всего должно быть 8 соседей(если это квадрат) на все точки */
  System.out.print(eA); /* Результат вычислений */
 }
 public static long sSP(long c1, long c2){ /* Функция определяющая расстояние между цифрами(точками) */
  if (((c1<=0) && (c2>=0)) || ((c1>=0) && (c2<=0))) return Math.abs(c1)+Math.abs(c2)+1;
  else return Math.abs(Math.abs(c1)-Math.abs(c2))+1;
 }
}
Суть программа такова - убедится в том что каждая из точек на своих осях (x,y) имеет по одной точке, т.е. каждая точка имеет по 2 товарища, и т.к. точек 4 то всего должно быть 8 товарищей если точки образуют квадрат. Так же программа сверяет расстояние каждой перебираемой точки с другой перебираемой точкой с соответствующим(правильным) расстоянием.
0
3 / 3 / 1
Регистрация: 06.07.2014
Сообщений: 145
26.10.2014, 14:56  [ТС]
Может есть такие кто хотя бы сможет протестировать некоторые точки с координатами на программе, и убедиться верный ли будет выводиться ответ, в случае если результат будет неверен, то попрошу отписаться. Буду очень благодарен.
0
0 / 0 / 0
Регистрация: 13.12.2012
Сообщений: 15
27.10.2014, 00:31
форматирование, коменты и читаемость кода вряд ли ваш конек. а теперь к сути - вам был задан такой алгоритм или ето вы его придумали? в проверке на сайте (среди тестовых даных) допускаються (или нет) немного повернутые квадраты и\или отрицательные числа. если есть возможность вывода ввводимих сайтом даных то выложите их, особенно те шо не работают.
0
3 / 3 / 1
Регистрация: 06.07.2014
Сообщений: 145
27.10.2014, 00:47  [ТС]
Как то не подумал о перевёрнутых квадратах.
Условие:
На плоскости задано 4 точки (координаты всех точек попарно различны). Напишите программу, определяющую являются ли эти точки вершинами квадрата.

Формат входных данных:
Задано четыре строки, каждая из которых содержит два числа через пробел – координаты точек (первое число координата х, вторая – координата y). Все числа по модулю не превосходят 10^9.

Формат выходных данных:
Выведите в единственной строке YES – если точки образуют квадрат и NO – квадрат с такими вершинами построить нельзя.
0
0 / 0 / 0
Регистрация: 13.12.2012
Сообщений: 15
27.10.2014, 01:58
поигрался немного с вводом координат. мне кажется что проблема как раз с повернутими квадратами. как я понял алгоритма вас не задавали и ето ваш собственный и он не универсален. простите но перебрать по камушкам вашу програмную логику 5-10 минут не хватит. легче самому с нуля написать.

я б посоветовал убрать проверку на совпадение по осям и сделать проверку только по растоянию.

вариантов много, в худшем случае просто вичислить растояние каждой точки к другим. записать в 4 отдельних масива по 3 числа. сделать сортировку, тогда просто прировнять величины с каждого масива по индексам. также учтите что дробовая часть может немного отличатся и надо будет делать какое то округление (например к 0.1) результатов.

может хватит провверки на то что меньшее растояние к другим в каждой точки должно дублироватся 2 раза. или например у всех вершинах максимальное растояние к другим точкам одинаковое.
0
69 / 69 / 39
Регистрация: 22.05.2014
Сообщений: 311
27.10.2014, 05:31
Цитата Сообщение от bogdan kliuk Посмотреть сообщение
и читаемость кода
Цитата Сообщение от bogdan kliuk Посмотреть сообщение
вряд ли ваш конек
горбунЁк
0
3 / 3 / 1
Регистрация: 06.07.2014
Сообщений: 145
27.10.2014, 19:27  [ТС]
Готово. Решил проблему с повернутыми квадратами. Теперь алгоритм решает 80% подставленных значений.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import java.util.Scanner;
public class sDecision{
 static Scanner inputer = new Scanner(System.in);
 static long cC[][] = new long[4][2];
 static long sS,tS,sD,tD;
 static int cISA = 0;
 static long cIS[] = new long[3]; 
 static String rA = "YES";
 public static void main(String args[]){
  cC[0][0]=inputer.nextLong(); cC[0][1]=inputer.nextLong();
  cC[1][0]=inputer.nextLong(); cC[1][1]=inputer.nextLong();
  cC[2][0]=inputer.nextLong(); cC[2][1]=inputer.nextLong();
  cC[3][0]=inputer.nextLong(); cC[3][1]=inputer.nextLong();
  
  for(short cI=0;cI<=3;cI++){
   for(short cO=0;cO<=3;cO++){
    if(cI==cO)continue;
    cIS[cISA]=gDistance(cC[cI][0],cC[cI][1],cC[cO][0],cC[cO][1]); cISA++;
   }
   if(cI==0){
    if((cIS[0]>=cIS[1])&&(cIS[0]>=cIS[2]))sD=cIS[0];
     else if((cIS[1]>=cIS[0])&&(cIS[1]>=cIS[2]))sD=cIS[1];
     else sD=cIS[2];
    sS=(cIS[0]+cIS[1]+cIS[2]-sD) / 2;
    if((cIS[0]!=cIS[1])&&(cIS[1]!=cIS[2])&&(cIS[0]!=cIS[2]))rA="NO";
   }
   else{
    if((cIS[0]>=cIS[1])&&(cIS[0]>=cIS[2]))tD=cIS[0];
     else if((cIS[1]>=cIS[0])&&(cIS[1]>=cIS[2]))tD=cIS[1];
     else tD=cIS[2];
    tS=(cIS[0]+cIS[1]+cIS[2]-tD) / 2;
    if((cIS[0]!=cIS[1])&&(cIS[1]!=cIS[2])&&(cIS[0]!=cIS[2]))rA="NO";
    if((tD!=sD)||(tS!=sS))rA="NO";
   }
   cISA=0;
  }
  
  System.out.print(rA);
  
 }
 public static long gDistance(long x1, long y1, long x2, long y2){
  long kx,ky = 0;
  if((y1>=0)&&(y2>=0))ky=Math.abs(y1-y2);
   else if((y1<=0)&&(y2<=0))ky=Math.abs(Math.abs(y1)+y2);
   else ky=Math.abs(y1)+Math.abs(y2);
  if((x1>=0)&&(x2>=0))kx=Math.abs(x1-x2);
   else if((x1<=0)&&(x2<=0))kx=Math.abs(Math.abs(x1)+x2);
   else kx=Math.abs(x1)+Math.abs(x2);
  return(Math.round(Math.sqrt(ky*ky+kx*kx)));
 }
}
Добавлено через 10 минут
Алгоритм работает следующим образом:
Известно что от каждой точки до других точек: 2 расстояния одинаковы(размер одной из сторон квадрата), и только 1 диагональ.
За пример берутся расстояния от первой попавшейся точки до других(размер одной из сторон квадрата и диагональ), которые в последующих итерациях сравниваются с другими значениями размеров сторон квадрата и диагоналей.
0
0 / 0 / 0
Регистрация: 13.12.2012
Сообщений: 15
27.10.2014, 19:54
Цитата Сообщение от marick0073 Посмотреть сообщение
public static long gDistance(long x1, long y1, long x2, long y2){
* long kx,ky = 0;
* if((y1>=0)&&(y2>=0))ky=Math.abs(y1-y2);
* *else if((y1<=0)&&(y2<=0))ky=Math.abs(Math.abs (y1)+y2);
* *else ky=Math.abs(y1)+Math.abs(y2);
* if((x1>=0)&&(x2>=0))kx=Math.abs(x1-x2);
* *else if((x1<=0)&&(x2<=0))kx=Math.abs(Math.abs (x1)+x2);
* *else kx=Math.abs(x1)+Math.abs(x2);
* return(Math.round(Math.sqrt(ky*ky+kx*kx) ));
*}
зачем усложнять себе жизнь и заново выдумывать велосипед да и ешо на квадратных колесах. есть стандартная функция ((х2-х1)^2+(y2-y1)^2)^(1/2). чтоб подвести к вашей логике можна сделать
Java
1
2
3
4
5
6
public static long gDistance(long x1, long y1, long x2, long y2){
  long kx,ky = 0;
 kx=x1-x2;
 ky=y1-y2;
  return(Math.round(Math.sqrt(ky*ky+kx*kx)));
 }
0
3 / 3 / 1
Регистрация: 06.07.2014
Сообщений: 145
27.10.2014, 20:26  [ТС]
Готово. Но это никак не влияет на результат.
0
любитель покушать
 Аватар для Севак
687 / 641 / 248
Регистрация: 25.09.2011
Сообщений: 1,313
27.10.2014, 22:57
marick0073, мб так?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import java.util.Arrays;
 
public class Test {
    public static void main(String[] args) {
        Point[] square = new Point[4];
        square[1] = new Point(0, 0);
        square[0] = new Point(0, 1);
        square[3] = new Point(2, 0);
        square[2] = new Point(2, 1);
 
        System.out.println(isSquare(square));
    }
 
    static boolean isSquare(Point... points) {
        Arrays.sort(points);
        System.out.println(Arrays.toString(points));
        return points[0].x == points[1].x &&
                points[2].x == points[3].x &&
                points[0].y == points[2].y &&
                points[1].y == points[3].y &&
                points[2].x - points[0].x == points[1].y - points[0].y;
    }
 
    static class Point implements Comparable<Point> {
        int x, y;
 
        Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
 
        @Override
        public int compareTo(Point b) {
            if (x != b.x) {
                return Integer.compare(x, b.x);
            }
 
            if (y != b.y) {
                return Integer.compare(y, b.y);
            }
 
            return 0;
        }
 
        @Override
        public String toString() {
            return "(" + x + ", " + y + ")";
        }
    }
}
0
0 / 0 / 0
Регистрация: 13.12.2012
Сообщений: 15
28.10.2014, 00:56
потратил 40 минут на разбирательство вашего кода, алгоритма.
совет-просьба: почитайте побольше статьи о том как правильно писать код. из очень заметных ошибок к коду:
*переменные просто нереально прочитать и найти за что они отвечают. переменные в 1-2 буквы(которые не несут логического названия) годятся только на создание циклов, счетчиков, или как временные.
*не ленитесь ставить { } даже если у вас только одна операция после IFа код тогда намного легче и разбирать и помогает обойти много ошибок изза невнимательности.
* логические цепочки IF ELSE не должны иметь более чем 3 уровневую стуктуру.

теперь к алгоритму. незнаю поможет ли замечание но в вашей логике проскавивают 2 ложных случая:
1) все точки сходятся - 0 0 0 0 0 0 0 0 -YES
2) точки разпределены в 2 секции - 0 0 1 1 0 0 1 1 -yes

возможно ешо функция округления слишком сильно отсекает дробовую часть (в вашем случае округление проходит до целого числа) чтоб например считывалось до 2 знаков после комы можно использовать
new BigDecimal(Math.sqrt(ky * ky + kx * kx)).setScale(2, RoundingMode.UP).doubleValue() или
new BigDecimal(Math.sqrt(ky * ky + kx * kx)).setScale(2,BigDecimal.ROUND_HALF_DO WN).doubleValue()

п.с. не обижайтесь что столько критикую код. писал ответ паралельно разбирая програму поетому можно сказать бил немного в состоянии аффекта
0
3 / 3 / 1
Регистрация: 06.07.2014
Сообщений: 145
28.10.2014, 14:08  [ТС]
Немного сократил алгоритм, исправил ошибки, 100% решаемость.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.util.Scanner;
public class sDecision{
 static Scanner inputer = new Scanner(System.in);
 static double sS,sD;
 static String rA = "YES";
 public static void main(String args[]){
  long cC[][] = new long[4][2];
  int cISA = 0; double cIS[] = new double[3]; 
  for(short cI=0;cI<=3;cI++)for(short cO=0;cO<=1;cO++)cC[cI][cO]=inputer.nextLong();
  for(short cI=0;cI<=3;cI++){
   for(short cO=0;cO<=3;cO++){
    if(cI==cO)continue;
    cIS[cISA]=gDistance(cC[cI][0],cC[cI][1],cC[cO][0],cC[cO][1]); cISA++;
   }
   rChecking(cIS[0],cIS[1],cIS[2]);
   cISA=0;
  }
  System.out.print(rA);
 }
 
 public static double gDistance(long x1, long y1, long x2, long y2){
  long kx=x1-x2; long ky=y1-y2;
  return(Math.sqrt(ky*ky+kx*kx));
 }
 
 public static void rChecking(double d1, double d2, double d3){
  double tS,tD;
  if((cIS[0]>=cIS[1])&&(cIS[0]>=cIS[2]))tD=cIS[0];
   else if((cIS[1]>=cIS[0])&&(cIS[1]>=cIS[2]))tD=cIS[1];
   else tD=cIS[2];
  tS=(cIS[0]+cIS[1]+cIS[2]-tD) / 2;
  if ((sS==0)&&(sD==0)){sS=tS;sD=tD;}
  if((cIS[0]!=cIS[1])&&(cIS[1]!=cIS[2])&&(cIS[0]!=cIS[2])||((tD!=sD)||(tS!=sS))||(tS==tD))rA="NO"; 
 }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.10.2014, 14:08
Помогаю со студенческими работами здесь

Поиск вершин квадрата
Даны координаты двух вершин (x1,y1) и (x2,y2) некоторого квадрата. Необходимо найти возможные координаты других его вершин. a) Ввод из...

Определить координаты вершин квадрата
№3 Дано уравнение одной из сторон квадрата и точки Р пересечения его диагоналей. Определить координаты вершин квадрата. 3х-2у-5=0, ...

Найти координаты вершин квадрата
Дан файл, в который записаны х1 у1 х2 у2, где (х1,у1) и (х2,у2) - координаты двух противоположных вершин квадрата. Необходимо найти...

Определение координат вершин квадрата
подскажите пожайлуста как найти координаты противоположных углов квадрата зная координаты других противоположных углов (система координат...

Определения координах вершин квадрата
подскажите пожайлуста как найти координаты противоположных углов квадрата зная координаты других противоположных углов (система координат...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru