powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Разобраться бы в простой функции?
9 сообщений из 9, страница 1 из 1
Разобраться бы в простой функции?
    #35475957
Михайло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!
Есть такая написанная кем-то функция которая проверяет правильность номеров вагонов.
Код: plaintext
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.
Public Function RTCNoCh(No As String) As String
Dim ErrorFunc As Boolean
Dim i As Integer
Dim teststr, CtrlStr, TmpStr As String
Dim a, Sum As Double


ErrorFunc = False

    If Len(No) =  0  Then
        result = False
        Exit Function
    End If
    
    If Len(No) <>  8  Then
        ErrorFunc = True
    End If
    
    For i =  1  To Len(No)
            If (Mid(No, i,  1 ) < "0") Or (Mid(No, i,  1 ) > "9") Then
                ErrorFunc = True
                Exit For
            End If
    Next i
    
    If Not ErrorFunc Then
      'Проверка контрольной цифры 
        teststr = Mid(No,  1 , Len(No) -  1 )
        CtrlStr = Mid(No, Len(No),  1 )
        Sum =  0 
        
        For i =  1  To Len(teststr)
            a = Int(Mid(No, i,  1 )) * ((i Mod  2 ) +  1 )
            TmpStr = a
            
            If Len(TmpStr) >  1  Then
                Sum = Sum + CInt(Mid(TmpStr,  1 ,  1 )) + CInt(Mid(TmpStr,  2 ,  1 ))
            Else
                Sum = Sum + CInt(TmpStr)
            End If
        Next i
        
        If (Sum Mod  10 ) =  0  Then
            ErrorFunc = ErrorFunc Or (CtrlStr <> "0")
        Else
            a = (Sum \  10 ) *  10  +  10 
            ErrorFunc = ErrorFunc Or (CInt(CtrlStr) <> Abs(a - Sum))
        End If
    End If
    
    If ErrorFunc Then
        RTCNoCh = "Err in RTC No"
    Else
        RTCNoCh = ""
    End If
    
End Function
Не могу разобраться, как она делает проверку контрольной суммы.
И вообще, разве может быть оператор «Or» вне условия, как здесь
Код: plaintext
1.
ErrorFunc = ErrorFunc Or (CInt(CtrlStr) <> Abs(a - Sum))
Как это можно понять?
...
Рейтинг: 0 / 0
Разобраться бы в простой функции?
    #35476104
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для того, чтобы разобраться, нужно сначала узнать, какой номер вагона считается правильным.
авторКак это можно понять?Or в данном случае является логическим оператором. ErrorFunc = True если она уже True или CInt(CtrlStr) <> Abs(a - Sum).
...
Рейтинг: 0 / 0
Разобраться бы в простой функции?
    #35476187
Михайло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это правильные номера:
75046938
74153479
74265141
73220873
74065723
74075565


Or в данном случае является логическим оператором. ErrorFunc = True если она уже True или CInt(CtrlStr) <> Abs(a - Sum).

То есть, если CInt(CtrlStr) <> Abs(a - Sum) = TRUE то если ErrorFunc = False, сделай ErrorFunc = True?
...
Рейтинг: 0 / 0
Разобраться бы в простой функции?
    #35476468
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Михайло
> Это правильные номера:
> 75046938
> 74153479
> 74265141
> 73220873
> 74065723
> 74075565
>

А никто не может тебе рассказать алгоритм ручной проверки правильности номера?
Так будет быстрее и понятнее для тебя.

>
>
> Or в данном случае является логическим оператором. ErrorFunc = True если она
> уже True или CInt(CtrlStr) <> Abs(a - Sum).
>
>
> То есть, если CInt(CtrlStr) <> Abs(a - Sum) = TRUE то если ErrorFunc = False,
> сделай ErrorFunc = True?


да.
1 + 2 = 3 . Это число можно присвоить числовой переменной
точно так-же:
True Or False = True . Это булевское значение можно присвоить переменной типа Boolean. Что
и делается в коде.

--
С уважением Горбонос Игорь Леонидович

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Разобраться бы в простой функции?
    #35476550
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЭто правильные номера:А неправильные? Принцип-то какой?

Вот это
Код: plaintext
1.
2.
3.
4.
5.
    For i =  1  To Len(No)
            If (Mid(No, i,  1 ) < "0") Or (Mid(No, i,  1 ) > "9") Then
                ErrorFunc = True
                Exit For
            End If
    Next i
Можно заменить одной строкой: ErrorFunc = No Not Like "[0-9]*"
...
Рейтинг: 0 / 0
Разобраться бы в простой функции?
    #35476668
Михайло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА неправильные? Принцип-то какой?
вот это я и хочу понять
...
Рейтинг: 0 / 0
Разобраться бы в простой функции?
    #35476673
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или даже все это
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    If Len(No) =  0  Then
        result = False
        Exit Function
    End If
    
    If Len(No) <>  8  Then
        ErrorFunc = True
    End If
    
    For i =  1  To Len(No)
            If (Mid(No, i,  1 ) < "0") Or (Mid(No, i,  1 ) > "9") Then
                ErrorFunc = True
                Exit For
            End If
    Next i
на
Код: plaintext
ErrorFunc = No Not Like "########"
...
Рейтинг: 0 / 0
Разобраться бы в простой функции?
    #35476686
Михайло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМожно заменить одной строкой: ErrorFunc = No Not Like "[0-9]*"
это как это? Это же не SQL, это VB script?
...
Рейтинг: 0 / 0
Разобраться бы в простой функции?
    #35476783
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторэто как это? Это же не SQL, это VB script?Во-первых, это не VBScript, а VB6, а во-вторых, почему ты решил, что какой-то язык может застолбить за собой право на название оператора? Просто эту функцию писал неуч, который даже не знает, что в объявлении Dim x, y, z As Integer интежером будет только z.
Кстати я там ошибся, Not рядом с Like находиться не может.

Короче, функция должна выглядеть так:
Код: plaintext
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.
Public Function RTCNoCh(No As String) As String
Dim ErrorFunc As Boolean
Dim i As Integer
Dim CtrlSum As Integer, TmpStr As String
Dim Sum As Double
    ErrorFunc = Not No Like "########"
    If Not ErrorFunc Then
        'Ïðîâåðêà êîíòðîëüíîé öèôðû
        CtrlSum = CInt(Mid(No, Len(No),  1 ))
        For i =  1  To Len(No) -  1 
            TmpStr = CStr(CInt(Mid(No, i,  1 )) * ((i Mod  2 ) +  1 )) 'нечетные цифры умножаются на два
            If Len(TmpStr) >  1  Then
                Sum = Sum + CInt(Mid(TmpStr,  1 ,  1 )) + CInt(Mid(TmpStr,  2 ,  1 )) 'если число > 9, составные цифры складываются
            Else
                Sum = Sum + CInt(TmpStr)
            End If
            'и вся эта хрень суммируется
        Next i
        If (Sum Mod  10 ) =  0  Then 'проверка делимости на 10 без остатка
            ErrorFunc = CtrlSum <>  0  'если делится и контрольная цифра 0 — все ок
        Else
            i = (Sum \  10 ) *  10  +  10 
            ErrorFunc = CtrlSum <> Abs(i - Sum)
        End If
    End If
    If ErrorFunc Then
        RTCNoCh = "Err in RTC No"
    Else
        RTCNoCh = ""
    End If
End Function
авторвот это я и хочу понятьПервые 7 цифр — произвольные, последняя — контрольная. Контрольная вычисляется в цикле. Почему поток сознания автора родил именно такой алгоритм, спрашивай у него.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Разобраться бы в простой функции?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]