Проверка карт на валидность. Алгоритм Луна. Си - C (СИ)
Формулировка задачи:
Доброго времени суток, дамы и господа! Может-ли кто-нибудь подсказать в какую сторону мне копать? Я новичок.
И так, задание. Реализовать проверку валидности карт по вводу 15-16-ти значного номера за алгоритмом луна для AMEX, MasterCard и Visa. Т.е. пользователь вводит номер, а ему пишут чья это карта и валидна-ли она за этим алгоритмом.
В обшем, т.к. я новичок, то я просто не знаю с чего мне начать. Подскажите, а?
Решение задачи: «Проверка карт на валидность. Алгоритм Луна. Си»
textual
Листинг программы
- #include <stdio.h>
- enum CardType
- {
- type_master_card,
- type_visa,
- type_american_express,
- type_other
- };
- static char* EmitentNames[] = {"Master Card", "VISA", "American Express", "Other"};
- int GetFirstTwoDigits(const int* const cardNumber)
- {
- return (cardNumber[0] * 10 + cardNumber[1]);
- }
- enum CardType GetCardType(const int* const cardNumber)
- {
- enum CardType type;
- int firstTwoDigits = GetFirstTwoDigits(cardNumber);
- if ((firstTwoDigits >= 51) && (firstTwoDigits <= 55)) type = type_master_card;
- else if (firstTwoDigits / 10 == 4) type = type_visa;
- else if ((firstTwoDigits == 34) || (firstTwoDigits == 37)) type = type_american_express;
- else type = type_other;
- return type;
- }
- int Luhn(const int* const cardNumber, const int 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;
- }
- void VerifyCard(const int* const cardNumber, const int cardNumberLength)
- {
- if (Luhn(cardNumber, cardNumberLength))
- printf("This is a VALID credit card. Emitent: %s\n", EmitentNames[GetCardType(cardNumber)]);
- else
- printf("This card is INVALID!\n");
- }
- int main(void)
- {
- int card[] = {3, 7, 8, 7, 3, 4, 4, 9, 3, 6, 7, 1, 0, 0, 0};
- VerifyCard(card, sizeof(card)/ sizeof(*card));
- return 0;
- }
Объяснение кода листинга программы
- В начале кода объявляется перечисление
CardType
, описывающее типы карт:type_master_card
,type_visa
,type_american_express
,type_other
. - Далее объявляется массив
EmitentNames
, содержащий названия эмитентов карт. - Затем определены две функции:
GetFirstTwoDigits
, принимающая первые две цифры карты и возвращающая их сумму, иGetCardType
, определяющая тип карты на основе первых двух цифр. - Далее определена функция
Luhn
, выполняющая проверку на валидность карты по алгоритму Луна. Она принимает номер карты и длину карты в качестве параметров. - В функции
VerifyCard
проверяется, является ли карта валидной, с помощью функцииLuhn
. Если карта валидна, выводится сообщение об этом с указанием эмитента. - В функции
main
определен массивcard
, содержащий номер карты, и вызывается функцияVerifyCard
для проверки этого номера. - В конце программы возвращается 0, заканчивая работу программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д