
前回の記事はこちらになっています↓
引き続きプログラミングとプログラムの評価を行っていきます。
ソースコード
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()を付けることで変換可能であること。
以上 ありがとうございました。