Проверка карт на валидность. Алгоритм Луна. Си - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток, дамы и господа! Может-ли кто-нибудь подсказать в какую сторону мне копать? Я новичок. И так, задание. Реализовать проверку валидности карт по вводу 15-16-ти значного номера за алгоритмом луна для AMEX, MasterCard и Visa. Т.е. пользователь вводит номер, а ему пишут чья это карта и валидна-ли она за этим алгоритмом. В обшем, т.к. я новичок, то я просто не знаю с чего мне начать. Подскажите, а?

Решение задачи: «Проверка карт на валидность. Алгоритм Луна. Си»

textual
Листинг программы
  1. #include <stdio.h>
  2.  
  3. enum CardType
  4. {
  5.   type_master_card,
  6.   type_visa,
  7.   type_american_express,
  8.   type_other
  9. };
  10.  
  11. static char* EmitentNames[] = {"Master Card", "VISA", "American Express", "Other"};
  12.  
  13. int GetFirstTwoDigits(const int* const cardNumber)
  14. {
  15.   return (cardNumber[0] * 10 + cardNumber[1]);
  16. }
  17.  
  18. enum CardType GetCardType(const int* const cardNumber)
  19. {
  20.   enum CardType type;
  21.  
  22.   int firstTwoDigits = GetFirstTwoDigits(cardNumber);
  23.  
  24.   if ((firstTwoDigits >= 51) && (firstTwoDigits <= 55))       type = type_master_card;
  25.   else if (firstTwoDigits / 10 == 4)                          type = type_visa;
  26.   else if ((firstTwoDigits == 34) || (firstTwoDigits == 37))  type = type_american_express;
  27.   else                                                        type = type_other;
  28.  
  29.   return type;
  30. }
  31.  
  32. int Luhn(const int* const cardNumber, const int cardNumberLength)
  33. {
  34.   int validationFlag = 0;
  35.   int p = 0;
  36.   int sum = 0;
  37.   int i = 0;
  38.  
  39.   for (i = cardNumberLength - 1; i > -1; i--)
  40.   {
  41.     p = cardNumber[i];
  42.  
  43.     if ((i + 1) % 2 == 0) p = p * 2;
  44.  
  45.     if (p > 9) p = p - 9;
  46.  
  47.     sum = sum + p;
  48.   }
  49.  
  50.   if (sum % 10 == 0) validationFlag = 1;
  51.  
  52.   return validationFlag;
  53. }
  54.  
  55. void VerifyCard(const int* const cardNumber, const int cardNumberLength)
  56. {
  57.   if (Luhn(cardNumber, cardNumberLength))
  58.     printf("This is a VALID credit card. Emitent: %s\n", EmitentNames[GetCardType(cardNumber)]);
  59.   else
  60.     printf("This card is INVALID!\n");
  61. }
  62.  
  63. int main(void)
  64. {
  65.   int card[] = {3, 7, 8, 7, 3, 4, 4, 9, 3, 6, 7, 1, 0, 0, 0};
  66.  
  67.   VerifyCard(card, sizeof(card)/ sizeof(*card));
  68.  
  69.   return 0;
  70. }

Объяснение кода листинга программы

  1. В начале кода объявляется перечисление CardType, описывающее типы карт: type_master_card, type_visa, type_american_express, type_other.
  2. Далее объявляется массив EmitentNames, содержащий названия эмитентов карт.
  3. Затем определены две функции: GetFirstTwoDigits, принимающая первые две цифры карты и возвращающая их сумму, и GetCardType, определяющая тип карты на основе первых двух цифр.
  4. Далее определена функция Luhn, выполняющая проверку на валидность карты по алгоритму Луна. Она принимает номер карты и длину карты в качестве параметров.
  5. В функции VerifyCard проверяется, является ли карта валидной, с помощью функции Luhn. Если карта валидна, выводится сообщение об этом с указанием эмитента.
  6. В функции main определен массив card, содержащий номер карты, и вызывается функция VerifyCard для проверки этого номера.
  7. В конце программы возвращается 0, заканчивая работу программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.667 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы