ドリル作成ツール VB6
前へ 目次へ 次へ 

 11.問題作成の処理

 フォームの[作成開始(→追加)]をクリックしたときの処理をプログラムする。
 問題文の作成と問題・解答の作成である。

Private Sub cmdSakusei_Click()
'ドリル作成
    Dim bmax As Long
    Dim n As Integer
    Dim mn As Integer
    Dim mondai As String    '問題
    Dim kaito As String     '解答
    Dim dat(MONMAX) As Double

    txtMondai.Text = BText
    If optBytes(0).Value = True Then
        bmax = &HFF     '1バイト
    Else
        bmax = &HFFFF&  '2バイト
    End If
    '問題作成
    mondai = ""
    For n = 0 To SYURUI - 1
        mn = vsrMonSuu(n).Value     '出題数
        If mn > 0 Then
            If n = HOSU2 Then    '※1
                mondai = mondai & Left(KAKKO1, 1) & Trim(Str(txtMNumber.Text))
                mondai = mondai & Right(KAKKO1, 1) & "次のデータ"
                If bmax = &HFF Then
                    mondai = mondai & "(8ビット)"
                Else
                    mondai = mondai & "(16ビット)"
                End If
                mondai = mondai & "の2の補数を求めなさい。"
                RansuuN mn * 2, dat(), 1, Int(bmax / 2) + 1 '出題データ取得
            Else
                mondai = mondai & Left(KAKKO1, 1) & Trim(Str(txtMNumber.Text))
                mondai = mondai & Right(KAKKO1, 1) & "次の論理"
                If n = WA Then
                    mondai = mondai & "(論理和)"
                ElseIf n = SEKI Then
                    mondai = mondai & "(論理積)"
                ElseIf n = EXOR Then
                    mondai = mondai & "(排他的論理和)"
                End If
                mondai = mondai & "演算をしなさい。"
                RansuuN mn * 2, dat(), 1, bmax '出題データ取得
            End If
            mondai = mondai & "答えは問題と同じ進数で、また、先頭の0も省略せずに答えなさい。" & vbCrLf
            kaito = kaito & Left(KAKKO1, 1) & Trim(Str(txtMNumber.Text)) & Right(KAKKO1, 1)
            '※2 問題,解答
            If n = WA Then
                mondai = mondai & MkMondai(WA, mn, dat(), bmax) & vbCrLf & vbCrLf
                kaito = kaito & MkKaito(WA, mn, dat(), bmax) & vbCrLf
            ElseIf n = SEKI Then
                mondai = mondai & MkMondai(SEKI, mn, dat(), bmax) & vbCrLf & vbCrLf
                kaito = kaito & MkKaito(SEKI, mn, dat(), bmax) & vbCrLf
            ElseIf n = EXOR Then
                mondai = mondai & MkMondai(EXOR, mn, dat(), bmax) & vbCrLf & vbCrLf
                kaito = kaito & MkKaito(EXOR, mn, dat(), bmax) & vbCrLf
            ElseIf n = HOSU2 Then
                mondai = mondai & MkMondai(HOSU2, mn, dat(), bmax) & vbCrLf & vbCrLf
                kaito = kaito & MkKaito(HOSU2, mn, dat(), bmax) & vbCrLf
            End If
            txtMNumber.Text = Str(Val(txtMNumber.Text) + 1)
        End If
    Next n
    '問題成形と表示
    DisplayMondai mondai, kaito
End Sub

※1 ここのIfブロックで問題文を作成している。条件式が真の時に2の補数の問題文、偽の時に論理和、論理積、排他的論理和の問題文である。
※2 If文で4種類に分岐して、問題と解答を作成するプロシージャMkMondaiとMkKaitoを呼び出している。

 プログラムしているときは気づかなかったが、※2のIfブロックが必要ないことに気づいた。
 MkMondai, MkKaitoの第1引数に演算の種類を指定している。それ以外は同じである。演算の種類はIf文の条件式を見てもわかるように変数nと同じである。ということは、※2の部分は次のようにプログラムすることができる。
            '※2 問題,解答
            mondai = mondai & MkMondai(n, mn, dat(), bmax) & vbCrLf & vbCrLf
            kaito = kaito & MkKaito(n, mn, dat(), bmax) & vbCrLf
            txtMNumber.Text = Str(Val(txtMNumber.Text) + 1)
        End If


 問題文と問題データ及び解答データが作成できたので、ここでは問題と解答のデータをそれぞれ指定の基数で作成するプログラムリストを示す。

