2016-04-26 27 views
0

這是我的循環結構。如何在java中組織3個嵌套循環?

int k = 0; 
do { 
    ....       

    do { 
     fc = Recognize(); 
     .... 
     do { 
      .... 
     } while(fc != false); 

     k++; 
    } while(k != 20); 

    if (k == 20) { 
     return; 
    } 
} while(true); 

我必須結束所有的循環時,無論是k等於20或fc等於true。
我嘗試了不同的方法來做到這一點,但失敗了。上面的代碼是我最後一次嘗試。需要幫助解決這個問題。

grabber.start(); 
    int k=0; 
    do { 
    grabber.stop(); 
    grabber.start(); 

    img = grabber.grab(); 
    if (img != null) { 
     canvas.showImage(img); 
     canvas.pack(); 
     cvWaitKey(0); 
    } 
    do { 
     fc= Recognize(); 
     grabber.start(); 
     do { 
     img = grabber.grab(); 
     if (img != null) { 
      CvHaarClassifierCascade cascade = new 
      CvHaarClassifierCascade(cvLoad(XML_FILE)); 
      CvMemStorage storage = CvMemStorage.create(); 
      CvSeq sign = cvHaarDetectObjects(img, 
       cascade,storage, 1.5, 3,CV_HAAR_DO_CANNY_PRUNING); 

      cvClearMemStorage(storage); 
      total_Faces = sign.total();  

      for(int i = 0; i < total_Faces; i++){ 
       CvRect r = new CvRect(cvGetSeqElem(sign, i)); 
       cvRectangle (img, 
       cvPoint(r.x(),r.y()), 
       cvPoint(r.width()+r.x(),r.height()+ r.y()), 
       CvScalar.RED,2,CV_AA,0); 

       x=r.x(); 
       y=r.y(); 
       h=r.height(); 
       w=r.width(); 
       }   

       cvFlip(img, img, 1); 
       canvas.showImage(img); 
       canvas.pack(); 
       cvWaitKey(0); 
      } 
     } while(fc!=false); 

     k++;  
     } while(k!=21); 
    } while(true); 
    } 
+0

您現在有,如果我正確地讀它。你初始化'INT K = 20的無限循環;',那麼當你在第二級'你'有'k ++',並且在檢查同樣的do-while-loop時檢查'while(k!= 20);'此時'k'是21,並且它不斷上升,所以它將永遠不會在你發佈的代碼片段中留下這個'do-while'循環。 –

+0

@Kevin Cruijssen。它是k = 0;在我的代碼中。我寫這篇文章時弄錯了。 –

+0

仍然很混亂......這段代碼做了什麼?如果圖像不爲空,則抓取圖像並顯示它,然後執行一些「識別」並獲取另一個(?)圖像。如果後一張圖像不爲空,則對其進行一些分析,並且如果發現某些東西,則將每個對象上的凹痕放在上面?用文字解釋你想做什麼。 – Johnny

回答

0

while(k!=21 && fc){...}就足夠了。或者do {...} while(k!=21 && fc);如果需要。最外面的循環與中間的某些if一樣沒用。

1

簡答:不這樣做。

查看Robert Martin的Clean code;並瞭解&適用single layer of abstraction的原則。

爲什麼各種工具通過特別尋找這種嵌套結構來衡量「代碼複雜性」有很好的理由。

據我所知,很多有「數學」背景的人認爲,當計算機程序類似於「數學」結構時,它是可以的。但是,那是錯誤的。計算機程序被寫入......以供人類閱讀。當你閱讀一段源代碼時,主要的重點是:你需要多長時間才能理解正在發生的事情。

我向你保證,不管你如何在一個循環的循環中構造循環;在從現在開始的一個星期內,您將很難理解正在發生的事情。因此,坐下一個小時或更長時間來提出更好的解決方案是值得的。不幸的是,你的例子並沒有顯示你想要解決的實際問題;因此在你的情況下很難給出具體的提示。

+0

這個答案是通用的,並沒有解決這個問題,它有一個簡單而具體的答案。而且,這是一種過度泛化。我強烈反對嵌套循環固有的不好的事實。 – Nico

+0

@Jägermeister好的。這裏是一個完整的代碼。你的解決方案是什麼? –

+0

@Nico當你在路上遇到一個失明的人時,那傢伙問你:「有一輛卡車正在路上行駛嗎?」任何你回答「不」;這將是一個具體問題的具體答案。但是當那個盲人決定在街上走過,被一輛特斯拉汽車撞倒......這個正確的,具體的答案不是太有用嗎?!我說的是:**這個**代碼太複雜了。而**代碼**結構可能會隱藏更多的錯誤。也許有些地方在循環循環中被接受;精細。但是我有太多不好的代碼讓它通過。 – GhostCat

-1

需要編寫的唯一循環是

int k = 0; 
do { 
     fc = Recognize(); 
     k++ ; 
    } while(k!=20 || fc); 
+0

我需要執行的代碼的不同部分不等量。這就是爲什麼我需要3個循環。 –

+0

這個要求沒有在實際問題中指定。 downvote沒有理由。 –

+0

@ Nayan Sonthalia。我現在指定它。而不是我低調的人。 –