同样的程序,同样的输入,为什么输出会不一样?求教

瘸腿蚊 2011-05-14 09:02:09

#include<iostream>
#include<cmath>
using namespace std;
class myPoint {
public:
friend class Triangle;
myPoint(double x0=0.0,double y0=0.0):x(x0),y(y0) {}
myPoint(myPoint &np):x(np.x),y(np.y) {}
double GetX() { return x;}
double GetY() {return y;}
void SetX(double x0) {x=x0;}
void SetY(double y0) {x=y0;}
void SetPoint(double x0,double y0) {x=x0;y=y0;}
void SetPoint(myPoint &np) { x=np.x; y=np.y;}
double GetLength(myPoint p) {
return sqrt((x-p.x)*(x-p.x) +(y-p.y)*(y-p.y));
}
void Printit() { cout<<" ("<<x<<","<<y<<") ";}
private:
double x ,y;
};
class Triangle{
private:
double X,Y,a,b,c;
myPoint p[3];
public:
friend class myPoint;
Triangle(){
for(int i=0;i<3;i++)
{
cout<<"请输入点P("<<i+1<<")的坐标:"<<endl;
cout<<endl;
cout<<"X坐标:";
cin>>X;
cout<<endl;
cout<<"Y坐标:";
cin>>Y;
p[i].SetPoint(X,Y);
cout<<"点P("<<i+1<<")的坐标为:";
p[i].Printit();
cout<<endl;
}
}
double TLength(){
a=p[1].GetLength(p[2]);
b=p[1].GetLength(p[3]);
c=p[2].GetLength(p[3]);
return a+b+c;
}
double Square(){
return sqrt(TLength()/2*(TLength()/2-a)*(TLength()/2-b)*(TLength()/2-c));
}
};
int main()
{
Triangle S;
cout<<"三角形周长:"<<S.TLength()<<endl;;
cout<<"三角形面积:"<<S.Square();
return 0;
}

这个程序用来求三角形的周长面积。在VS2010上调试运行成功。但同样的输入,却得到不一样的输出结果。
三角形各顶点坐标(0,0) (1,0) (1,1,)
第一次
三角形周长:5.9039e+112
三角形面积:0
第二次
三角形周长:1.#INF
三角形面积:-1.#IND
第三次(这次是正确结果)
三角形周长:3.41421
三角形面积:0.5
总会输出错误的结果,但正确的结果也时不时出现。
求高人解答,为什么会有这种现象发生?
是我的机子的问题?
...全文
265 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
就想叫yoko 2011-05-14
  • 打赏
  • 举报
回复
+1[Quote=引用 2 楼 bdmh 的回复:]

看看这里
b=p[1].GetLength(p[3]);
c=p[2].GetLength(p[3]);
你的数组总共3个元素,你访问p[3]越界了,读出了垃圾数据
[/Quote]
newfarmerchi 2011-05-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pp281797345 的回复:]
我用Microsoft Visual C++ 6.0调试了10次,很遗憾啊。每次得到的结果都是
三角形周长:3.41421
三角形面积:0.5
所以啊,这个问题还真...
[/Quote]
的确,用vc可能结果还蒙对了,可当输出p[3].x和p[3].y的值也就明白了
一个为2.04935e-307另一个为1.28257e-307(当然,机器不同值也会不同)
这相当于p[0]的值了。
所以,还是越界了,应该是
a=p[0].GetLength(p[1]);
b=p[0].GetLength(p[2]);
c=p[1].GetLength(p[2]);
yfk 2011-05-14
  • 打赏
  • 举报
回复

myPoint p[3];

a=p[1].GetLength(p[2]);
b=p[1].GetLength(p[3]);
c=p[2].GetLength(p[3]);


数组是从[0]开始的,所以数组越界

简单聊下
一个程序,输入一样,输出也一样
有的人说,为什么随机数程序输出不一致,这是因为srand引入当前系统时间。
此外,就是引入未知内存作为输入,LZ使用p[3],而这块内存LZ未初始化,值不定,所以输入不一致,输出不一致
pp281797345 2011-05-14
  • 打赏
  • 举报
回复
建议你安装一个Microsoft Visual C++ 6.0试下。我觉得这个软件好用点...
pp281797345 2011-05-14
  • 打赏
  • 举报
回复
我用Microsoft Visual C++ 6.0调试了10次,很遗憾啊。每次得到的结果都是
三角形周长:3.41421
三角形面积:0.5
所以啊,这个问题还真...
xiaolomg 2011-05-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lirg8405 的回复:]

myPoint p[3];
数组下标是从0开始的。。。。。。。。。。
TLength()这个函数你自己修改
[/Quote]
对,是这个问题,数组越界了,还真不好发现
xspace_time 2011-05-14
  • 打赏
  • 举报
回复
可能是你输入有问题,有用VC2008没问题
lirg8405 2011-05-14
  • 打赏
  • 举报
回复
myPoint p[3];
数组下标是从0开始的。。。。。。。。。。
TLength()这个函数你自己修改
bdmh 2011-05-14
  • 打赏
  • 举报
回复
看看这里
b=p[1].GetLength(p[3]);
c=p[2].GetLength(p[3]);
你的数组总共3个元素,你访问p[3]越界了,读出了垃圾数据
xiaolomg 2011-05-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 zfl541091999 的回复:]
C/C++ code

#include<iostream>
#include<cmath>
using namespace std;
class myPoint {
public:
friend class Triangle;
myPoint(double x0=0.0,double y0=0.0):x(x0),y(y0) {}
myPoint(myPoint &……
[/Quote]我试了一下,第一次就计算正确,你的错误不知道是神马怨言
瘸腿蚊 2011-05-14
  • 打赏
  • 举报
回复
谢谢总结,我也发现了这个问题。现在程序没有错误了。

65,180

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