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

合成抵抗計算ドリルTの作成

 ここからは、合成抵抗計算ドリルを作成していく。共通で利用できる部分についてはそのまま利用できるので、ここでは固有の処理について説明する。

 12.初期化の処理

 ウィンドウのデザインは次図のとおりとした。問題の種類の部分を変更しただけである。

 

 問題の種類部分はフレームを2つ配置して直列接続と並列接続に分けている。各オブジェクトはフレームの上に配置している。
 直列接続はオプションボタン(optKeta)で抵抗値の範囲を選択できる。
 並列接続はチェックボックスで合成抵抗値を整数に限定したり、実数の時は合成抵抗値の小数部のけた数を指定できるようにしている。小数部は四捨五入によって指定のけた数にする。

 定数などを設定している。フォームの(General), (Declarations)にプログラムする。

Option Explicit

Const MONMAX = 100  '最大出題数
Const SYURUI = 7    '問題の種類
Const RCHO2 = 0     '直列接続2つ
Const RCHO3 = 1     '直列接続3つ
Const RCHO4 = 2     '直列接続4つ
Const RHEI2 = 3     '並列接続2つ
Const RHEI2b = 4    '並列接続2つ
Const RHEI3 = 5     '並列接続3つ
Const RHEI4 = 6     '並列接続4つ
Private Sub Form_Load()
'初期設定
    Dim n As Integer

    InitComm            '共通の初期化
    InitUsage           '使用法初期化
    For n = 0 To SYURUI - 1
        txtMonSuu(n).Text = "0"
        vsrMonSuu(n).Value = 0
        vsrMonSuu(n).min = MONMAX
        vsrMonSuu(n).max = 0
    Next n
    txtMondai.Left = TabStrip1.ClientLeft   'タブ内テキストボックス設定
    txtMondai.Top = TabStrip1.ClientTop
    txtMondai.Width = TabStrip1.ClientWidth
    txtMondai.Height = TabStrip1.ClientHeight
    InitTeikou 4    '並列接続合成抵抗データ、整数値用初期化
    Me.Show
    txtMonSuu(0).SetFocus
End Sub

 InitTeikouプロシージャで並列接続の合成抵抗値が整数値になる組み合わせをあらかじめ計算している。この初期化の処理は標準モジュールを追加してプログラムしている。また、フォームモジュールの追加でダイアログを追加して初期化の途中経過を表示している。

メニューバーから [プロジェクト(P)] → [標準モジュールの追加(M)] → 標準モジュールを追加する。
メニューバーから [プロジェクト(P)] → [フォームモジュールの追加(M)] → ダイアログを追加する。
 
追加した標準モジュールのオブジェクト名を GouseiTeikou1 とする。
追加したダイアログは dlgGTeikou とする。また、メッセージ表示用にラベルを配置し、オブジェクト名は lblDisplay とする。

 標準モジュールに作成した合成抵抗値が整数になる組み合わせを調べるプログラムを次に示す。

Option Explicit

Public R2MAX As Long        '抵抗2つ(<999)
Public R2bMAX As Long       '抵抗2つ(<99)
Public R3MAX As Long        '抵抗3つ(<99)
Public R4MAX As Long        '抵抗4つ(<99)
Public R2Data(1600, 2) As Integer    '抵抗のセット
Public R2bData(110, 2) As Integer
Public R3Data(350, 3) As Integer
Public R4Data(1200, 4) As Integer

Public Sub InitTeikou(x As Integer)
    dlgGTeikou.Show
    dlgGTeikou.Caption = App.Title
    dlgGTeikou.lblDisplay.Caption = "データ初期化中... しばらくお待ち下さい。" & vbCrLf
    If x = 2 Then
        InitR2
    ElseIf x = 3 Then
        InitR2
        InitR3
    ElseIf x = 4 Then
        InitR2
        InitR3
        InitR4
    Else
        MsgBox "抵抗初期化処理呼び出し不正", vbOKOnly
    End If
    Unload dlgGTeikou
End Sub

Private Sub InitR2()
    Dim r1 As Double, r2 As Double
    Dim r As Double

    R2bMAX = 1
    dlgGTeikou.lblDisplay.Caption = dlgGTeikou.lblDisplay.Caption & "抵抗2つ "
    For r1 = 1 To 999
        If r1 Mod 100 = 0 Then  '↓途中経過表示
            dlgGTeikou.lblDisplay.Caption = dlgGTeikou.lblDisplay.Caption & "☆"
        End If
        DoEvents
        For r2 = r1 To 999
            r = r1 * r2 / (r1 + r2)
            If r = Int(r) Then
                R2Data(R2MAX, 0) = r1
                R2Data(R2MAX, 1) = r2
                R2Data(R2MAX, 2) = r
                R2MAX = R2MAX + 1
                If r1 < 100 And r2 < 100 Then
                    R2bData(R2bMAX, 0) = r1
                    R2bData(R2bMAX, 1) = r2
                    R2bData(R2bMAX, 2) = r
                    R2bMAX = R2bMAX + 1
                End If
            End If
        Next r2
    Next r1
    R2MAX = R2MAX - 1
    R2bMAX = R2bMAX - 1
    dlgGTeikou.lblDisplay.Caption = dlgGTeikou.lblDisplay.Caption & "終了" & vbCrLf
