第5講 問題における数字の配置をいかにするか?
第4話 はじめる位置・飛び・ヒント数をシートから取得する!


 ①はじめる位置
 ②飛び
 ③ヒント数もシートから取得する
  のいずれもシートから取得する
  

  *シートに入力した数字が81と互いに素でないときは、
  飛びに指定されている数字は81と互いに素ではありませんと表示してプログラムを実行しない
  
の解答例
Dim w As Integer, tb As Integer, hnt As Integer, iz(80) As Byte, jz(80) As Byte
'wははじめる位置、tbは飛び、iz(80)とjz(80)はそれぞれy座標とx座標
Private Sub CommandButton1_Click()
  CommandButton2_Click
  w = Cells(4, 15)
  tb = Cells(5, 15)
  hnt = Cells(6, 15)
  hitaisyou '非対称に配置する場合の座標作りと表示
End Sub
Sub hitaisyou() '非対称に配置する場合の座標作りと表示
  Dim i As Integer, a As Integer
  For i = 2 To tb '81と互いに素になるtbを自動的に探す。
    If i * i > tb Then Exit For
    If (81 Mod i) = 0 Then
      If (tb Mod i) = 0 Then
        Cells(7, 12) = "飛びに入力されている値は81と互いに素ではありません。入力し直して再度問題作成ボタンを押してください。"
        Exit Sub
      End If
    End If
  Next
  For i = 0 To hnt - 1
    a = (w + tb * i) Mod 81 'aはセル(箱)番号を表す変数
    iz(i) = Int(a / 9)
    jz(i) = i Mod 9
    Cells(4 + iz(i), 2 + jz(i)) = "*"
  Next
End Sub
Private Sub CommandButton2_Click()
  Range("B4:J12").Select
  Selection.ClearContents
  Range("L7").Select
  Selection.ClearContents
  Cells(2, 1).Select
End Sub
参考ダウンロード添付ファイル


 ①はじめる位置は0以上80以下のランダムな数字とする
 ②飛びはシートから取得する
 ③ヒント数もシートから取得する
 はじめる位置はシートに表示する
 *シートに入力した数字が81と互いに素でないときは、
  飛びに指定されている数字は81と互いに素ではありませんと表示してプログラムを実行しない
の解答例
'wははじめる位置、tbは飛び、iz(80)とjz(80)はそれぞれy座標とx座標
Dim tb As Integer, hnt As Integer, iz(80) As Byte, jz(80) As Byte
Private Sub CommandButton1_Click()
  CommandButton2_Click
  tb = Cells(4, 15)
  hnt = Cells(5, 15)
  hitaisyou '非対称に配置する場合の座標作りと表示
End Sub
Sub hitaisyou() '非対称に配置する場合の座標作りと表示
  Dim i As Integer, a As Integer, w As Integer
  w = Int(81 * Rnd)
  For i = 2 To tb '81と互いに素になるtbを自動的に探す。
    If i * i > tb Then Exit For
    If (81 Mod i) = 0 Then
      If (tb Mod i) = 0 Then
        Cells(7, 12) = "飛びに入力されている値は81と互いに素ではありません。入力し直して再度問題作成ボタンを押してください。"
        Exit Sub
      End If
    End If
  Next
  For i = 0 To hnt - 1
    a = (w + tb * i) Mod 81 'aはセル(箱)番号を表す変数
    iz(i) = Int(a / 9)
    jz(i) = a Mod 9
    Cells(4 + iz(i), 2 + jz(i)) = "*"
  Next
End Sub
Private Sub CommandButton2_Click()
  Range("B4:J12").Select
  Selection.ClearContents
  Range("L7").Select
  Selection.ClearContents
  Cells(2, 1).Select
End Sub
参考ダウンロード添付ファイル

次の課題です。

 ①はじめる位置は0以上80以下のランダムな数字とする
 ②飛びも2以上78以下のランダムな数字とする
 ③ヒント数もシートから取得する
 ただし、②は81と互いに素でない場合が出てしまいますから、
 Do While文を永久ループにしておいて使い互いに素なときだけ、
 Do文を強制的に抜けるようにして問題を解消してください。

 Ⅰと同じ条件ですが、w + tb * iがあるために、すべての変数をInteger型にしてありますが、
 工夫してすべてByte型に戻してください。

Ⅱのヒントは
 (250 + 120 * 200) mod 7
 と
 ((250 mod 7)+ (120 mod 7) * (200 mod 7)) mod 7
 を計算してみてください。
 一般に
 (a + b) mod x=(a mod x) + (b mod x)
 (a * b) mod x=(a mod x) * (b mod x)
 という法則が成り立ちます。


第3話へ 第5話へ


トップへ