给出10后没输出,如何解决?

目前2020/10/24已解决


学编程遇到不懂的问题上乎贴代码,也要按照基本法来提问;您再这么提问题迟早被吊起来打。

首先,学会自行debug,不要破事上乎。你应该先做以下事情:

  1. 学习使用命令行编译和运行程序,以便掌握常见debug技巧并看懂下列内容
  2. 注意编译器警告。为了看到所有警告,你最好在编译时添加-Wall命令行选项。本例中很遗憾,gcc并不会给出编译警告;然而,clang则会给出下列警告(节选):

1.cpp:10:30: warning: array index 2 is past the end of the array (which contains 2 elements) [-Warray-bounds]
for (; b[0]+b[1]&>b[2] b[0]+b[2]&>b[1] b[1]+b[2]&>b[0]; b[2]++) {
^ ~
1.cpp:4:5: note: array b declared here
int c, b[2];
^

clang发现你的b数组只定义了两个元素,而你却在程序中使用b[2],这是公然的数组越界行为。当你把它改掉后再编译,clang会继续给你一个警告,使你发现你在第24行把b[2]打成了b[3]。

这告诉我们,在新手期,最好使用一个优秀的编译器(而不是gcc),它会帮你解决很多问题。

3. 当编译器不再给出警告时,你已经改掉这些无比低级的错误了。但是,这时程序还是不对。这时候,你应该在上乎之前践行小黄鸭debug法。该法需要一只小黄鸭玩偶,或者你的宠物,或者你的室友、女朋友甚至二次元老婆,总之你需要一个不懂编程的对象,向ta一字一句解释你的程序。

在这一步你的解释需要做得非常非常详细,自然而然的就会开始debug,例如这样:

这个程序是为了寻找一个三边之和等于输入的三角形。如果输入的三边长之和是个奇数,那么我们就先把它加1,存到f1里。b数组的三个元素用分别来存储三角形的三边之长,我们先用一个循环,下标从0循环到2,把三边都初始化为1。接下来,我们用一个三层循环枚举三条边的长度。最外层循环枚举第一条边的长度,第一条边的长度必须小于边长的一半,否则它就不是三角形了,所以我们的循环条件是小于f1的一半,在它小于f1的一半时都会继续循环。第二层循环呢当然是枚举第二条边的长度,循环条件是……我们的三边之和是个定值嘛,第一条边已经用掉了一些长度,第二条边的长度必须小于剩下的长度的一半,否则……否则………………草,否则好像也不会怎么样,这是不是写的有点问题。

这个先不管了,总之最内层循环那当然是枚举最后一条边的长度,循环条件是只要三条边的长度能够形成一个三角形,那么就会继续循环。最后在循环里面呢我们检查三边之和是不是等于f1,是的话就输出。

好的那我们举个例子,假如我们输入的是10,那么f1也是10。现在b[0]是1,进内层循环;b[1]是1,进内层循环;b[2]是1,三边能构成三角形,但是三边之和不是10,b[2]++,变成2。然后退出内层循环,b[1]++,变成2,然后再进入内层循环……草,好麻烦,我在最内层循环的if外面加个printf输出一下不就完了么,省的解释这么半天。

好的加上printf重新编译……!?为什么只有四行输出?我得仔细想想…………我觉得这四行输出好像都没有问题,先枚举到这四个三角形是正确的,那为什么不继续循环下去了呢?我草,我明白了,内层循环应该重新初始化边长,不然之前枚举错误的结果都留下来了,影响我继续枚举。好的,有正确的输出了!!!!!但是为什么只有3 3 4……这好像不太对………………我看看之前加的那个printf的输出好了……为啥进入最内层循环体的时候b[0]、b[1]一直都相等呢????…………草,如果b[0]不等于b[1]的话那b[2]=1就不满足内层循环条件了,根本不会进内层循环体,好像写的确实不太对。

草我为什么要枚举b[2],我都知道三边之和了我为什么不能用f1-b[0]-b[1]算出b[2]。

……

直到调对为止。我打了这么多字,但其实你完全应该自己走完这些心路历程。

4. 当你实在没辙了,感觉需要上乎,那么你应该遵守提问规范,在题目描述中写明你的程序是干什么的,希望完成何种功能,以及你是怎么想的,最好还要加上相应的注释,不要像上面那样让我来帮你解释;这样可以防止在不给读者(比如我)任何解释的情况下向他们脸上糊一份代码,使他们(比如我)有砍了你的冲动。好在我相信人能改正错误,所以这次先没有砍了你,而是试图给你解释。


int b[2]

那也只有b[0]和b[1]啊,哪里来的b[2]


我枯了,怎么让知乎不推这种作业性质的问题呢。


#include&
using namespace std;
int main(){
int sum=0;
cin&>&>sum;
for(int i=1;i&n i+n&>k n+k&>i){
cout&

现在问题已解决,c++的代码,代码是在vscode写完粘贴过来的,可能格式会乱


这种东西贴到知乎,实在不应该。题主太初级了,估计连门还没入。建议好好读教科书。


数组越界

能解释一下这段代码是干嘛的吗?for的套娃把我看晕了


推荐阅读:
相关文章