Проверка корректности РНН
#4
Отправлено 13.03.2004, 18:05:29
// ** глВалидностьРНН: Проверка РНН на корректность __________________________
//
// Параметры: Значение - значение проверяемого РНН
// Вызывается:
// Описание:
// Проверяется на корректность значение РНН
// Возвращаемое значение: 1 - значение корректно, 0 - иначе.
//
Функция глВалидностьРНН(Значение) Экспорт
Статус = 0;
//Проверка на длину РНН
Если СтрДлина(СокрЛП(Значение))<12 Тогда
Предупреждение("Количество знаков в РНН меньше 12!");
// проверка на одиниковость всех цифр
ИначеЕсли СтрЧислоВхождений(Значение, Лев(Значение,1))=12 Тогда
Предупреждение("Цифра " + Лев(Значение,1) + " повторяется 12 раз!");
// проверяем РНН на корректность
Иначе
// копируем первые 11 символов
ПодстрокаРНН11 = Лев(Значение,11);
// контрольная сумма РНН
КонтрольнаяСумма = Прав(Значение,1);
Для СчетчикЦикла1 = 1 По 10 Цикл
СуммаПроизведений = 0;
Вес = СчетчикЦикла1 - 1;
// Накапливаем сумму произведений
Для СчетчикЦикла2 = 1 По 11 Цикл
Вес = Вес + 1;
Если Вес = 11 Тогда
Вес = 1; //сбросили вес на единицу
КонецЕсли;
СуммаПроизведений = СуммаПроизведений + Вес * Число(Сред(ПодстрокаРНН11,СчетчикЦикла2,1));
КонецЦикла; //Для СчетчикЦикла2 = 1 По 11 Цикл
//Рассчитываем коэфиициент для проверка РНН
Коэффициент = СуммаПроизведений-Цел((СуммаПроизведений)/11)*11;
Если Коэффициент < 10 Тогда
Если Коэффициент = Число(КонтрольнаяСумма) Тогда // Проверка равенства полученного коэффициента Контрольной сумме
Статус = 1;
Прервать;
КонецЕсли;
КонецЕсли;//Если Коэффициент < 10 Тогда
КонецЦикла; //Для СчетчикЦикла1 = 1 По 10 Цикл
КонецЕсли;
Если Статус = 0 тогда
Предупреждение("Введенный РНН не корректен!");
Иначе
Предупреждение("Введенный РНН корректен!");
КонецЕсли;
Возврат Статус;
КонецФункции // глВалидностьРНН
#5
Отправлено 13.03.2004, 18:52:16
Получается:
function Check_RNN(rnn: string):boolean; var i, j, k, s, t: integer; begin for i:=1 to 10 do begin s:=0; t:=i-1; for j:=1 to 11 do begin inc(t); if t=11 then t:=1; s:=s+t*StrToInt(rnn[j]); end; k:=s mod 11; if k<10 then Break; end; Result:=(k=StrToInt(rnn[12])); end;Пасиб, вроде работает.
#9
Отправлено 13.01.2009, 10:27:20
Вышеуказанную функцию, я переделал для проверки РНН в Excel.
Function CheckRNN(RNN As String) As String Dim SubStrRNN11, ControlSum As String Dim i, j, Status As Integer Dim SumProizv, Ves, Koef As Long RNN = CStr(Trim(RNN)) Status = 0 'Проверка на длину РНН If Len(Trim(RNN)) = 12 Then ' копируем первые 11 символов SubStrRNN11 = Left(RNN, 11) ' контрольная сумма РНН ControlSum = Right(RNN, 1) For i = 1 To 10 SumProizv = 0 Ves = i - 1 ' Накапливаем сумму произведений For j = 1 To 11 Ves = Ves + 1 If Ves = 11 Then Ves = 1 'сбросили Ves на единицу End If SumProizv = SumProizv + Ves * CLng(Mid(SubStrRNN11, j, 1)) Next j 'for j = 1 to 11 'Рассчитываем коэфиициент for проверка РНН Koef = SumProizv - Fix((SumProizv) / 11) * 11 If Koef < 10 Then If Koef = CLng(ControlSum) Then ' Проверка равенства полученного коэффициента Контрольной сумме Status = 1 Exit For End If End If 'if Koef < 10 then Next i 'for i = 1 to 10 End If If Status = 0 Then CheckRNN = "!ERROR" Else CheckRNN = "!OK" End If End Function
Изначально не совсем корректно заменил одно значение, но сейчас все Ок.
Сообщение отредактировал ZeD: 13.01.2009, 11:37:15
#10
Отправлено 13.01.2009, 12:16:09
#14
Отправлено 07.02.2009, 14:50:08
А кто заделица алгоритмом СИК-а? Ток не DLL-кой, а именно алгоритмом
http://vse.kz/index....&...p=2753873
#17
Отправлено 19.11.2011, 14:08:06
По умолчанию, если правильно помню, под значение типа Boolean выделяется память в двойное слово (4 байта) - для 32 битных систем. Для 64 битных возможно 64 бита и выделяется - 4 слова или 8 байт, тогда в дебагере можно увидеть значения $0000000000000001 и $0000000000000000.
#18
Отправлено 16.01.2012, 01:06:18
true гарантированно разве равно единице? AFAIK это любое не нулевое значение.Если k = StrToInt(rnn[12]), result будет равен 1 ($00000001), иначе будет равен 0 ($00000000). В терминах паскаля result будет равен булевому значению true в случае равенства и false в случае неравенства.
По умолчанию, если правильно помню, под значение типа Boolean выделяется память в двойное слово (4 байта) - для 32 битных систем. Для 64 битных возможно 64 бита и выделяется - 4 слова или 8 байт, тогда в дебагере можно увидеть значения $0000000000000001 и $0000000000000000.
Кстати, привет Рюмка. Давно тебя не видел, чмоки, обнимашки и все такое.
#19
Отправлено 16.04.2012, 13:57:33
Рахмет просто огромный за то, что перевели на понятный язык.Нда... ну и язык .
Получается:function Check_RNN(rnn: string):boolean; var i, j, k, s, t: integer; begin for i:=1 to 10 do begin s:=0; t:=i-1; for j:=1 to 11 do begin inc(t); if t=11 then t:=1; s:=s+t*StrToInt(rnn[j]); end; k:=s mod 11; if k<10 then Break; end; Result:=(k=StrToInt(rnn[12])); end;Пасиб, вроде работает.
Количество пользователей, читающих эту тему: 1
пользователей: 0, неизвестных прохожих: 1, скрытых пользователей: 0