2014-06-14 23 views
-1

书(http://www.stroustrup.com/programming1.html)的第13章的练习8说:创建一个六边形类

定义一个类六边形(六边形是一个普通的六个多边形)。使用中心和从中心到角点的距离作为构造函数参数。

我这样解决了它(下面的代码)。虽然我对答案有疑问,但无论如何,然后去练习13-10说:

定义一个类regular_polygon。使用中心,边的数量(> 2)以及从中心到角点的距离作为构造函数参数。

当我想到这个问题的解决方案时,我发现利用一个循环找到我之间的关系非常困难,比前一个(13-8)更多。

第一:这是下面的代码你期望作为解决方案的练习13-8请吗?

然后:请问有没有什么办法可以用来解决练习13-10的练习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'并不明显。
  • main()中有using声明,但也有一个完全合格的名称在那里使用。
  • 如果您使用三角函数来计算拐角的位置,那么对任何正多边形进行此操作的方法都会变得很明显。
  • 反复使用相同的术语有时候有优点将该术语分解为一个常数并引用该术语。它也使代码更加清晰,例如draw_lines()中的Point const c = point(0);
+0

分别。 1 - 是的,应该避免,但没有任何替代品。 3-用任何半径值对其进行测试。给你喜欢的_d_和数字,看看结果。 4- d =距离。我需要申报。 6-如果我可以使用三角函数,它将非常优秀,可能13-10问题几乎解决!你可以(比如说)将代码改为第一个,适用于前13-8,然后,可用于前13-10? – Aria

+0

关于魔术数字,还有一个选择,只需搜索术语“魔术数字”,你会发现很多建议。 (d-d/20 * 3)为d *(17/20)为0.85 * d,但应该为0.87 * d。无论如何,要回答你的后续问题,是的,你可以编写可用于这两个练习的代码,因为一个是另一个的泛化。 –

+0

是的,完全同意,一个是另一个的泛化。但是使用_0.87 * d_这样的东西似乎不可能。我认为应该有一个与三角相关的答案。解决方案应该是与圆周上的点有关的东西。 – Aria