'各問(中問題)の終端に"ア"を付けること。
'中問題の末尾に"イ"を付けること。
Private Function MkMondai(syu As Integer, mn As Integer, dat() As Double, bmax As Long) As String
    Dim mon As String
    Dim d(1) As String
    Dim n As Integer

    mon = ""
    For n = 1 To mn
        If optShinsu(0 + syu * 3) Then          '2進数
            If optBytes(0) = True Then
                d(0) = Right("00000000" & Dec2Bin(dat(n * 2 - 1)), 8) & "B"
                d(1) = Right("00000000" & Dec2Bin(dat(n * 2)), 8) & "B"
            Else
                d(0) = Right("0000000000000000" & Dec2Bin(dat(n * 2 - 1)), 16) & "B"
                d(1) = Right("0000000000000000" & Dec2Bin(dat(n * 2)), 16) & "B"
            End If
        ElseIf optShinsu(1 + syu * 3) Then      '10進数
            d(0) = dat(n * 2 - 1)
            d(1) = dat(n * 2)
        Else    '16進数
            If optBytes(0) = True Then
                d(0) = Right("00" & Hex(dat(n * 2 - 1)), 2) & "H"
                d(1) = Right("00" & Hex(dat(n * 2)), 2) & "H"
            Else
                d(0) = Right("0000" & Hex(dat(n * 2 - 1)), 4) & "H"
                d(1) = Right("0000" & Hex(dat(n * 2)), 4) & "H"
            End If
        End If

        mon = mon & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " "
        If syu = WA Then
            mon = mon & d(0) & " + " & d(1) & "ア   "
        ElseIf syu = SEKI Then
            mon = mon & d(0) & " * " & d(1) & "ア   "
        ElseIf syu = EXOR Then
            mon = mon & d(0) & " ※ " & d(1) & "ア   "
        ElseIf syu = HOSU2 Then
            mon = mon & d(1) & "ア   "
        End If
    Next n
    MkMondai = Trim(mon) & "イ"
End Function

 最初のIfブロックで問題のデータを指定の基数に変換している。ここでは整数値だけなので16進数の変換に自前のDec2Hexプロシージャを使わずにVisualBASICのHex関数を使っている。

Private Function MkKaito(syu As Integer, mn As Integer, dat() As Double, bmax As Long) As String
    Dim kai As String
    Dim ans As Long
    Dim n As Integer

    For n = 1 To mn
        If syu = WA Then
            ans = dat(n * 2 - 1) Or dat(n * 2)
        ElseIf syu = SEKI Then
            ans = dat(n * 2 - 1) And dat(n * 2)
        ElseIf syu = EXOR Then
            ans = dat(n * 2 - 1) Xor dat(n * 2)
        ElseIf syu = HOSU2 Then
            If optBytes(0).Value = True Then
                ans = (dat(n * 2) * -1) And &HFF
            Else
                ans = (dat(n * 2) * -1) And &HFFFF&
            End If
        End If

        kai = kai & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " "

        If optShinsu(0 + syu * 3) Then          '2進数
            If optBytes(0) = True Then
                kai = kai & Right("00000000" & Dec2Bin(ans), 8)
            Else
                kai = kai & Right("0000000000000000" & Dec2Bin(ans), 16)
            End If
        ElseIf optShinsu(1 + syu * 3) Then      '10進数
            kai = kai & Trim(Str(ans))
        Else    '16進数
            If optBytes(0) = True Then
                kai = kai & Right("00" & Hex(ans), 2)
            Else
                kai = kai & Right("0000" & Hex(ans), 4)
            End If
        End If

        kai = kai & "ア   "
    Next n
    MkKaito = Trim(kai) & "イ"
End Function

 最初のIfブロックで解答を計算している。
 次のIfブロックでは計算した解答を指定の基数に変換している。


 以上で簡単なプログラムの説明は終わりである。



 プログラムリストと実行ファイル  drilltool02.lzh (38KB)

論理演算.frm 37151
論理演算.frx 1090
論理演算.vbp 1016
論理演算.vbw 138
論理演算.exe 77824
DrillHelp.frm 2681
DrillSub.bas 18301
DrillSub.ini 1229
readme.txt 215
 
 論理演算.exeを実行するにはVisualBASIC6.0のランタイムライブラリが必要です。
 ランタイムライブラリなどは別途用意してください。


前へ 目次へ 次へ 
Copyright © 2003 Hiroshi Masuda 

 

 

inserted by FC2 system