2016-10-09 2 views
0
import java.util.*; 
public class quadrado { 
    public static void main (String args[]) { 
     int xp1,xp2,xp3,xp4,yp1,yp2,yp3,yp4; 
     double c1,c2,c3; 
     Scanner aa = new Scanner (System.in); 
      System.out.print("Insira a abcissa do P1\n"); 
      xp1 = aa.nextInt(); 
      System.out.print("Insira a ordenada do P1\n"); 
      yp1 = aa.nextInt(); 

      System.out.print("Insira a abcissa do P2\n"); 
      xp2 = aa.nextInt(); 
      System.out.print("Insira a ordenada do P2\n"); 
      yp2 = aa.nextInt(); 

      System.out.print("Insira a abcissa do P3\n"); 
      xp3 = aa.nextInt(); 
      System.out.print("Insira a ordenada do P3\n"); 
      yp3 = aa.nextInt(); 

      System.out.print("Insira a abcissa do P4\n"); 
      xp4 = aa.nextInt(); 
      System.out.print("Insira a ordenada do P4\n"); 
      yp4 = aa.nextInt(); 

      c1= Math.sqrt((xp2-xp1)^2 + (yp2-yp1)^2); 
      c2= Math.sqrt((xp3-xp2)^2 + (yp3-yp2)^2); 
      c3= Math.sqrt((xp4-xp3)^2 + (yp4-yp3)^2); 

      System.out.print("A figura é um quadrado: "+c1); 

      if (c1==c2==c3) {           // sendo os lados consecutivos 
       System.out.print("A figura é um quadrado"); } 
      else { 
       System.out.print("A figura não é um quadrado"); } 


     } 
    } 

4 점의 좌표가 정사각형인지 여부를 결정하는 내용을 작성하려고합니다. 나는 3 개의 벡터의 길이를 얻기로 결정했다. 그리고 만일 그들이 모두 같은 크기라면, 그것이 정사각형이라고 말한다./비교할 수없는 유형 : 부울 및 이중

답변

4
if (c1==c2==c3) 

이를 분해 수 있습니다 :

c1==c2 

이 어느 true 또는 false는이 b1를 호출 할 수 있습니다 난 정말 도움이 필요합니다 그래서 초보자입니다.

b1 == c3 

b1c3은 여전히 ​​double이다하는 boolean입니다 - 오류

또한

, == can cause problems with double. 여기서 사용하는 것이 좋을지라도 대다수의 장소에서 염두에 두어야 할 사항입니다.

+0

더블 '가 잘 될 경우 =='과 같은 경우를 제외하고, 문제가 될 수 있습니다. –

+0

@PeterLawrey 좋은 습관을 일찍 번식시키는 것이 가장 좋습니다. 나는 조금 reworded했다. –

+0

나는 당신이 항상 그것을 고려해야한다는 것에 동의하며 그것이 필요 없다고 확신 할 때만 그것을하지 않는다. –

2

이 경우 (c1==c2)==c3을 쓸 수 없으므로 c1 == c2이면 true == c3은 의미가 없습니다. 대부분의 경우

당신은

if (c1 == c2 && c2 == c3) 

을위한 참고 : double는 표현 오류가 발생했을 수 있지만,이 경우 해당 오류가 일관 될 것이다 당신이 작은 계산 오류가 있는지 점검 할 필요가 없습니다.

다른 수단을 통해 계산 된 비 정수가 역으로, 당신은 또한 ^이 비트 XOR을 의미 있음을 유의

double a = input(); 
double b = input(); 
double c = input(); 

if (a == b && b == c) // ok 
if (a + b == c) // not ok, needs rounding or tolerance. 

, 전원을 켜지 약간의 오차를 허용해야합니다 (또는 라운딩 용) 의. 대신 복식을 비교할 때 당신은 일반적으로 반올림 오류를 얻을 수 있기 때문에

double c1 = Math.sqrt(Math.pow(xp2-xp1, 2) + Math.pow(yp2-yp1, 2)); 
+0

이 경우 오류의 일관성을 설명 할 수 있습니까? –

+0

'Math.sqrt (N)'을 쓰면'N'은 정수입니다. 항상 같은 값을 얻습니다. –

+0

@FrankPuffer 비슷하게,'Math.pow (N, 2)'는 항상'N'에 대해 같은 결과를줍니다. 표현 에러는 임의의 에러가 아닙니다 (최소한 자바에서는 아님). –

0

, 당신은 항상 작은 허용 오차를 허용해야 할 수 있습니다 : 그런데

static final double TOL = 1.0e-8; 
if (Math.abs(c1-c2) < TOL && Math.abs(c1-c3) < TOL) ... 

을, 모든 측면이 있는지 확인하기 위해 충분하지 않습니다 이것은 다이아몬드 모양의 경우이기도하므로 길이가 동일해야합니다. 직각을 검사해야합니다.

+0

이 경우에도 오류는 항상 동일합니다. –

0

대신 c1 == c2 & & c2 == c3으로 작성해야합니다.

c1 == c2 == c3은 (c1 == c2) == c3으로 평가되므로 c1 == c2가 부울 유형이므로 java에서는 허용되지 않습니다.

부동 소수점의 부정확성으로 인해 제곱근을 취하기 전에 평등을 비교하면 정수형이므로 더 좋을 것입니다. 즉, 계산 된 길이가 어떤 식 으로든 결합되지 않았기 때문에 실제로는 중요하지 않습니다.

0

두 가지 이상의 것을 비교할 수 없습니다. Java가 c1 & c2를 비교하는 경우 c1 & c2의 결과를 c3과 비교합니다. 여러 변수를 비교하려면 더 많은 if 문으로 수행해야합니다.

if (c1 == c2 && c1 == c3 && c2 == c3) {...} 

당신은 그런 방법으로 그것을 할도 수 :

public boolean allSame(Object... os) { 
    Object first = os[0]; 

    for (Object o : os) 
     if (!first.equals(os)) return false; 

    return true; 
} 
+0

'c2 == c3'을 비교하는 것은 항상 중복되어야합니다. 예를 들어 이것을하지 않는 두 번째 방법을 봅니다 (첫 번째 요소를 자체 요소와 비교 함) –

+0

저는 여기서 여러분이 말하는 것에 관심이 있습니다. 시간이 있다면이 문제를 확장 할 수 있을까요? 나의 본능은 불필요한 제곱근을 계산하는 것이 아니다. – Bathsheba

+0

@PeterLawrey : 두 번째 방법에서'c2'와'c3'을 비교하는 것이 실제로 필요합니다. 왜냐하면'=='은 이행 적이기 때문에 '.Equals'는 그렇지 않기 때문입니다. – Eric