Алгоритм Луна для валидации кредитных карт - C (СИ)
Формулировка задачи:
Привет всем!
Нужна помощь!
Нужно запрограммировать алгоритм луна для валидации кредитных карт! Проф тип жестокий а я новичёк пока не врубаю
Вот код но не пойму в чём проблема!??
Листинг программы
- #define _CRT_SECURE_NO_WARNING
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- /*
- *
- */
- int main(int argc, char** argv) {
- int Min = 12;
- int Max = 20;
- int CS = 0;
- int flag = 0;
- int i;
- int c = 0;
- char null[] = "00000000000000000000";
- char CCN[] = "4111111111111111";
- //Start Prefix
- int number_of_lines_C, C_Prefix;
- int index_pointer = 99;
- int length_card = strlen[CCN];
- char Card_Buffer[] = " C[i][2]";
- char A[][20] = {
- {"Visa"},
- {"Master"},
- {"Amex"},
- {"Diners Club"},
- {"Discover"},
- {"JCB"},
- };
- int C[][4] = {
- //Cardprefix, digits, Prefixlength, Index in A[][]
- {41, 16, 2, 0},
- {41, 13, 2, 0},
- {51, 16, 2, 1},
- {52, 16, 2, 1},
- {53, 16, 2, 1},
- {54, 16, 2, 1},
- {34, 15, 2, 2},
- {37, 15, 2, 2},
- {36, 14, 2, 5},
- {38, 14, 2, 2},
- {6011, 16, 4, 3},
- {3, 16, 1, 4},
- {300, 14, 3, 5},
- };
- // Intervall between min and max
- if (length_Card >= Min && length_Card <= Max) {
- for (i = 0; i < length_Card; i++) {
- if (!(CCN[i] >= 48 && CCN[i] <= 57) {
- break;
- }
- }
- }
- null[20 = length_Card] = '\0';
- strcat(null, CCN);
- for (i = 19, i >= 0; i--) {
- if (i % 2 == 0) {
- CS = (null[i] - 48)*2;
- if (CS > 9) {
- CS = CS = 9;
- } else {
- CS = CS;
- }
- } else {
- CS = null[i] - 48;
- }
- c = c + CS;
- }
- c = c - 0;
- return (EXIT_SUCCESS);
- }
Решение задачи: «Алгоритм Луна для валидации кредитных карт»
textual
Листинг программы
- #include <stdio.h>
- int Luhn(const int* const cardNumber, const int const cardNumberLength)
- {
- int validationFlag = 0;
- int p = 0;
- int sum = 0;
- int i = 0;
- for (i = cardNumberLength - 1; i > -1; i--)
- {
- p = cardNumber[i];
- if ((i + 1) % 2 == 0)
- {
- p = p * 2;
- }
- if (p > 9)
- {
- p = p - 9;
- }
- sum = sum + p;
- }
- if (sum % 10 == 0)
- {
- validationFlag = 1;
- }
- return validationFlag;
- }
- int main(void)
- {
- int card[] = {4, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9};
- int res = Luhn(card, sizeof(card) / sizeof(*card));
- if (res)
- {
- printf("Card is valid\n");
- }
- else
- {
- printf("Card is invalid\n");
- }
- return 0;
- }
Объяснение кода листинга программы
- В функции
Luhn
определены следующие переменные:validationFlag
- флаг валидации карты (0 - невалидная, 1 - валидная)p
- текущая сумма картыsum
- общая сумма картыi
- индекс текущего числа в числе карты
- Переменная
validationFlag
инициализируется значением 0. - Переменная
sum
инициализируется значением 0. - В цикле
for
перебираются все числа в числе карты в обратном порядке. - Для каждого числа
p
проверяется, является ли оно четным (если(i + 1) % 2 == 0
). Если это так, то числоp
умножается на 2. - Если результат умножения числа
p
на 2 больше 9, то из результата вычитается 9. - Полученное число
p
добавляется кsum
. - После перебора всех чисел в числе карты проверяется, является ли
sum
кратной 10 (т.е.sum % 10 == 0
). Если это так, то переменнаяvalidationFlag
устанавливается равной 1. - Функция
Luhn
возвращает значение переменнойvalidationFlag
. - В функции
main
определен массивcard
с числами карты. - Функция
Luhn
вызывается с массивомcard
и его длиной в качестве аргументов. - Результат функции
Luhn
сохраняется в переменнойres
. - Если
res
равно 1, то выводится сообщениеCard is valid
. - Если
res
не равно 1, то выводится сообщениеCard is invalid
. - Программа возвращает 0, завершая свою работу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д