2016-12-22 4 views
0

コードの実行として、私はさまざまなソートアルゴリズムの可視化に取り組んでいます。アルゴリズムを一時停止するボタンがあり、配列のすべての項目が棒グラフとして表示されます。これを実現するために、ソート用の2つのfor-loopsの中にネストされたwhileループがあります。私はボタンをもう一度押すまでブーリアン変数がtrueに設定され、ソートが続けられます。ForループのインデックスはネストされたWhileループの後に0にリセットされます

しかし、プログラムがwhileループを終了すると、forループ(iとj)の2つのindeciesが0にリセットされ、並べ替えが最初から再び開始されます。

swap()とdraw()は、名前が示すとおりの機能を持つカスタム関数です。

for (i = 0; i < items.Count(); i++) 
    { 
     for (j = 0; j < items.Count() - 1 - i; j++) 
     { 
      //lbl_i.Text = Convert.ToString(i); 
      //lbl_j.Text = Convert.ToString(j); 

      if (items[j] > items[j + 1]) 
      { 
       swap(j, j + 1); //swaps the items at two given indecies 
       draw(); // draws the array to the picturebox 
      } 

      while (sorting == false) //the sorting is paused 
      { 
       Application.DoEvents(); 
      } 
     } 
    } 

すべてのアイデア、なぜこれが起こる可能性:

はここでのソートのための私のコードですか?

私はそれがApplication.DoEvents()呼び出しで問題になる可能性があると思っていますが、私はボタンを押すことができるようにする必要があります。

また、私のコードで他に気づいたことがあれば、私はもっとうまくいくかもしれませんが、私はコーディングにあまり経験がありませんので、助けと建設的な批評は大歓迎です。 :-)

ありがとうございます!

ベンジャミン

+4

使用デバッグと参照してください。私はそれをクリックしたときので、関数はクリックイベントで

コード再び呼び出され、私とのint jは0に再初期化されているintです! – mybirthname

+0

同じボタンのクリックイベントからこの関数を呼び出していますか? – krillgar

+0

どういうわけかこれらのループから抜け出し、やり直しているような気がします。コードの残りの部分がなくても問題が何であるかを言うのは難しいです。 – EJC

答えて

0

:問題だった、私は最初の場所で、同じボタンからこの関数を呼び出したこと。そのクリックイベントでは、ボタンが「一時停止」または「開始」と表示されているかどうかを確認するif文がありますが、プログラムを一時停止すると「開始」と表示されます。

private void btn_start_Click(object sender, EventArgs e) 
    { 
     //new added code 
     if (btn_start.Text == "Start") 
     { 
      btn_start.Text = "Pause"; 
      sorting = true; 
      sort(); 
     } 
     else if (btn_start.Text == "Pause") 
     { 
      btn_start.Text = "Continue"; // '= "Start"' in the old code 
      tmr_sorting.Stop(); 
      sorting = false; 
     } 
     // new added code 
     else if (btn_start.Text == "Continue") 
     { 
      btn_start.Text = "Pause"; 
      sorting = true; 
     } 
    } 
2

あなたがforループでiとjを作成しない、i、jは、あなたのアプリのどこか変わってしまうかもしれません。これを試してみてください:

for (int i = 0; i < items.Count(); i++) 
{ 
    for (int j = 0; j < items.Count() - 1 - i; j++) 
    { 
     //lbl_i.Text = Convert.ToString(i); 
     //lbl_j.Text = Convert.ToString(j); 

     if (items[j] > items[j + 1]) 
     { 
      swap(j, j + 1); //swaps the items at two given indecies 
      draw(); // draws the array to the picturebox 
     } 

     while (sorting == false) //the sorting is paused 
     { 
      Application.DoEvents(); 
     } 
    } 
} 

変更がである:私はint型、int型のjの答えを見つけ

+0

私は最初これが好きでしたし、それもうまくいきませんでした。 int iとint jは2つのループの直前で初期化されます。 – tambenj

関連する問題