2013-10-13 3 views
1

두 삼각형이 유사하고 일치하며 주어진면이 직각 삼각형인지 테스트해야합니다. 나는 헤더 파일을 포함시켰다. 이 프로그램을 실행하려했지만 잘못된 대답을 계속합니다.합동, 유사성 및 직각 삼각형

헤더 :

/* 
* triangles.h 
* Header file for triangle class. 
*/ 
// make sure this file is not included multiple times: 
#pragma once 

#include <vector> 
using std::vector; 

class triangle { 
    public: 
     // member functions: 
     // constructor: 
     triangle(unsigned long a=3, unsigned long b=4, unsigned long c=5): 
      s1(a),s2(b),s3(c) {} 
     unsigned long perimeter(); 
     unsigned long area(); 
     void print(); // prints to standard output 
     // member variables: 
     // integers for the 3 sides: 
     unsigned long s1; 
     unsigned long s2; 
     unsigned long s3; 
}; 

vector<triangle> findRightTriangles(unsigned long l, unsigned long h); 
bool congruent(triangle t1, triangle t2); 
bool similar(triangle t1, triangle t2); 

기능

#include <vector> 
using std::vector; 
#include <algorithm> 
using std::sort; 

// note the "triangle::" part. We need to specify the function's 
// FULL name to avoid confusion. Else, the compiler will think we 
// are just defining a new function called "perimeter" 
unsigned long triangle::perimeter() { 
    return s1+s2+s3; 
} 

unsigned long triangle::area() { 
    // TODO: write this function. 
    // Note: why is it okay to return an integer here? Recall that 
    // all of our triangles have integer sides, and are right triangles... 
    // put the sides in an array: 
    unsigned long sides[3] = {s1,s2,s3}; 
    // sort the array: 
    sort(sides,sides+3); 
    // at this point, sides[0] <= sides[1] <= sides[2] 

    unsigned long b = sides[0]; 
    unsigned long h = sides[1]; 
    return (b*h)/2; 
} 

void triangle::print() { 
    cout << "[" << s1 << "," << s2 << "," << s3 << "]"; 
} 

bool congruent(triangle t1, triangle t2) { 
     // TODO: write this function. 
    int a, b, c; 
    a = t1.s1; 
    b = t1.s2; 
    c = t1.s3; 
    unsigned long tr1[3] = {a,b,c}; 
    // sort the array: 
    sort(tr1,tr1+3); 
    // at this point, tr1[0]<= tr1[1] <= tr1[2] 
    int d,e,f; 
    d = t2.s1; 
    e = t2.s2; 
    f = t2.s3; 
    unsigned long tr2[3] = {d,e,f}; 
    // sort the array: 
    sort(tr2,tr2+3); 
    // at this point, tr2[0] <= tr2[1] <= tr2[2] 

    if(tr1[0] == tr2[0] && tr1[1] == tr2[1] && tr1[2] == tr2[2]){ 
    true; 
    } 

    else false; 
} 

bool similar(triangle t1, triangle t2) { 
    // TODO: write this function. 
    int a, b, c; 
    a = t1.s1; 
    b = t1.s2; 
    c = t1.s3; 
    unsigned long tr1[3] = {a,b,c}; 
    // sort the array: 
    sort(tr1,tr1+3); 
    // at this point, tr1[0]<= tr1[1] <= tr1[2] 
    int d,e,f; 
    d = t2.s1; 
    e = t2.s2; 
    f = t2.s3; 
    unsigned long tr2[3] = {d,e,f}; 
    // sort the array: 
    sort(tr2,tr2+3); 
    // at this point, tr2[0] <= tr2[1] <= tr2[2 

    if(tr1[0]%tr2[0] == 0 && tr1[1]%tr2[1] == 0 && tr1[2]%tr2[2] == 0){ 
    true; 
    } 

    else false; 
} 

vector<triangle> findRightTriangles(unsigned long l, unsigned long h) { 
    // TODO: find all the right triangles with integer sides, 
    // subject to the perimeter bigger than l and less than h 
    vector<triangle> retval; // storage for return value. 
    triangle t1; 
    t1.s1=l; 
    t1.s3=h; 

    for (unsigned long p = 0; p < t1.s3; p++) { 
     t1.s2=p; 
     if (p >= t1.s1 && p <= t1.s3 && (((t1.s1*t1.s1)+(p*p)) == (t1.s3*t1.s3))){ 
      retval.push_back(t1); 

      break; 
     } 
    } 

    return retval; 
} 
+2

삼각형에는 3 개의 고도가 있습니다. * 직각 삼각형 *의 경우, 기저부가 한쪽 다리 인 경우 그 다리의 고도는 다른 다리이지만 일반적인 삼각형은 아닙니다. 그러나 면적 공식은 * bh *가 아닌 * A = 1/2 bh *입니다. –

+2

나는 당신을 위해 디버깅을하지 않을 것입니다. 종이 한 장을 들고 앉아서 알고리즘이 작동하는지 확인해야합니다. 그런 다음 코드를 작성하십시오. 이 방법을 사용하면 예상되는 답변을 알 수 있습니다. 그런 다음 작동하지 않으면 여기로 돌아와서 "나는 그걸 기대하고있다.하지만 이런 일이 일어나고 있는데, 어떻게 고칠 수 있니?"라고 말할 수 있습니다. – Adam

+0

지역의 경우 헤론의 공식을 사용할 수 있습니다. http://en.wikipedia.org/wiki/Heron's_formula – ithenoob

답변

1

주요 문제는 return를 작성하지 않는 것입니다. 예를 들어, 기능 congruent 및 기능 similar는 다음과 같이 끝나야 : 그에서 제외

return true; 

} 

else return false; 

를, 당신의 similar 기능에 문제가있는 것입니다. 삼각형은 측면의 비율이 같으면 유사합니다. 하나가 다른 것의 배수인지 확인하고 있지만 사실 일 필요는 없습니다. 예를 들어 측면이있는 삼각형 (6,8,10)과 (9,12,15)는 비슷하지만 하나는 다른 하나의 배수가 아닙니다. tr1[i]/tr2[i]이 3면 모두 동일한 지 확인해야합니다. 당신이 정수 분열을 사용하는 경우 그것은 당신에게 문제를 줄 것이다, 그래서 당신은 분열을 방지 다음과 같은 조건을 사용할 수 있습니다 tr1[0]/tr2[0]tr1[1]/tr2[1] 같은 경우 확인하고 tr1[2]/tr2[2]tr1[1]/tr2[1] 같은 경우 다음을 확인

if(tr1[0]*tr2[1] == tr2[0]*tr1[1] && tr1[2]*tr2[1] == tr2[2]*tr1[1]) 

다른 기능을 확인하지 않았습니다.