vb

Diff code posted
created at 18 Jun 09:14

Edit | Back
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
Public Class Form1

    Private Sub ButtonStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonStart.Click
        Dim stTime As DateTime  ' время начала работы алгоритма
        stTime = DateTime.Now
        ' в зависимости от выбранного алгоритма вызываем соотв функции
        Select Case BoxSelect.SelectedIndex
            Case 0 ' генерация М-последовательности
                If (StartMSeq()) Then ' если во входных параметрах ошибки, время вычисления не указываем
                    TextBoxTime.Text = getMsDiffTime(stTime).ToString
                End If
            Case 1 ' генерация простых чисел по буферному алгоритму
                Dim bufSeq As New BufSequence()
                RichTextBox.Text = startSeq(bufSeq) ' вычисляем и выводим результат
                TextBoxTime.Text = getMsDiffTime(stTime).ToString ' записываем время работы алгоритма
            Case 2 ' генерация простых чисел по собственному алгоритму
                Dim mySeq As New MySequence()
                RichTextBox.Text = startSeq(mySeq)
                TextBoxTime.Text = getMsDiffTime(stTime).ToString
        End Select
    End Sub

    ' вычисление М-последовательности
    Private Function StartMSeq() As Boolean
        Dim mSeq As New MSequence()
        Dim A() As Byte
        Dim M() As Byte
        Dim N As Integer
        ' если какой то из входных параметрв не задан, выходим с ошибкой
        If (TextBoxA.Text.Length = 0 Or TextBoxM.Text.Length = 0 Or TextBoxN.Text.Length = 0) Then
            MsgBox("Некорректные входные параметры")
            TextBoxTime.Text = ""
            Return False
        End If
        ' установили длинну для массива А и занесли исходные значения
        ReDim A(TextBoxA.Text.Length - 1)
        For i = 0 To TextBoxA.Text.Length - 1
            A(i) = Val(TextBoxA.Text.Chars(i))
        Next
        ' и для массива M
        ReDim M(TextBoxM.Text.Length - 1)
        For i = 0 To TextBoxM.Text.Length - 1
            M(i) = Val(TextBoxM.Text.Chars(i))
        Next
        ' получили N - размер генерируемой последовательности
        N = Val(TextBoxN.Text)
        ' вывели результат
        RichTextBox.Text = mSeq.Run(A, M, N)
        Return True
    End Function
    ' демонстрация полиморфизма. В зависимости от объекта вызывается тот или иной метод генерации простых чисел
    Private Function startSeq(ByVal privSeq As PrivSequence) As String
        Return privSeq.calculateSequence()
    End Function
    ' возвращает разницу между указанным и текущим периодом времени в мс
    Private Function getMsDiffTime(ByVal stTime As DateTime) As Integer
        Dim finTime As DateTime
        finTime = DateTime.Now
        If (finTime.Second > stTime.Second) Then
            Return (finTime.Second - stTime.Second) * 1000 + finTime.Millisecond
        Else
            Return finTime.Millisecond - stTime.Millisecond
        End If
    End Function
End Class


Модуль: seq_generate

Module seq_generate

    Public Class MSequence

        Public Function Run(ByVal A() As Byte, ByVal userM() As Byte, ByVal mCnt As Integer) As String
            Dim res As String = ""
            Dim M(mCnt) As Byte
            ' заносим первые цифры М-последовательности
            For i = 0 To userM.GetUpperBound(0)
                M(i) = userM(i)
                res += M(i).ToString
            Next
            ' продолжаем М-последовательност
            For i = userM.Length To M.GetUpperBound(0)
                M(i) = (A(0) * M(i - 1)) Xor (A(1) * M(i - 2)) Xor (A(2) * M(i - 3))
                res += M(i).ToString
            Next
            Return res
        End Function

    End Class

    'interface
    Public Interface PrivSequence
        Function calculateSequence() As String
    End Interface

    Public Class BufSequence
        Implements PrivSequence
        ' генерация простых чисел по буферному алгоритму (MIXAL)
        Public Function calculateSequence() As String Implements PrivSequence.calculateSequence
            Dim primers(5000) As Integer 'массив найденных простых чисел
            Dim primeNumber As Integer  ' простое число
            Dim privNumber As Integer ' частное от деления
            Dim divNumber As Integer    ' делитель
            Dim modNumber As Integer     ' остаток от деления
            primeNumber = 3
            modNumber = 0
            ' вычисление простых чисел
            For i = 0 To primers.GetUpperBound(0)
                primers(i) = primeNumber
                modNumber = 0
                While (modNumber = 0)
                    primeNumber += 2
                    divNumber = 2
Line1:
                    privNumber = primeNumber / divNumber
                    modNumber = primeNumber Mod divNumber
                End While
                If (privNumber > divNumber) Then
                    divNumber += 1
                    GoTo Line1
                End If
            Next
            ' обработка результата
            Dim res As String
            res = ""
            For j = 0 To primers.GetUpperBound(0)
                res += primers(j).ToString + " "
            Next
            Return res
        End Function

    End Class

    Public Class MySequence
        Implements PrivSequence
        ' генерация последовательных чисел по собственному алгоритму
        Public Function calculateSequence() As String Implements PrivSequence.calculateSequence
            Dim primers(5000) As Integer 'массив найденных простых чисел
            Dim primeNumber As Integer  ' простое число
            primeNumber = 3
            ' перебираем делители для каждого нечетного числа
            ' в случае, если это число простое - заносим в массив
            For i = 0 To primers.GetUpperBound(0)
                While (checkPrimeNumber(primeNumber) = False)
                    primeNumber += 2
                End While
                primers(i) = primeNumber
                primeNumber += 2
            Next
            ' обработка результата
            Dim res As String
            res = ""
            For j = 0 To primers.GetUpperBound(0)
                res += primers(j).ToString + " "
            Next
            Return res
        End Function
        ' проверить методом перебора, является ли число простым
        Private Function checkPrimeNumber(ByVal numb As Integer) As Boolean
            Dim modNumber As Integer
            Dim res As Boolean
            res = True
            For i = 2 To numb - 1
                modNumber = numb Mod i
                If (modNumber = 0) Then
                    res = False
                    Exit For
                End If
            Next
            Return res
        End Function

    End Class
End Module
 
6.76 KB in 5 ms with coderay