2014-06-14 2 views
-1

책 (http://www.stroustrup.com/programming1.html)의 장 (13)의 행사 (8) 만들기 말한다 :는 육각형 클래스

클래스 육각형 (육각형 정규 여섯 양면 다각형) 정의합니다. 중심과 중심점에서 꼭지점까지의 거리를 생성자 인수로 사용합니다.

나는 (코드 아래)이 방법으로 해결했다. 그리고 비록 나는 그 대답에 대해 의구심을 가지지 만, 어쨌든 운동 13-10에 대해서 말했습니다 :

regular_polygon을 정의하십시오. 중심, 측면 수 (> 2) 및 중심에서 구석까지의 거리를 생성자 인수로 사용합니다. 나는이 일에 대한 해결책에 대해 생각

, 나는 루프와 & j는 이전 (13-8)보다 매우 어려운 난 사이의 관계를 찾는 데 활용할 것을 발견했다.

첫 번째 코드는 다음과 같습니다. 운동 13-8에 대한 해결책으로을 사용하십시오.

다음 : 운동 13-8을 해결하는 데 사용할 수있는 운동 13-8 (아래 코드)의 답변과 관련된 방법이 있습니까?

미리 감사드립니다.

#include <Simple_window.h> 

struct Hexagon : Shape { 
     Hexagon(Point p, int d): d(d) 
     { add(Point(p)); } 

    void draw_lines() const 
     { 
     fl_line(point(0).x-d,point(0).y, point(0).x-d/2,point(0).y-(d-d/20*3), 
         point(0).x+d/2,point(0).y-(d-d/20*3));  
     fl_line(point(0).x+d/2,point(0).y-(d-d/20*3), point(0).x+d,point(0).y, 
         point(0).x+d/2,point(0).y+(d-d/20*3));    
     fl_line(point(0).x+d/2,point(0).y+(d-d/20*3), point(0).x-d/2,point(0).y+(d-d/20*3), 
         point(0).x-d, point(0).y); 
     } 
private: 
    int d; 
}; 

int main() { 
    using namespace Graph_lib; 

    Simple_window win(Point(100,100), 600,400, "Hexagon"); 
    Graph_lib::Rectangle r(Point (50,50), 400,200); 
    Point p(100,100); 
     int d = 50; 
     Hexagon h(p,d); 
     win.attach(h); 
    win.wait_for_button(); 
} 

문제는 삼각법을 사용하는 방법입니다. 어쨌든 나는 그것에 대해 생각하고 이것을 썼다. 그것은 정사각형에 대해 제대로 작동하지만 그것에 어떤 마법의 번호를 사용하지 않았지만 다른 정규 다각형에 대해 제대로 작동하지 않습니다. 좀 봐 주시겠습니까? 코드 개선 할 수있는 방법을 잔뜩있다

#include <Simple_window.h> 

struct Regular_Polygon : Shape { 

    Regular_Polygon(Point p, int d, int s): d(d), s(s) 
     { add(Point(p)); } 

    void draw_lines() const 
    { 
     fl_line(point(0).x-d+(360/s-d),point(0).y-d+(360/s-d), point(0).x+d-(360/s-d),point(0).y-d+(360/s-d)); 
     fl_line(point(0).x+d-(360/s-d),point(0).y-d+(360/s-d), point(0).x+d-(360/s-d),point(0).y+d-(360/s-d)); 
      fl_line(point(0).x+d-(360/s-d),point(0).y+d-(360/s-d), point(0).x-d+(360/s-d),point(0).y+d-(360/s-d)); 
     fl_line(point(0).x-d+(360/s-d),point(0).y+d-(360/s-d), point(0).x-d+(360/s-d),point(0).y-d+(360/s-d)); 
    } 

private: 
    int d, s; 
}; 

int main() 
{ 
    using namespace Graph_lib; 

    Simple_window win(Point(100,100), 600,400, "Regular_Polygon"); 
    Point p(200,200); 
    int d = 100; 
    int s = 4; 
    Regular_Polygon r_p(p,d,s); 
    win.attach(r_p); 
    win.wait_for_button(); 
} 

답변

0

: 3/20처럼, 매직 넘버의

  • 사용은 피해야한다.
  • 코드의 형식을 일관되게 지정하십시오.
  • 반경의 특정 값이 좋더라도 육각형 점의 위치가 잘못되었음을 반쯤 확신합니다.
  • 설명서가 없습니다. 뭔가 'd'를 부르는 것은 분명하지 않습니다.
  • using 선언이 main()에 있지만 여기에 사용 된 정규화 된 이름도 있습니다.
  • 삼각법을 사용하여 모서리의 위치를 ​​계산 한 경우 모든 정다각형에 대해이를 수행하는 방법이 분명 해집니다.
  • 동일한 용어를 반복적으로 사용하면 해당 용어를 상수로 분해하고 대신 해당 용어를 참조하는 것이 좋습니다. 또한 예를 들어 Point const c = point(0);draw_lines()에있는 것처럼 코드를 명확하게 만듭니다.
+0

각각. 1 - 그래, 피해야하지만 대체물이 없어. 3 반경 값을 테스트합니다. _d_와 원하는 번호를주고 결과를보십시오. 4- d = 거리. 5 - 나는 그것을 선언 할 필요가 있었다. 6- 삼각법을 사용할 수 있다면 그것은 매우 뛰어날 것이며 아마도 운동 13-10에 대한 문제는 거의 해결 될 것입니다! ex-13-8에 적합하도록 코드를 변경하고 ex 13-10에도 사용할 수 있습니까? – Aria

+0

매직 넘버와 관련하여 대안이 있습니다. "매직 넘버"라는 용어를 검색하면 많은 제안을 찾을 수 있습니다. (d-d/20 * 3)은 d * (17/20)가 0.85 * d이지만 0.87 * d가되어야합니다. 어쨌든, 당신의 후속 질문에 대답하기 위해, 예, 당신은 다른 하나의 일반화이기 때문에 두 연습 모두에 유용한 코드를 작성할 수 있습니다. –

+0

예, 완전히 동의합니다. 하나는 다른 하나의 일반화입니다. 그러나 _0.87 * d_와 같은 것을 사용하는 것은 불가능한 것처럼 보입니다. 삼각법과 관련된 한 가지 대답이 있어야한다고 생각합니다. 해결책은 원주의 점과 관련된 것이어야합니다. – Aria