第5講 第4講のプログラムエラー原因探索各アイテムの解説
第1話 プログラムミスについて
原因究明プログラムファイル1
別解のあるなし検証プログラムファイル
実験用100題生成数度作成アプリ添付ファイル
数独の問題の適正を調べるプログラム添付ファイル
第5講では上のファイルにある「プログラムのエラー原因究明」に使った
各アイテムについて解説していきます。
私はプログラミングミスは次の3種類があると思います。
@ タイピングミス・スペリングミスなどのケアレスミス
A 実行エラー(文法的ミス)
B 事象(内容)上の論理的ミス
@とAについては、VBAデバッガがどこに原因があるかを教えてくれますが、
Bの内容上の論理的ミスが一番深刻です。
自分では事象・内容を正確に把握して、
内容に応じた論理構築をしたつもりなのに、
自分が意図した通りに動かない
ことがプログラミングではしばしば生じます。
市販されている基本ソフトやアプリケーションソフトにさえ、
バグがあることはしばしばあります。
昨年度のソフトとプロ棋士の代表が戦う電王戦では、
はじめてプロ側が3勝2敗と勝ち越しましたが、私の記憶によれば、
そのうちの2勝は、プロ棋士がソフトとの対戦のためにソフトと対戦していて、
プログラムの欠陥に気づき、その点を突いて勝利したものです。
電王戦の規定で、
対戦前に無料でソフトを対戦するプロ棋士に提供することが義務づけられているのです。
この2つのソフトは市販されているかは分かりませんが、
ソフト側の代表に選ばれたぐらいですから、
評価の高いソフトであったのですが、
それでも思わぬバグがあったのです。

将棋や数独(ナンプレ)などの複雑な内容を扱っているときには、
プログラマーが意図した通りに、
動かないことがしばしばあるのです。
第4講第7話において完成したつもりのプログラムが、
ことごとく別解のある問題を生成し続けました。
何度もコードを読み直して、
論理的には正しいはずだなのにどうしてちゃんと動いてくれないんだろうと、
1日半も悩んでしまいました。
Private Sub CommandButton1_Click()
       ・
  Do While 1
    hj1 = Timer
    zlk '全体リスト構造解析プロシージャ
    sds (0) '数独作成プロシージャ
    sdc '数独のコピー
    zlk '全体リスト構造解析プロシージャ
    mds '問題作成プロシージャ
    sds (hintosu) '数独作成プロシージャ

    If cn = 1 Then Exit Do
  Loop
       ・
Sub sds(g As Integer) '数独作成プロシージャ
  Dim i As Byte, ii As Byte, iii As Byte
  ii = Int(Rnd * mx(y(g), x(g)))
  For i = 0 To mx(y(g), x(g))
    iii = (i + ii) Mod (mx(y(g), x(g)) + 1)
    p(y(g), x(g)) = rlst(y(g), x(g), iii)
    If klk(g) = 1 Then '局所リスト解析プロシージャ
      If g + 1 < hintosu Then
        sds (g + 1)
        If cn = 1 Then Exit Sub
      Else
        If g + 1 < n * n Then
          sds (g + 1)
          If cn = 1 Then Exit Sub
        Else
          hyouji '問題表示プロシージャ
          cn = cn + 1
          Exit Sub
        End If
      End If
    End If
    hukugen (g)
  Next
  p(y(g), x(g)) = 0
End Sub
このコードを読む限りでは、
別解のある問題を作る道理はどこにもないはずなのです。
1回目で解答を作り、
2回目は互いに素を利用して配置したセルの数字のみを残し、
後は全部0にした問題をもう一度解かせる、
そして、解答が1個しかないときのみに、
  Do While 1
    hj1 = Timer
    zlk '全体リスト構造解析プロシージャ
    sds (0) '数独作成プロシージャ
    sdc '数独のコピー
    zlk '全体リスト構造解析プロシージャ
    mds '問題作成プロシージャ
    sds (hintosu) '数独作成プロシージャ
    
If cn = 1 Then Exit Do
  Loop
によって、はじめてDo文のループを抜けて、
問題と解答を表示するはずです。
1回目で
@ 解答がある
の条件をクリアして
2回目で
A 別解がない
の条件をクリアするはずです。
悪戦苦闘して
原因究明プログラムファイル1
のプログラムを組んでようやく論理的ミスの原因を突きとめました。
第2話以降で、各アイテムについて解説していきましょう。

第4講第8話へ 第2話へ
004

eclipse c++ 入門
魔方陣 数独(ナンプレ)で学ぶ VBA 入門
数独(ナンプレ)のシンプルな解き方・簡単な解法の研究
vc++講義へ
excel 2013 2010 2007 vba入門へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
専門用語なしの C言語 C++ 入門(Visual C++ 2010で学ぶ C言語 C++ 入門)
専門用語なしの excel vba マクロ 入門 2013 2010 2007 対応講義 第1部
eclipse java 入門へ
excel 2016 vba 入門へ
小学生からエンジニアまでのRuby入門へ
本サイトトップへ