问题及代码:
#include <iostream>
#include <cmath>
using namespace std;
class CPoint
{
private:
double x; // 横坐标
double y; // 纵坐标
public:
CPoint(double xx=0,double yy=0):x(xx),y(yy){};
double Distance1(CPoint p) const; //两点之间的距离(一点是当前点——想到this了吗?,另一点为p)
double Distance0() const; // 到原点(0,0)的距离
CPoint SymmetricAxis(char style) const;//style取'x','y'和'o'分别表示按x轴, y轴, 原点对称
void input(); //以x,y 形式输入坐标点
void output(); //以(x,y) 形式输出坐标点
};
double CPoint::Distance1(CPoint p) const
{
return sqrt((this->x-p.x)*(this->x-p.x)+(this->y-p.y)*(this->y-p.y));
}
double CPoint::Distance0() const
{
return sqrt(this->x*this->x+this->y*this->y);
}
CPoint CPoint::SymmetricAxis(char style) const
{
CPoint n=*this;
switch(style)
{
case 'x':
{
n.x=-n.x;
break;
}
case 'y':
{
n.y=-n.y;
break;
}
case 'o':
{
n.x=-n.x;
n.y=-n.y;
break;
}
}
return n;
}
void CPoint::input()
{
int a,b;
char c;
while(1)
{
cin>>a>>c>>b;
if(c!=',')
{
cout<<"error cin,retry."<<endl;
continue;
}
else
break;
}
x=a;
y=b;
}
void CPoint::output()
{
cout<<'('<<x<<','<<y<<')'<<endl;
}
int main()
{
CPoint a(1,2),a1(1,0);
char x,y,o;
cout<<a.Distance1(a1);
cout<<endl;
cout<<a1.Distance0();
cout<<endl;
a.input();
a.output();
a1=a1.SymmetricAxis('o');
a1.output();
return 0;
}
运行结果:
学习小结:
有好多要说。
首先是学到了好多东西的感觉。
因为在之前的一个阅读程序和这个项目刚好有一个问题类似,就是我已开始不明白类成员之间可以直接赋值的,看到class A=*p的困惑可想而知。
在这个项目中在上机之前困扰我的第一个问题就是distance1(cpoint p)函数中的形式参数要怎么赋值,一开始我想到了实参写成(2,1)这样,error!
接着(cpoint a1(2,1))还是错了,最后终于联想到了阅读程序直接赋值的办法,尝试了一下,对了。
另外一个问题就是,在CPoint SymmetricAxis(char style) const函数中,我原本没有定义新的对象去操作的,而是直接用this指针和*this这些去操作,因为我感觉都一样,但是程序一直出错,实在想不到要怎么办,想问老师来着,但是老师刚好在指点别的同学,我就想自己去找找看,单步调试。结果意外的发现了this指针后面有一个让我惊喜的const,原来this指针是不能改变值的,难怪我把this->X=-(this->X)换成了n.X=-n.X后就正确了。
还有个小错误就是style 实参要加单引号。
主要这些都是自己主动去发现问题并解决的,我觉得比较难能可贵。相对于之前来说
最后的运行结果有点瑕疵,0显示成了-0,既然无伤大雅,我也就不改了