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

 7.問題作成の処理

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

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

    mon(M2TO10) = "次の2進数を10進数にしなさい。" & vbCrLf
    mon(M10TO2) = "次の10進数を2進数にしなさい。"
    mon(M16TO10) = "次の16進数を10進数にしなさい。" & vbCrLf
    mon(M10TO16) = "次の10進数を16進数にしなさい。"
    mon(M2TO16) = "次の2進数を16進数にしなさい。"
    mon(M16TO2) = "次の16進数を2進数にしなさい。"
    
    If optBytes(0).Value = True Then
        bmax = &HFF     '1バイト
    ElseIf optBytes(1).Value = True Then
        bmax = &HFFFF&  '2バイト
    End If
    '問題作成
    mondai = ""
    For n = 0 To SYURUI - 1
        mn = vsrMonSuu(n).Value     '出題数
        If mn > 0 Then
            mondai = mondai & Left(KAKKO1, 1) & Trim(txtMNumber.Text) & Right(KAKKO1, 1) & mon(n)
            If Right(mon(n), 1) <> vbCrLf Then
                If optBytes(0).Value = True Then    '1バイト
                    mondai = mondai & "ただし、先頭の0を省略せずに1バイトで答えなさい。" & vbCrLf
                ElseIf optBytes(1).Value = True Then    '2バイト
                    mondai = mondai & "ただし、先頭の0を省略せずに2バイトで答えなさい。" & vbCrLf
                Else
                    mondai = mondai & vbCrLf
                End If
            End If
            If chkFloat.Value = 0 Then
                RansuuN mn, dat(), 1, bmax  '※1 整数出題データ取得
            Else
                GetData mn, dat()    '※2 実数出題データ取得
            End If
            '※3 問題
            If n = M2TO10 Or n = M2TO16 Then
                mondai = mondai & Mondai2(mn, dat(), bmax) & vbCrLf & vbCrLf
            ElseIf n = M16TO10 Or n = M16TO2 Then
                mondai = mondai & Mondai16(mn, dat(), bmax) & vbCrLf & vbCrLf
            ElseIf n = M10TO2 Or n = M10TO16 Then
                mondai = mondai & Mondai10(mn, dat(), bmax) & vbCrLf & vbCrLf
            End If
            '※3 解答
            kaito = kaito & Left(KAKKO1, 1) & Trim(txtMNumber.Text) & Right(KAKKO1, 1)
            If n = M10TO2 Or n = M16TO2 Then
                kaito = kaito & Mondai2(mn, dat(), bmax) & vbCrLf
            ElseIf n = M10TO16 Or n = M2TO16 Then
                kaito = kaito & Mondai16(mn, dat(), bmax) & vbCrLf
            ElseIf n = M2TO10 Or n = M16TO10 Then
                kaito = kaito & Mondai10(mn, dat(), bmax) & vbCrLf
            End If
            txtMNumber.Text = Str(Val(txtMNumber.Text) + 1)
        End If
    Next n
    DisplayMondai mondai, kaito  '※4
End Sub

 ※1までで問題文などを設定している。
※1 出題数の個数分だけ乱数で整数を用意する。用意した整数値は配列datに記憶される。RansuuNプロシージャは共通処理(標準モジュールDrillSub.BAS)で作成したものである。
※2 出題数の個数分だけ乱数で実数を用意する。用意した整数値は配列datに記憶される。プログラムは後で示す。
※3 問題データと解答データを作成している。2進数用、10進数用、16進数用に分けて、それぞれMondai2, Mondai10, Mondai16プロシージャで処理している。プログラムは次のページで示す。
※4 問題データ(変数mondai)と解答データ(変数kaito)を引数にDisplayMondaiプロシージャを呼び出し、問題と解答を表示している。

Private Sub GetData(num As Integer, arry() As Double)
'実数データ作成
    Dim n As Integer, sbin As String

    For n = 1 To num
        arry(n) = Ransuu(0, &HFF)  '(1)
        sbin = "0." & Right("00000000" & Dec2Bin(arry(n)), Val(txtSyosu.Text))  '(2)
        arry(n) = Bin2Dec(sbin) + Ransuu(0, &HFF)  '(3)
    Next n
End Sub

 For〜Nextで必要な個数の実数値を作成する。
 (1) 1バイトの範囲の乱数を発生し、配列arryに記憶する。(2)配列arryを2進数に変換し、小数のけた数(txtSyosu.Text)分だけ取り出している。"0.101010"のような形で変数sbinに記憶する。(3)変数sbin(2進数の実数)を10進数値に変換し、1バイトの範囲の乱数(整数)と加算して実数値を作成し、配列arryに記憶する。


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

 

 

inserted by FC2 system