2016-04-26 8 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真等しいと等しいときに、すべてのループを終了する必要があります。
これを行うにはさまざまな方法を試しましたが失敗しました。上記のコードは私の最後の試みです。それを修正する際に助けが必要です。

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

ある;'、あなたがしているとき第2レベルの 'do'は' 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

短い回答:しないでください。

ロバート・マーティンによるクリーン・コードを参照してください。 & single layer of abstraction原則を適用して理解してください。

良い理由様々なツールの尺度は、特に、入れ子構造のような種類を探すことにより、「コードの複雑さ」があります。

私はより多くの「数学」の背景を持つ多くの人々はコンピュータプログラムは、「数学」の構造に似ているとき、それはOKだと思いことを理解しています。しかし、それは間違っています。コンピュータプログラムは、人間によって読み込まれるように書かれています。ソースコードを読むときに重要なのは、何が起こっているのか理解するまでにどれくらいの時間がかかります。

私は、あなたを保証するどんなにあなたがループ内のループでループを構築する方法。今から1週間後には、何が起こっているのかを理解するのに大きな困難があります。したがって、1時間以上座ってより良い解決策を思いつく価値があります。残念ながら、あなたの例では解決しようとしている実際の問題は表示されません。したがって、あなたのケースでそれを行う方法について具体的なヒントを与えることは難しいです。

+0

この回答は一般的なものであり、簡単で具体的な回答があるこの質問には対処していません。また、過度の一般化です。ネストされたループは本質的に悪いという事実に強く反対します。 – Nico

+0

@Jägermeisterok。ここに完全なコードがあります。あなたのソリューションは何ですか? –

+0

@Nicoあなたが目の前にいる盲人に会うと、その男はあなたに「あなたが道路に降りてくるトラックはありますか?」と尋ねます。あなたは誰も "いいえ"と答える。それは特定の質問に対する具体的な答えとなるでしょう。しかし、盲目の男が通りを歩くことにしたとき、テスラ車が走っている...正しい、特定の答えがあまり役に立たなかったのですか?私が言っていることは:**この**コードはあまりにも複雑です。 ** code **構造だけでは、さらに多くのバグを隠すかもしれません。おそらく、ループ内のループがループ内にあった場所があるかもしれません。良い。しかし、私はそれが通過するようにあまりにも多くの悪いコードがあります。 – GhostCat

-1

書き込む必要がある唯一のループは、私は..あなたが `int型のk = 20初期化し、それを正しく読んでいる場合は、現在の無限ループを持って

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

私は同じ時間で実行されるコードの異なる部分が必要です。なぜ私は3つのループが必要です。 –

+0

この要件は、実際の質問では明記されていません。 downvoteの理由はありませんでした。 –

+0

@ Nayan Sonthalia。私は今それを指定しました。それは私のものではない。 –

関連する問題