ドリル作成ツール 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 |