─━ IT ━─

삼각형 판정법

DKel 2021. 8. 16. 00:58
반응형
먼저 삼각형의 형상(정삼각형, 이등변삼각형, 기타삼각형, 비삼각형)을 판정하여 논리적인 사고방식을 해설합니다.대상 독자 C#의 초보자 프로그래머를 가정하고 있습니다.필요한 환경 Visual Studio .NET 2003이 필요합니다.프로젝트 실행 기사 상단 링크에서 다운로드 받은 프로젝트의 템플릿을 적당한 곳에 압축 해제 후 ′Triangle CheckTest.sln′ 을 Visual Studio.NET으로 열어주세요.[디버깅]→[디버깅없이 개시]를 선택해 실행합니다.이하의 출력이 표시됩니다.출력
Check ( - 1 , - 1 , - 1 ) returns 기타 삼각형, but 비삼각형 테스트 케이스 수정 이 프로젝트에는 몇 가지 테스트 케이스가 준비되어 있으며 요건을 충족하지 못하면 에러 메시지가 출력됩니다.위의 예에서는 3변이 ′-1,-1,-1′인 경우에 ′기타 삼각형′으로 판정되었으나, 바르게는 ′비삼각형′임을 나타내고 있습니다.변의 길이가 0이하의 경우에는, 비삼각형이 되도록 고쳐 봅시다.CheckTest 클래스의 Check 메서드의 ′// 여기에 기술해 주십시오!′ 부분에 기술하겠습니다.다음과 같이 고쳐 봅시다.if ( d1 < = 0 || d2 < = 0 || d3 < = 0) return Triangle. 비삼각형; 실행해 보겠습니다.출력
Check ( 4 ... E-324 , 4 ... E-324 , 4 ... E-324 ) returns 기타 삼각형,
but 정삼각형 ′...′은 생략을 나타냅니다. 4E-324는 4 X 10의 -324 제곱을 나타내며 아주 작은 숫자입니다.위에서는 3변이 같은데도 정삼각형을 이루지 못하는 것으로 알려져 있습니다.이제 Check 메서드 처음에 아래 내용을 추가하도록 하겠습니다.if ( d1 == d2 && d2 == d3) return Triangle. 정삼각형; 처음과 같은 에러메세지가 되네요.체크 순서가 잘못되었기 때문입니다.2개의 if문장을 교체하여 수행합니다.출력
Check ( 4 ... E-324 , 4 ... E-324 , 2 ) returns 기타 삼각형, but 비삼각형 1변의 길이가 2변의 합을 넘으면 삼각형이 아닙니다.한 번 체크해 볼까요?3개의 길이가 순서대로 나열되어 있으면 판정을 기술하는 것이 간단해집니다.일단 배열에 넣고 정렬을 해봅시다.아래와 같이 고쳐서 실행해 봅시다.static Triangle Check ( double d1 , double d2 , double d3 )
{
double [ ] dd = { d1 , d2 , d3 } ;
Array . Sort ( dd ) ;
foreach ( double d in dd ) if ( d < = 0) return Triangle. 비삼각형;
if ( dd [ 0 ] == dd [ 2 ] ) return Triangle. 정삼각형;
if ( dd [ 0 ] + dd [ 1 ] < = dd [ 2 ] ) return Triangle. 비삼각형;
return Triangle. 기타 삼각형;
}출력
Check (4... E-324, 4... E-324, NaN (비수치)) returns 기타 삼각형,
but 비삼각형 변의 길이 형은 double입니다.double은 비수치를 나타내는 NaN이라고 할 수 있습니다.3변 안에 NaN이 있으면 비삼각형으로 해보도록 하겠습니다.세 번째 줄을 아래와 같이 수정하여 실행합니다.덧붙여 「d==double.NaN」이라고 하는 판정의 방법은 올바르지 않습니다.′double.Is NaN′을 쓰도록 합시다.foreach ( double d in dd ) if ( d < = 0 || double . IsNaN ( d ))
return Triangle. 비삼각형; 출력
Check ( 4 ... E-324 , 2 , 2 ) returns 기타 삼각형, but 이등변 삼각형 이번에는 2등변 삼각형을 판단해 봅시다.아래의 코드는 어디에 넣어야 할까요?if ( dd [ 0 ] == dd [ 1 ] || dd [ 1 ] == dd [ 2 ] ) return Triangle. 이등변삼각형; 정삼각형 판정 직후에 넣어보면 출력
Check ( 4 ... E-324 , 4 ... E-324 , 2 ) returns 이등변삼각형, but 비삼각형 이렇게 나와버려요이제 return 바로 이전으로 이동을 해보겠습니다.출력
Check ( 4 ... E-324 , 2 , 2 ) returns 비삼각형, but 이등변삼각형 이게 어떻게 된 일일까요?사실 4... E-324 + 2 <= 2>는 true가 됩니다. 4E-324는 아주 작기 때문에 2를 더하면 컴퓨터 상에서는 2 그 자체가 되어버리는 것입니다.어떻게 하면 좋을지 잘 생각해 보세요.double은 무한대를 나타내는 ′+∞′라는 값을 받을 수 있습니다.셋째줄은 다음과 같이 고칩니다.foreach ( double d in dd )
if ( d < = 0 || double . IsNaN ( d ) || double . IsInfinity ( d ))
return Triangle. 비삼각형; 출력
Check (2, 1... E+308, 1... E+308) returns 비삼각형, but 이등변삼각형 1... E+308은 매우 큰 숫자입니다. 하지만 위는 이등변삼각형으로 판정해야 합니다.그런데, 생각은 정리되었습니까? dd[1]와 dd[2]가 동일하다면, dd[0]가 0을 넘고 있는 한, dd[0]+dd[1] >dd[2]입니다.따라서 아래와 같이 판정하면 OK입니다.static Triangle Check ( double d1 , double d2 , double d3 )
{
double [ ] dd = { d1 , d2 , d3 } ;
Array . Sort ( dd ) ;
foreach ( double d in dd )
if ( d < = 0 || double . IsNaN ( d ) || double . IsInfinity ( d ))
return Triangle. 비삼각형;
if ( dd [ 0 ] == dd [ 2 ] ) return Triangle. 정삼각형;
if ( dd [ 1 ] == dd [ 2 ] ) return Triangle. 이등변 삼각형;
if ( dd [ 0 ] + dd [ 1 ] < = dd [ 2 ] ) return Triangle. 비삼각형;
if ( dd [ 0 ] == dd [ 1 ] ) return Triangle. 이등변 삼각형;
return Triangle. 기타 삼각형;
}출력
Check OK 전 테스트 케이스 통과했습니다.어떻습니까?이등변 삼각형의 판정, dd[0] == dd [ 1 ] || dd [ 1 ] == dd[2]를 다른 행으로 나눈다고 하는 발상이 필요했죠. 정리 double이 취할 수 있는 범위를 고려한 판정방법을 해설했습니다.
반응형