End Sub

Private Sub InitR3()
    Dim r1 As Double, r2 As Double, r3 As Double
    Dim r As Double

    R3MAX = 1
    dlgGTeikou.lblDisplay.Caption = dlgGTeikou.lblDisplay.Caption & "抵抗3つ "
    For r1 = 1 To 99
        If r1 Mod 10 = 0 Then   '↓途中経過表示
            dlgGTeikou.lblDisplay.Caption = dlgGTeikou.lblDisplay.Caption & "☆"
        End If
        For r2 = r1 To 99
        DoEvents
        For r3 = r2 To 99
            r = r1 * r2 / (r1 + r2)
            r = r * r3 / (r + r3)
            If r = Int(r) Then
                R3Data(R3MAX, 0) = r1
                R3Data(R3MAX, 1) = r2
                R3Data(R3MAX, 2) = r3
                R3Data(R3MAX, 3) = r
                R3MAX = R3MAX + 1
            End If
        Next r3
        Next r2
    Next r1
    R3MAX = R3MAX - 1
    dlgGTeikou.lblDisplay.Caption = dlgGTeikou.lblDisplay.Caption & "終了" & vbCrLf
End Sub

Private Sub InitR4()
    Dim r1 As Double, r2 As Double, r3 As Double, r4 As Double
    Dim r As Double

    R4MAX = 1
    dlgGTeikou.lblDisplay.Caption = dlgGTeikou.lblDisplay.Caption & "抵抗4つ "
    For r1 = 1 To 99
        If r1 Mod 5 = 0 Then    '↓途中経過表示
            dlgGTeikou.lblDisplay.Caption = dlgGTeikou.lblDisplay.Caption & "☆"
        End If
        For r2 = r1 To 99
        For r3 = r2 To 99
        DoEvents
        For r4 = r3 To 99
            r = r1 * r2 / (r1 + r2)
            r = r * r3 / (r + r3)
            r = r * r4 / (r + r4)
            If r = Int(r) Then
                R4Data(R4MAX, 0) = r1
                R4Data(R4MAX, 1) = r2
                R4Data(R4MAX, 2) = r3
                R4Data(R4MAX, 3) = r4
                R4Data(R4MAX, 4) = r
                R4MAX = R4MAX + 1
            End If
        Next r4
        Next r3
        Next r2
    Next r1
    R4MAX = R4MAX - 1
    dlgGTeikou.lblDisplay.Caption = dlgGTeikou.lblDisplay.Caption & "終了" & vbCrLf
End Sub

 R2MAXなど、RxMAXは合成抵抗値が整数になるセットの個数を記憶する。
 抵抗値1〜99Ωの範囲ですべての組み合わせについて合成抵抗を計算し、それが整数になる組み合わせを配列に記憶している。例えば抵抗3つの場合は配列R3Data(n, 0)=1つ目の抵抗、R3Data(n, 1)=2つ目の抵抗、R3Data(n, 2)=3つ目の抵抗、R3Data(n, 3)=合成抵抗値を記憶する。
 抵抗2つの場合は1〜999Ωの範囲は配列R2Data、1〜99Ωの範囲は配列R2bDataに記憶している。

 追加した途中経過表示用のダイアログ(dlgDisplay)にはプログラムはない。


 次に、InitUsageプロシージャを示す。

Private Sub InitUsage()
    USAGE = "=== 使い方 ===" & vbCrLf & vbCrLf
    USAGE = USAGE & "(1) 作成する問題の出題数を入力します。" & vbCrLf
    USAGE = USAGE & "  入力欄にキーボードから入力するか、横のアップダウンカウン" & vbCrLf
    USAGE = USAGE & "  タをクリックします。" & vbCrLf
    USAGE = USAGE & "  出題数が0の問題は作成されません。" & vbCrLf
    USAGE = USAGE & vbCrLf
    USAGE = USAGE & "(2) [作成開始]のボタンをクリックすると問題が表示されます。" & vbCrLf
    USAGE = USAGE & "  HTML化するには下の[HTML]のタブをクリックします。" & vbCrLf
    USAGE = USAGE & vbCrLf
    USAGE = USAGE & "(3) 保存するにはファイル名を入力して、[保存]のボタン" & vbCrLf
    USAGE = USAGE & "  をクリックします。" & vbCrLf
    USAGE = USAGE & "  表示されている問題データが保存されます。" & vbCrLf
    USAGE = USAGE & vbCrLf
    USAGE = USAGE & "・直列接続は抵抗値の範囲を3段階に選択できます。" & vbCrLf
    USAGE = USAGE & "・並列接続は合成値を整数または実数に限定できます。" & vbCrLf
    USAGE = USAGE & " 実数の場合は、小数以下のけた数を選択できます。" & vbCrLf
    USAGE = USAGE & " このとき、四捨五入で計算します。" & vbCrLf
End Sub


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

 

 

inserted by FC2 system