程序员面试题精选(40):一道SPSS笔试题求解

/*================================================================================
题目:输入四个点的坐标,求证四个点是不是一个矩形
关键点:
1.相邻两边斜率之积等于-1,
2.矩形边与坐标系平行的情况下,斜率无穷大不能用积判断。
3.输入四点可能不按顺序,需要对四点排序
作者:sunnyrain
日期:2007.9.2 & 2007.9.3
运行环境:vc++ 6.0
==================================================================================*/
#include<iostream>
#include<limits>
using namespace std;

const double MAX = numeric_limits<double>::max();  //斜率最大值

class Point
{
 float x;
 float y;
public:
 Point(float _x = 0, float _y = 0):x(_x),y(_y){}
 float getX() const
 {
  return x;
 }

 float getY() const
 {
  return y;
 }

 //为点重新设置坐标
 void set(float _x,float _y)
 {
  x = _x;
  y = _y;
 }

 //重载 == 成员操作符
 bool operator == (Point& p)
 {
  return (this->x == p.x && this->y == p.y);
 }

 //重载流插入操作符
 friend istream & operator >> (istream& is, Point & p)
 {
  return is>>p.x>>p.y;
 }
};

class Line  //两点形成一条直线/线段
{
 Point start;
 Point end;
 double k;  //斜率
public:
 Line(){}
 Line(Point s,Point e):start(s),end(e)
 {
  if(start.getX() - end.getX() != 0)
   k = (start.getY() - end.getY())/(start.getX() - end.getX()) ;
  else
   k = MAX;  //两点x坐标相等则斜率无穷大
 }
 double getK()
 {
  return k;
 }
};

//查找数组pp中是否存在点p,是返回数组序号,否返回-1
int findPoint(Point *pp,int size,Point &p)
{
 for(int i=0;i<size;i++)
 {
  if(pp[i] == p)
   return i;
 }
 return -1;
}

//主函数
int main()
{
 Point p[4];
 Point *s[4];
 int i;

 for(i=0; i<4; i++)
 {
  cout<<"Please input the coordinates of the "<<i+1<<" point in format /"x.xx y.yy/""<<endl;
  cin>>p[i];
 }
 
/* p[0].set(0,0);
 p[1].set(1,1);
 p[2].set(2,0);
 p[3].set(1,-1);*/

 float left,up,right,down;


 //获取四点x坐标最大值和最小值
 left = p[0].getX(); //left为四点x坐标最小值
 right = p[0].getX(); //right为四点x坐标最大值
 for(i=1;i<4;i++)
 {
  if(left>p[i].getX())
   left = p[i].getX();
  if(right<p[i].getX())
   right = p[i].getX();
 }

 //获取四点y坐标最大值和最小值
 up = p[0].getY(); //up为四点y坐标最大值
 down = p[0].getY(); //四点y坐标最小值
 for(i=1;i<4;i++)
 {
  if(up<p[i].getY())
   up = p[i].getY();
  if(down > p[i].getY())
   down = p[i].getY();
 }

 //判断矩形与坐标系平行情况
 Point P1(left,up),P2(right,up),P3(right,down),P4(left,down);
 if(findPoint(p,4,P1) != -1 && findPoint(p,4,P2) != -1 && findPoint(p,4,P3) != -1 && findPoint(p,4,P4) != -1)
 {
  cout<<"是矩形"<<endl;
  return 0;
 }

 //按照顺时针方向对四点排序
 for(i=0;i<4;i++)
 {
  if(p[i].getX() == left)
   s[0] = &p[i];
  else if(p[i].getY() == up)
   s[1] = &p[i];
  else if(p[i].getX() == right)
   s[2] = &p[i];
  else if(p[i].getY() == down)
   s[3] = &p[i];
 }

 //排序后的四点顺时针相连组成矩形边
 Line one(*s[0],*s[1]),two(*s[1],*s[2]),three(*s[2],*s[3]),four(*s[3],*s[0]);

 cout<<"k1 = "<<one.getK()<<endl;
 cout<<"k2 = "<<two.getK()<<endl;
 cout<<"k3 = "<<three.getK()<<endl;
 cout<<"k4 = "<<four.getK()<<endl;

 //判断相邻边斜率之积是否都等于0
 if(one.getK()*two.getK() == -1 || (one.getK() == 0 && two.getK() == MAX) || (one.getK() == MAX && two.getK() == 0) )
  if(two.getK()*three.getK() == -1 || (two.getK() == 0 && three.getK() == MAX) || (two.getK() == MAX && three.getK() == 0) )
   if(three.getK()*four.getK() == -1 || (three.getK() == 0 && four.getK() == MAX) || (three.getK() == MAX && four.getK() == 0) )
    if(four.getK()*one.getK() == -1 || (four.getK() == 0 && one.getK() == MAX) || (four.getK() == MAX && one.getK() == 0) )
    {
     cout<<"是矩形!"<<endl;
     return 0;
    }

 cout<<"不是矩形"<<endl;
 return 0;
}

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值