#c# #arrays
#c# #массивы
Вопрос:
Я хотел бы написать следующую функцию C # в ColdFusion, но я не могу, потому что я не могу понять код. Я знаю, что функция проверяет достоверность 11-значного номера CPF (бразильский эквивалент SSN США) с помощью операции mod. У меня нет абсолютно никакого опыта работы с C #.
Полную функцию можно прочитать в этой статье.
Я не понимаю, откуда взялись cpf[0]
, cpf[1]
и т.д. и к чему относится число в квадратных скобках.
//compute 1st verification digit.
var v1 = 10 * cpf[0] 9 * cpf[1] 8 * cpf[2] 7 * cpf[3] 6 *
cpf[4] 5 * cpf[5] 4 * cpf[6] 3 * cpf[7] 2 * cpf[8];
v1 = 11 - v1 % 11;
if (v1 >= 10)
v1 = 0;
//compute 2nd verification digit.
var v2 = 11 * cpf[0] 10 * cpf[1] 9 * cpf[2] 8 * cpf[3] 7 *
cpf[4] 6 * cpf[5] 5 * cpf[6] 4 * cpf[7] 3 * cpf[8];
v2 = 2 * v1;
v2 = 11 - v2 % 11;
if (v2 >= 10)
v2 = 0;
//True if verification digits are as expected.
return v1 == cpf[9] amp;amp; v2 == cpf[10];
Комментарии:
1. Это большая математика, но я не вижу в этом ничего особенно сложного с точки зрения программирования. Какую конкретно часть вы не понимаете?
2. Итак, в чем именно заключается вопрос? Существуют ли конкретные операторы, которые вы не понимаете?
3. @delnan, я не уверен, что происходит с v1 и v2, и откуда они берутся. Я также не уверен, к чему относятся cpf [0], cpf[1] и т.д….
4.
v1
abdv2
объявлены в коде, который вы опубликовали, что вы имеете в виду, откуда они берутся?5. @Lucero, я только что обновил свой вопрос. Смотрите также мой комментарий выше.
Ответ №1:
Учитывая следующий CPF 012.345.678-90
//compute 1st verification digit.
var v1 = 10 * cpf[0] // 10 x 0 = 0
9 * cpf[1] // 9 x 1 = 9
8 * cpf[2] // 8 x 2 = 16
7 * cpf[3] // 7 x 3 = 21
6 * cpf[4] // 6 x 4 = 24
5 * cpf[5] // 5 x 5 = 25
4 * cpf[6] // 4 x 6 = 24
3 * cpf[7] // 3 x 7 = 21
2 * cpf[8] // 2 x 8 = 16
; // result = 156
v1 = 11 - v1 % 11; // 11 - 156 % 11 = 11 - 2 = 9
if (v1 >= 10)
v1 = 0; // 9 >= 10 ? v1 = 9
//compute 2nd verification digit.
var v2 = 11 * cpf[0] // 11 x 0 = 0
10 * cpf[1] // 10 x 1 = 10
9 * cpf[2] // 9 x 2 = 18
8 * cpf[3] // 8 x 3 = 24
7 * cpf[4] // 7 x 4 = 28
6 * cpf[5] // 6 x 5 = 30
5 * cpf[6] // 5 x 6 = 30
4 * cpf[7] // 4 x 7 = 28
3 * cpf[8] // 3 x 8 = 24
;
v2 = 2 * v1; // 192 2 * 9 = 192 18 = 210
v2 = 11 - v2 % 11; // 11 - 210 % 11 = 11 - 1 = 10
if (v2 >= 10)
v2 = 0; // 10 >= 10 ? v2 = 0
//True if verification digits are as expected.
// v1 == 9 amp;amp; v2 == 0
return v1 == cpf[9] amp;amp; v2 == cpf[10];
Это просто сводится к чистой математике
Ответ №2:
cpf[0]
to cpf[10]
предположительно являются 11 цифрами номера CPF. Предположительно, это состоит из 9 цифр «реальных» данных и 2 цифр контрольной суммы. Предположительно, эти 2 цифры вычисляются как линейная комбинация других 9 цифр в арифметике по модулю 11.
Итак, эта функция пересчитывает контрольную сумму ( v1
и v2
), а затем проверяет ее соответствие полученным цифрам контрольной суммы ( cpf[9]
и cpf[10]
).
Эти соотношения контрольных сумм обычно предназначены для предотвращения неправильного ввода цифр или случайной замены соседних цифр (аналогичные схемы используются, например, для ISBN).
Комментарии:
1. итак, в принципе, v1 = 10 * cpf [0] — это все равно, что произнести 10 * первую цифру номера cpf?
Ответ №3:
Это просто применение алгоритма проверки чисел. cpf — это 11-значное число, которое вы проверяете.
В коде нет ничего сложного и специфичного для C #.
Ответ №4:
Статья, на которую вы ссылаетесь, похоже, показывает только часть исходного кода c #. Судя по псевдокоду в предыдущем разделе, cpf
это просто массив из 11 целых чисел.
РЕДАКТИРОВАТЬ: в Google есть несколько примеров кода на разных языках.
ColdFusion:http://www.adobe.com/cfusion/exchange/index.cfm?event=extensionDetailamp;loc=en_usamp;extid=1000248
VB: http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=3811amp;lngWId=10
Они выглядят более полными и, возможно, вам будет проще их понять.
Ответ №5:
Похоже, что cpf
это массив целых чисел, состоящий из 11 элементов.
Доступ к каждому из них осуществляется по индексу, поэтому первый — cpf[0]
, второй cpf[1]
и т.д…
v1
и v2
объявляются в функции и присваиваются значения вычислений.
Последняя строка сравнивает эти вычисленные значения с двумя последними элементами массива в cpf
, предположительно контрольными цифрами.
В целом этот код выглядит так, как будто он выполняет вычисление для числа CPF и проверяет, является ли CPF допустимым.
Ответ №6:
Уравнение по сути представляет собой очень простую хэш-функцию, которая приводит к двум «контрольным цифрам».
Этот «хэш» контрольной цифры может использоваться для проверки достоверности 9-значного числа, к которому добавляются контрольные цифры, во многом таким же образом, как хэши MD5 и SHA1 могут быть связаны с файлами и использоваться для проверки того, что были переданы правильные данные или что не было подделки до, во время или после передачи.
Математика в этом случае несколько проста и произвольна, но каждый раз будет давать один и тот же ответ для одного и того же ввода. Вы могли бы изменять уравнения многими различными способами и в конечном итоге получать допустимые контрольные цифры, при условии, что каждый раз используются одни и те же уравнения.
Комментарии:
1. Действительно, вы могли бы. Однако эти конкретные уравнения будут выбраны так, чтобы обладать хорошими свойствами (предположительно, предотвращающими случайную замену соседних цифр, например).
2. @Oli: Возможно, но я заметил, что последним шагом вычисления каждой контрольной цифры был результат модуля, вычитаемый из константы… Это заставляет меня думать, что уравнения довольно гибкие.
Ответ №7:
Это алгоритм для определения достоверности числа. Кредитные карты используют аналогичный алгоритм (Luhn). Идея состоит в том, чтобы предотвратить некоторые перестановки набора всех комбинаций как способ предотвращения мошенничества и разрешить проверку и ранний отказ: «может ли это быть допустимым числом для этого?»
Используя этот метод, вы можете определить, находится ли число в допустимом формате, если это так, вы можете попробовать использовать его. Если нет, вы не должны, поскольку это явно не допустимо.
Смотрите эту ссылку о номерах кредитных карт для чего-то подобного:http://www.merriampark.com/anatomycc.htm
Кроме того, «A [N]» означает «N-й элемент A, где A — массив из некоторых элементов». cpf представляется массивом целых чисел.