C语言第四章课后习题10,求建筑物高度

0

10.有4个圆塔,圆心分别为(2,2)、(-2,2)、(-2,-2)、(2,-2),圆半径为1。这4个塔的高度为10m,塔以外无建筑物。今输入任意点的坐标,求该点的建筑高度(塔外的高度为零)。

题图


我的代码:

1
2
3
4
5
6
7
8
9
float x,y;
printf("请输入坐标\n");
scanf("%f %f", &x, &y);
if (x<0)
x=x*(-1); //把坐标转换为正数
if (y<0) y=y*(-1); if ((x>=1 && x<=3) && (y>=1 && y<=3))
printf("该建筑物的高度是10cm\n");
else
printf("该建筑物的高度是0cm\n");

 

高高兴兴写完,测试后发现,这根本就不是个圆……而是一个正方形。苦恼的时候搜索了一下,发现在坐标系中表示圆需要一个方程,百度百科里的解释为:

圆的标准方程:在平面直角坐标系中,以点O(a,b)为圆心,以r为半径的圆的标准方程是(x-a)^2+(y-b)^2=r^2。

上次接触这类方程是十年以前么-_-,对于文科的我来说记忆基本是个零。另外,判断园内阴影的条件是以上方程要<=半径(也就是1)有了这两个知识,在改写一下之前的代码为:

1
2
3
4
5
6
7
float x,y;
printf("请输入坐标\n");
scanf("%f %f", &amp;x, &amp;y);
if (x&lt;0)
x=x*(-1);
if (y&lt;0)
y=y*(-1);

x-=2;
y-=2;
if (x*x+y*y<=1)
printf(“该建筑物的高度是10cm\n”);
else
printf(“该建筑物的高度是0cm\n”);

问题就可以解决了。当然我看到还有高手写出了更精简的代码:

1
2
3
4
5
6
int getHight2(double x, double y) {
if( x &lt; 0 ) x = -x;
if( y &lt; 0 ) y = -y;
x -= 2;
y -= 2;
return (x*x+y*y&lt;=1)?(10):(0);

我也能稍稍理解,但是应该写不成这样,还没有到那种程度吧,感谢现在的网络,很多问题都可以搜索得到答案。好了,下一章,循环结构!

— cloudxiao 2009,9,19

No Comments

Leave A Reply