✔︎Pickup
【プログラミング】総当たりのプログラム③(評価編)

前回の記事はこちらになっています↓

引き続きプログラミングとプログラムの評価を行っていきます。

ソースコード

2桁の文字列を表示するプログラムのソースコードは以下の記述になっています。

            //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //2桁目を00~ZZまで検索
            //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            for (j = 0; j < max_loop_cnt; j++)              //二桁目のループ
            {
                for (i = 0; i < max_loop_cnt; i++)          //一桁目のループ
                {
                    one_digits = charlist[i];               //charlistに格納しているデータをone_digitsに1文字ずつ格納していく
                    two_digits = charlist[j];               //charlistに格納しているデータをtwo_digitsに1文字ずつ格納していく

                    //two_digitsとone_digitsの文字列を組み合わせて表示する
                    display_data = two_digits.ToString() + one_digits.ToString();   //char文字をstringに変換してdisplay_dataに格納する

                }
                  textBox1.Text = display_data;           //display_dataをGUIのtextBox1に表示する

                  textBox1.Refresh();                     //GUIに表示する文字が実行毎に表示されるようにGUI画面を更新する
            }

3桁の文字列を表示するプログラムのソースコードは以下の記述になっています。

            //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //3桁目を000~ZZZまで検索
            //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            for (k = 0; k < max_loop_cnt; k++)                  //三桁目のループ
            {
                for (j = 0; j < max_loop_cnt; j++)              //二桁目のループ
                {
                    for (i = 0; i < max_loop_cnt; i++)          //一桁目のループ
                    {
                        one_digits = charlist[i];               //charlistに格納しているデータをone_digitsに1文字ずつ格納していく
                        two_digits = charlist[j];               //charlistに格納しているデータをtwo_digitsに1文字ずつ格納していく
                        three_digits = charlist[k];             //charlistに格納しているデータをthree_digitsに1文字ずつ格納していく

                        //three_digitsとtwo_digitsとone_digitsの文字列を組み合わせて表示する
                        display_data = three_digits.ToString() + two_digits.ToString() + one_digits.ToString();   //char文字をstringに変換してdisplay_dataに格納する

                    }
                }
                  textBox1.Text = display_data;           //display_dataをGUIのtextBox1に表示する

                  textBox1.Refresh();                     //GUIに表示する文字が実行毎に表示されるようにGUI画面を更新する
            }

4桁の文字列を表示するプログラムのソースコードは以下の記述になっています。

            //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //4桁目を0000~ZZZZまで検索
            //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            for (l = 0; l < max_loop_cnt; l++)                      //四桁目のループ
            {
                for (k = 0; k < max_loop_cnt; k++)                  //三桁目のループ
                {
                    for (j = 0; j < max_loop_cnt; j++)              //二桁目のループ
                    {
                        for (i = 0; i < max_loop_cnt; i++)          //一桁目のループ
                        {
                            one_digits = charlist[i];               //charlistに格納しているデータをone_digitsに1文字ずつ格納していく
                            two_digits = charlist[j];               //charlistに格納しているデータをtwo_digitsに1文字ずつ格納していく
                            three_digits = charlist[k];             //charlistに格納しているデータをthree_digitsに1文字ずつ格納していく
                            four_digits = charlist[l];              //charlistに格納しているデータをfour_digitsに1文字ずつ格納していく

                            //four_digitsとthree_digitsとtwo_digitsとone_digitsの文字列を組み合わせて表示する
                            display_data = four_digits.ToString() + three_digits.ToString() + two_digits.ToString() + one_digits.ToString();   //char文字をstringに変換してdisplay_dataに格納する

                        }
                    }
                      textBox1.Text = display_data;           //display_dataをGUIのtextBox1に表示する

                      textBox1.Refresh();                     //GUIに表示する文字が実行毎に表示されるようにGUI画面を更新する
                }
            }

上記ソースコードに時間を計測するソースコードを追加します。

時間計測を開始するソースコードは以下になります。

            var sw = new System.Diagnostics.Stopwatch();    //時間計測用
            TimeSpan ts;                                    //時間計測用

            // 計測開始
            sw.Start();

時間計測を停止して、textBox2に取得したプログラムを表示するソースコードは以下になります。

            // 計測停止
            sw.Stop();
            ts = sw.Elapsed;
            textBox2.Text = ($"{ts.Hours}時間 {ts.Minutes}分 {ts.Seconds}秒 {ts.Milliseconds}ミリ秒");

動作確認

実際に動かしてみたいと思います。

プログラムを4つに分けて修正して、動作確認をします。

① 文字列の表示は1文字毎に表示する。

② 0~Zまでの1桁目は1文字毎に表示する。
2桁目以降は2桁目の文字が変化する毎に表示する。

③ 0~Zまでの1桁目は1文字毎に表示する。
00~ZZまでの2桁目は2桁目の文字が変化する毎に表示する。
3桁目以降は3桁目の文字が変化する毎に表示する。

④ 検索中、文字を表示しない。

実行結果

①プログラムが停止しました。30分程度待ちましたが、応答待ち状態でフリーズしました。
文字列を表示する頻度が高いと、プログラムが正常に動作しないようです。

②一度プログラムが停止しました。その後、30秒程度待つとプログラムが完了しました。
32秒 230ミリ秒で実行完了しました。

③「総当たり」ボタンのクリック後、2秒 458ミリ秒後に実行が完了しました。
プログラムが一度も停止しませんでしたので、文字列表示は頻度はここら辺が最適かもしれません。

④文字列を一度も表示しないと4桁程度の検索は1秒 716ミリ秒で完了しました。

まとめ

・数字+英字大文字+英字小文字の表示は4桁であれば、1秒で探索が可能である。
・文字列の表示はデバッグ用であっても、プログラムの処理速度に影響する。
・プログラムの動作時間の結果
①プログラム停止(30分以上)
②32秒 230ミリ秒
③2秒 458ミリ秒
④1秒 716ミリ秒

今回の技術的な気づき

・プログラムが応答なしで、停止したとしても時間が経てば動作が完了することがある。
・C#のtextBoxはRefreshを行わないと文字列の表示の更新がされないこと。
・char型の文字列をstring型に変換するには、charの変数に.ToString()を付けることで変換可能であること。

以上 ありがとうございました。

ブログ村リンク
ポチッと押してね!フォローもしてね!

ブログランキング・にほんブログ村へ
にほんブログ村
おすすめの記事