Можете ли вы помочь мне понять эту функцию C #?

#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 abd v2 объявлены в коде, который вы опубликовали, что вы имеете в виду, откуда они берутся?

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 представляется массивом целых чисел.