ドリル作成ツール VB6 |
13.問題作成の処理
フォームの[作成開始(→追加)]をクリックしたときの処理をプログラムする。
問題文の作成と問題・解答の作成である。
Private Sub cmdSakusei_Click() 'ドリル作成 Dim rr(5) As Integer Dim n As Integer, m As Integer Dim mn As Integer Dim mondai As String '問題 Dim kaito As String '解答 Dim buf As String Dim mon(SYURUI) As String mon(RCHO2) = "次の2つの抵抗R1とR2が直列に接続されているとき、合成抵抗Rを求めなさい。" & vbCrLf mon(RCHO3) = "次の3つの抵抗R1、R2とR3が直列に接続されているとき、合成抵抗Rを求めなさい。" & vbCrLf mon(RCHO4) = "次の4つの抵抗R1、R2、R3とR4が直列に接続されているとき、合成抵抗Rを求めなさい。" & vbCrLf mon(RHEI2) = "次の2つの抵抗R1とR2が並列に接続されているとき、合成抵抗Rを求めなさい。" & vbCrLf mon(RHEI2b) = "次の2つの抵抗R1とR2が並列に接続されているとき、合成抵抗Rを求めなさい。" & vbCrLf mon(RHEI3) = "次の3つの抵抗R1、R2、とR3が並列に接続されているとき、合成抵抗Rを求めなさい。" & vbCrLf mon(RHEI4) = "次の4つの抵抗R1、R2、R3とR4が並列に接続されているとき、合成抵抗Rを求めなさい。" & vbCrLf txtMondai.Text = BText 'テキストに復元 '問題作成 mondai = "" For n = 0 To SYURUI - 1 mn = vsrMonSuu(n).Value '出題数 If mn > 0 Then mondai = mondai & Left(KAKKO1, 1) & Trim(Str(txtMNumber.Text)) & Right(KAKKO1, 1) & mon(n) kaito = kaito & Left(KAKKO1, 1) & Trim(Str(txtMNumber.Text)) & Right(KAKKO1, 1) '問題 If n = RCHO2 Then buf = MChokuretsu(2, mn) ElseIf n = RCHO3 Then buf = MChokuretsu(3, mn) ElseIf n = RCHO4 Then buf = MChokuretsu(4, mn) ElseIf n = RHEI2 Then '(1-999) If chkFloat.Value = 1 Then buf = MHeiretsu(1, mn) '整数 Else buf = MHeiretsuF(1, mn) '実数 End If ElseIf n = RHEI2b Then '(1-99) If chkFloat.Value = 1 Then buf = MHeiretsu(2, mn) '整数 Else buf = MHeiretsuF(2, mn) '実数 End If ElseIf n = RHEI3 Then If chkFloat.Value = 1 Then buf = MHeiretsu(3, mn) '整数 Else buf = MHeiretsuF(3, mn) '実数 End If ElseIf n = RHEI4 Then If chkFloat.Value = 1 Then buf = MHeiretsu(4, mn) '整数 Else buf = MHeiretsuF(4, mn) '実数 End If End If mondai = mondai & Left(buf, InStr(buf, ";;") - 1) & vbCrLf & vbCrLf '※1 kaito = kaito & Mid(buf, InStr(buf, ";;") + 2) & vbCrLf '※1 txtMNumber.Text = Str(Val(txtMNumber.Text) + 1) End If Next n '問題成形と表示 DisplayMondai mondai, kaito End Sub
MChokuretsu、MHeiretsuとMHeiretsuFプロシージャで問題と解答のデータを作成している。それぞれのプロシージャで問題データと解答データを作成しているので、返却値は「問題データ;;解答データ」という形で問題と解答を";;"で区切っている。
※1 ここで、問題データと解答データを分離している。
次は、並列接続の合成抵抗値を整数に限定するかどうかのチェックボックスの処理のプログラムである。
Private Sub chkFloat_Click()
If chkFloat.Value = 1 Then '整数限定
lblSyousu.Enabled = False
optSKeta(0).Enabled = False
optSKeta(1).Enabled = False
optSKeta(2).Enabled = False
optSKeta(3).Enabled = False
Else
lblSyousu.Enabled = True
optSKeta(0).Enabled = True
optSKeta(1).Enabled = True
optSKeta(2).Enabled = True
optSKeta(3).Enabled = True
End If
End Sub
整数限定のときは、小数のけた数のオプションボタン4つを無効にし、限定でないときは有効にしている。
次は、直列接続の問題と解答データの作成処理のプログラムである。
'各問(中問題)の終端に"ア"を付けること。 '中問題の末尾に"イ"を付けること。 Private Function MChokuretsu(ko As Integer, kosuu As Integer) As String '直列合成抵抗問題・解答作成 Dim n As Integer, n1 As Integer Dim rr(5) As Integer Dim mondai As String, kotae As String Dim keta As Long mondai = "" kotae = "" If optKeta(0).Value = True Then keta = 99 ElseIf optKeta(1).Value = True Then keta = 999 Else keta = 9999 End If For n = 1 To kosuu For n1 = 1 To ko rr(n1) = Ransuu(1, keta) Next n1 If ko = 2 Then mondai = mondai & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " " mondai = mondai & "R1 =" & Str(rr(1)) & "(Ω) R2 =" & Str(rr(2)) & "(Ω)ア " rr(0) = rr(1) + rr(2) kotae = kotae & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " " kotae = kotae & Str(rr(0)) & "ア " ElseIf ko = 3 Then mondai = mondai & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " " mondai = mondai & "R1 =" & Str(rr(1)) & "(Ω) R2 =" & Str(rr(2)) & "(Ω) R3 =" & Str(rr(3)) & "(Ω)ア " rr(0) = rr(1) + rr(2) + rr(3) kotae = kotae & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " " kotae = kotae & Str(rr(0)) & "ア " ElseIf ko = 4 Then mondai = mondai & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " " mondai = mondai & "R1 =" & Str(rr(1)) & "(Ω) R2 =" & Str(rr(2)) & "(Ω) R3 =" & Str(rr(3)) & "(Ω) R4 =" & Str(rr(4)) & "(Ω)ア " rr(0) = rr(1) + rr(2) + rr(3) + rr(4) kotae = kotae & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " " kotae = kotae & Str(rr(0)) & "ア " End If Next n MChokuretsu = Trim(mondai) & "イ;;" & Trim(kotae) & "イ" '※1 End Function
※1 問題データと解答データを連結して返却している。
次は、並列接続(整数限定)の問題と解答データの作成処理のプログラムである。
Private Function MHeiretsu(ko As Integer, kosuu As Integer) As String '並列合成抵抗問題・解答作成(答え整数限定) Dim n As Integer, n1 As Integer, x As Integer Dim mondai As String, kotae As String mondai = "" kotae = "" For n = 1 To kosuu If ko = 1 Then '1-999 x = Ransuu(1, R2MAX) mondai = mondai & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " " mondai = mondai & "R1 =" & Str(R2Data(x, 0)) & "(Ω) R2 =" & Str(R2Data(x, 1)) & "(Ω)ア " kotae = kotae & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " " kotae = kotae & Str(R2Data(x, 2)) & "ア " ElseIf ko = 2 Then '1-99 x = Ransuu(1, R2bMAX) mondai = mondai & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " " mondai = mondai & "R1 =" & Str(R2bData(x, 0)) & "(Ω) R2 =" & Str(R2bData(x, 1)) & "(Ω)ア " kotae = kotae & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " " kotae = kotae & Str(R2bData(x, 2)) & "ア " ElseIf ko = 3 Then x = Ransuu(1, R3MAX) mondai = mondai & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " " mondai = mondai & "R1 =" & Str(R3Data(x, 0)) & "(Ω) R2 =" & Str(R3Data(x, 1)) & "(Ω) R3 =" & Str(R3Data(x, 2)) & "(Ω)ア " kotae = kotae & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " " kotae = kotae & Str(R3Data(x, 3)) & "ア " ElseIf ko = 4 Then x = Ransuu(1, R4MAX) mondai = mondai & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " " mondai = mondai & "R1 =" & Str(R4Data(x, 0)) & "(Ω) R2 =" & Str(R4Data(x, 1)) & "(Ω) R3 =" & Str(R4Data(x, 2)) & "(Ω) R4 =" & Str(R4Data(x, 3)) & "(Ω)ア " kotae = kotae & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " " kotae = kotae & Str(R4Data(x, 4)) & "ア " End If Next n MHeiretsu = Trim(mondai) & "イ;;" & Trim(kotae) & "イ" End Function
次は、並列接続の問題と解答データの作成処理のプログラムである。
Private Function MHeiretsuF(ko As Integer, kosuu As Integer) As String '並列合成抵抗問題・解答作成 Dim n As Integer, n1 As Integer Dim rr(5) As Double Dim mondai As String, kotae As String Dim keta As Double mondai = "" kotae = "" For n = 0 To 3 If optSKeta(n).Value = True Then keta = 10 * 10 ^ n mondai = "答えは小数第" & Str(n + 1) & "位まで四捨五入で求めなさい。" & vbCrLf End If Next n For n = 1 To kosuu For n1 = 1 To ko rr(n1) = Ransuu(1, 99) Next n1 If ko = 1 Then '1-999 rr(1) = Ransuu(1, 999) rr(2) = Ransuu(1, 999) mondai = mondai & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " " mondai = mondai & "R1 =" & Str(rr(1)) & "(Ω) R2 =" & Str(rr(2)) & "(Ω)ア " rr(0) = rr(1) * rr(2) / (rr(1) + rr(2)) rr(0) = Int(rr(0) * keta + 0.5) / keta kotae = kotae & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " " kotae = kotae & Str(rr(0)) & "ア " ElseIf ko = 2 Then '1-99 mondai = mondai & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " " mondai = mondai & "R1 =" & Str(rr(1)) & "(Ω) R2 =" & Str(rr(2)) & "(Ω)ア " rr(0) = rr(1) * rr(2) / (rr(1) + rr(2)) rr(0) = Int(rr(0) * keta + 0.5) / keta kotae = kotae & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " " kotae = kotae & Str(rr(0)) & "ア " ElseIf ko = 3 Then mondai = mondai & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " " mondai = mondai & "R1 =" & Str(rr(1)) & "(Ω) R2 =" & Str(rr(2)) & "(Ω) R3 =" & Str(rr(3)) & "(Ω)ア " rr(0) = rr(1) * rr(2) / (rr(1) + rr(2)) rr(0) = rr(0) * rr(3) / (rr(0) + rr(3)) rr(0) = Int(rr(0) * keta + 0.5) / keta kotae = kotae & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " " kotae = kotae & Str(rr(0)) & "ア " ElseIf ko = 4 Then mondai = mondai & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " " mondai = mondai & "R1 =" & Str(rr(1)) & "(Ω) R2 =" & Str(rr(2)) & "(Ω) R3 =" & Str(rr(3)) & "(Ω) R4 =" & Str(rr(4)) & "(Ω)ア " rr(0) = rr(1) * rr(2) / (rr(1) + rr(2)) rr(0) = rr(0) * rr(3) / (rr(0) + rr(3)) rr(0) = rr(0) * rr(4) / (rr(0) + rr(4)) rr(0) = Int(rr(0) * keta + 0.5) / keta kotae = kotae & Left(KAKKO2, 1) & Trim(Str(n)) & Right(KAKKO2, 1) & " " kotae = kotae & Str(rr(0)) & "ア " End If Next n MHeiretsuF = Trim(mondai) & "イ;;" & Trim(kotae) & "イ" End Function
以上で簡単なプログラムの説明は終わりである。
プログラムリストと実行ファイル drilltool03.lzh (44KB)
合成抵抗1.frm 38300
合成抵抗1.frx 1090
合成抵抗1.vbp 1096
合成抵抗1.vbw 225
合成抵抗1データ.bas 3744
合成抵抗1.exe 94208
dlgGTeikou.frm 1345
DrillHelp.frm 2681
DrillSub.bas 18301
DrillSub.ini 1229
readme.txt 215
合成抵抗1.exeを実行するにはVisualBASIC6.0のランタイムライブラリが必要です。
ランタイムライブラリなどは別途用意してください。
Copyright © 2003 Hiroshi Masuda |