給出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的套娃把我看暈了


推薦閱讀:
相关文章