2014-04-15 3 views
-1

모두. 필자는 꽤 많은 시간을 보냈으며, 특정 범위 내의 경계를 가진 모든 직각 삼각형을 철저하게 검색하는 함수를 작성하려고했습니다. 명확히하기 위해, 함수가 같은 삼각형으로 헤더 파일에 정의 된 클래스를 사용합니다 :C++ : 찾기 직각 삼각형 알고리즘이 예상 결과를 얻지 못했습니다.

/* 
* 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 (this is an inline version): 
     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); 

함수 findRightTriangles이 완료 될 필요가 구현 파일의 함수입니다. 지금까지, 나는 이것을 가지고있다 :

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. 
    unsigned long a = 1, b = 1, c = l; 

    for (a = 1; h >= (a+b+c); a++) { //perimeter a+b+c is less than h 

     if (((a*a) + (b*b)) == (c*c)) { //check if a, b, and c are sides of a right triangle, then plug them into retval. 
      triangle t1(a,b,c); 
      retval.push_back(t1); 
    } 

     for (b = 1; h >= (a+b+c); b++) { //go through values of b for right triangles. 

      if (((a*a) + (b*b)) == (c*c)) { 
       triangle t1(a,b,c); 
       retval.push_back(t1); 
      } 

      for (c = l; h >= (a+b+c); c++) { 

       if (((a*a) + (b*b)) == (c*c)) { 
        triangle t1(a,b,c); 
        retval.push_back(t1); 
       } 
      } 
     } 
    } 

    return retval; 
} 

그러나 main.cpp에서 함수를 호출하면 아무것도 반환하지 않는다. 나는 논리를 따라하기 위해 시간과 노력을 다했지만 기능이 실패한 곳을 볼 수 없다. 어떤 도움을 주시면 감사하겠습니다.

+0

디버그를 도와 줄 수 있도록 문제를 보여주는 완전한 (그러나 최소한의) 컴파일 가능한 코드 집합을 제공하십시오. – merlin2011

+0

귀찮은 코드가 너무 많습니다. 게시 한 코드의 양을 줄이고 어떤 값이 예상과 다른지 정확하게 보여줍니다. –

답변

2

for (c... 루프 끝 부분에서 h >= (a+b+c)은 false가됩니다. for (b... 루프에서 h >= (a+b+c)을 테스트하기 위해 루프하면 즉시 실패합니다. 시도 중 루프 (그리고 b에 대해 동일)에 대한 후 1-c을 설정하거나 최대에있을 때 그래서 당신은 b와 c를 테스트하지 않는

for (a = 1; h >= (a+1+1); a++) { //perimeter a+b+c is less than h 

에 루프에 대한 귀하의 변경.

관련 문제