Алгоритм Луна для валидации кредитных карт - 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, завершая свою работу.