为什么这个C++程序编译没错,但运行结果不对呢

要求输入一个三维数组计算和并输出最大和最小
#include<iostream.h>void main()
{
int ***p;
int i,j,z,m,n,l,k,y,g,sum;
p=new int**[5];
for(i=0;i<5;i++)
{
p[i]=new int*[6];
for(j=0;j<6;j++)
p[i][j]=new int[7];

} for(i=0;i<3;i++)
for(j=0;i<3;j++)
for(z=0;z<3;z++)
{
cin>>p[i][j][z];
sum=sum+p[i][j][z];
}
for(i=0;i<3;i++)
for(j=0;i<3;j++)
for(z=0;z<3;z++)
{
if(p[i][j][z]>p[i+1][j+1][z+1])
{
m=i;
n=j;
l=z;
}
if(p[i][j][z]<p[i+1][j+1][z+1])
{
k=i;
y=j;
g=z;
}
}
cout<<"sum="<<sum<<endl;
cout<<"max="<<p[m][n][l]<<"min="<<p[k][y][g];
delete p;
}

你要学会自己测试,这么多行的程序,别人看起来也很费劲。
自己测试的思路基本是由少到多,步步为营:你把后面的程序注释起来,先运行前面的,没有问题了再增加一行或者几行,这样一般可以确定在哪一条语句执行的时候出现了问题。
另外,你可以将输入数据缩小,比如数组的元素刚开始设置成一个或者两个,执行以下看看。
当你确定哪里出了问题之后,你可以使用debug模式,先设置断点,然后调试执行,这样基本可以解决绝大多数的问题。关于如何调试,是一个重要的必备技术。基本的调试方法也比较好操作,大多数编程语言书上都有,你自己去模仿着走一遍,以后就知道了。很容易的,希望对你有帮助
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-03
做任务,刷分,我实在受不了你们直接贴代码让别人找错误了,没有格式,没有错误原因,还得打开编译器复制过去,而且程序目的不知道,看到头一头雾水。
我没有编译器尝试就看了一下。你这是求最大最小值?
首先你三围数组生成的维数是3 4 5 复制的却都是 3 3 3 编程风格不好。
第二你for循环的时候不加大括号只有最后一个for有(不知道对不对)看起来很混乱
第三注意最后一组循环里面的比较,如果i=2了,这时候就是if(p[2][j][z]>p[3][j][z])很明显数组越界了逻辑混乱
最后看最后一句delete,如果我没有记错你这种情况应该是三层four循环挨个delete吧,并且声明的时候用了 new[] 那么delete的时候也应该 delete[] 如果你这种写法不仅不能真正的释放内存(当然程序一眨眼就结束了,内存也就释放了)而且会有运行错误。追问

虽然很感谢你指出错误但是看我的很恼火、我是C++新手怎么了、昨天才开始看书,能提出这种弱智问题的不用想都知道在这方面没有经验好不好。我就爱直接贴代码让人找错误怎么了。你爱答不答管我什么事。看着不爽不答不就行了何必说这样的话。一大早上心情被你破坏完了!

追答

木有怎么 ,有句话叫忠言逆耳,这都让你生气了,你还是别学了,如果你只是简单地为了应付考试,当我没说,确实应该以这种方法学习,谁都有新手时期,我新手的时候问题从来不会整个体味,我会直接把编译器检测到的错误原因复制下来粘贴到百度,然后去看,你会发现这种错误不是你一个人很多人已经把这种错误归纳总结好了,你不仅能改正这个错误还能接触到更广的只是,说这话没有盛气凌人的意思,只是希望你不要再在这条路上跑了,只能越跑越黑。就算别人告诉你错误了你改正了能怎么样?你印象绝对不会深。既然知道自己是C++新手就应该找到更有效的方法学习。

追问

每个人的学习方法不一样,你如何能断定我这样会印象不深!忠言逆耳,那也要看是谁的忠言、你觉得我这种方法不好,你完全可以直接告诉我这样不好,再告诉我其他更好的学习方法。我是第一次问这方面的问题,你一上来就说你受不了我们这种。我就是我,我不是我们!别人喜欢这样贴又不是我要他们这么贴的,何必把你对他们的脾气撒在我身上。我不感觉你盛气凌人,只感觉你不可理喻。

相似回答