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