程序员面试题精选(40):一道SPSS笔试题求解
来源:互联网 发布:淘宝李宁官方折扣店 编辑:程序博客网 时间:2024/05/22 04:37
/*================================================================================
题目:输入四个点的坐标,求证四个点是不是一个矩形
关键点:
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;
}
- 程序员面试题精选(40):一道SPSS笔试题求解
- 程序员面试题精选(39):一道autodesk笔试题求解
- 程序员面试题精选(38):2008百度校园招聘的一道笔试题
- 程序员面试题精选(32):金币概率问题(威盛笔试题)
- 笔试面试题精选
- 程序员面试题精选(47):两个或N个数的最大公约数和最小公倍数的求解
- 程序员面试题精选
- 求解一道Java面试题。
- 精选C++笔试面试题
- 一道笔试题,求解
- 程序员面试题精选100题(40)-扑克牌的顺子
- 程序员面试题精选100题(40)-扑克牌的顺子
- 程序员面试题精选100题(40)-扑克牌的顺子
- 程序员面试题精选100题:11-40解题报告
- 程序员面试题精选100题(完整版)博客地址
- 程序员面试题精选题-C++
- 程序员面试题精选100题
- 程序员面试题精选100题 详解
- Windows API一日一练(73)GetVersionEx函数
- 根据登陆显示相应状态 --自定义控件
- 也做技术
- 程序员面试题精选(39):一道autodesk笔试题求解
- java继承中的初始化循序
- 程序员面试题精选(40):一道SPSS笔试题求解
- 使用VMware将Linux装在物理硬盘上,开机即可进入Linux
- Introduction to COM Part II - Behind the Scenes of a COM Server
- 程序员面试题精选(41):编译器对内存填充长度之误解
- java容器框架图
- DirectX SDK所有版本微软官方的下载页面
- [转]JDOM操作XML文件
- Ajax无刷新实现图片切换特效(AjaxPro)
- 2007-10-14 我的数据库出现了问题,使我头大.