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

 

 

inserted by FC2 system