注册 登录
编程论坛 C++教室

一道笔试题

jiaju111 发布于 2007-10-26 13:29, 1486 次点击

在直角坐标系中,直线 a 通过原点(0,0)及非原点(x0,y0),给定另一点P(x,y),各坐标均为整数

补充下面的函数

要求:若点P 在直线 a 上方,返回一正数,若P在下方则返回一负数,若P在直线上则返回 0,

如果直线 a 与 x 轴垂直,则视左边为下方,右边为上方。

int up_down(int x0, int y0, int x, int y)
{
return __________;
}





[此贴子已经被作者于2007-10-26 16:40:16编辑过]

22 回复
#2
eagleboycn2007-10-26 17:35

这样写怎么样?
1.直线a不在y轴:
则直线方程:y=x*(x0/y0)
那么只要比较该点的y值和x*(x0/y0)的值

2.直线在y轴
那么只要判断x的正负

#3
jiaju1112007-10-26 22:52
能不能用一个语句写出来?

return __________;
#4
csmenglei9512007-10-26 23:19
int up_down(int x0, int y0, int x, int y)
{
int z;
{
if(x0!=0)
z = y/x-y0/x0;
else
z = x-x0;
return z;
}
}
#5
succubus2007-10-26 23:51
写出直线方程不就成了
#6
yaiby2007-10-27 00:01
线性规划问题啊~
#7
yaiby2007-10-27 00:03
return y - (y0/x0)*x;
#8
rediums2007-10-27 01:08
return x0 ? y-(y0/x0)*x :x;
#9
eagleboycn2007-10-27 04:27
以下是引用rediums在2007-10-27 1:08:43的发言:
return x0 ? y-(y0/x0)*x :x;

强!


当时没看清楚题目

[此贴子已经被作者于2007-10-27 4:28:02编辑过]

#10
jiaju1112007-10-27 10:28

出现除法的似乎都不对吧?

这都是整数,不整除的话会取整,结果肯定就不对了

#11
lishuqiao2007-10-27 15:24
不知道,但坐标????
#12
ki11er2007-10-27 16:08

8楼正解,不过好像数据类型至少得是float吧,楼主是不是抄错题了?

#13
永夜的极光2007-10-27 16:12
以下是引用jiaju111在2007-10-27 10:28:30的发言:

出现除法的似乎都不对吧?

这都是整数,不整除的话会取整,结果肯定就不对了

可以加个强制转换

return x0 ? y-((float)y0/x0)*x :x;

或者

return x0 ? y-(y0*1.0/x0)*x :x;

#14
rediums2007-10-27 17:39
return x0 ? y-(y0/x0)*x :x;可以在这个的基础上乘以x0的平方,这样就可以避免小数了

return x0 ? x0*x0*y-x0*y0*x :x;
#15
lw20072007-10-27 19:03
那return x0 ? y-float(y0/x0)*x :x;
怎么样?
#16
jiaju1112007-10-27 22:21
强制转换不行吧?

返回类型是int,最后结果还是会有BUG,如果结果是0.5,会返回0而出错吧?

我觉得14楼的方法不错,呵呵

[此贴子已经被作者于2007-10-27 22:31:18编辑过]

#17
travelling2007-10-27 23:16
  楼上说的对,举个例子: 假设非原点(X0,Y0)=(5,4),P=(5,3),按数学方法,P应在直线下方,而按 return x0 ? y-(y0/x0)*x :x;则返回一个正数,所以return x0 ? y-(y0/x0)*x :x 不太完美。
#18
wfpb2007-10-28 09:48
return x0 ? (y*abs(x0)-(y0*abs(x0)/x0)*x) :x
不会出现不整除得情况了
#19
jiaju1112007-10-28 17:02
这个和14楼一个道理

14楼是乘以x0的平方,楼上是乘以绝对值x0
#20
q3637425332007-10-29 13:32
return y-(y0/x0)*x;
#21
wfx_best2007-10-29 14:36
以下是引用yaiby在2007-10-27 0:03:39的发言:
return y - (y0/x0)*x;

是正确的,不过不要把x0 定义为常量,否则编译不通过,就用输入值

#22
jiaju1112007-10-29 16:53

就考题而言,楼上的答案是不对的

#23
雨中飞燕2007-10-29 17:04
return x0*y-y0*x;



by 雨中飞燕 C/C++学习讨论群:46520219
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge)论坛:[/url] http://yzfy.programfan.com

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url] [url=http://blog.programfan.com/article.asp?id=24801]请不要写出非int声明的main函数[/url]
[url=http://bbs.bc-cn.net/viewthread.php?tid=162918" target="_blank">https://yzfy.org/
Blog: http://yzfy.programfan.com

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url] [url=http://blog.programfan.com/article.asp?id=24801]请不要写出非int声明的main函数[/url]
[url=http://bbs.bc-cn.net/viewthread.php?tid=162918
]C++编写的Windows界面游戏[/url]
1