Advertisement
Donald_Fortier

6.37 Credit Card Number Validation

May 27th, 2015
289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.31 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <cmath>
  4.      
  5. using namespace std;
  6.      
  7. bool startsWith(const string& cardNumber, const string& substr)
  8. {
  9. //cout << "startsWith recieved cardNumber: " << cardNumber << " and substr: " << substr << endl;
  10.         bool valid = true;
  11.         int c = 0;
  12.      
  13.         while (c < int(substr.length()))
  14.         {
  15. //cout << "Loop where c = " << c << " < " << int(substr.length()) << " compares cardNumber.at(c) " << cardNumber.at(c) << " and substr.at(c) " << substr.at(c) << endl;
  16.                 if(cardNumber.at(c) != substr.at(c)){
  17.                     valid = false;
  18.                     break;
  19.                 }
  20.                 else
  21.                     c++;
  22.         }
  23. //cout << "startsWith is returning (0|1 for false|true): " << valid << endl;
  24.         return valid;
  25. }
  26.      
  27. int getDigit(int number)
  28. {
  29. //cout << "getDigit recieved number: " << number  << endl;
  30.         number = (number % 10) + (number / 10);
  31.      
  32. //cout << "getDigit is returning: " << number  << endl;
  33.         return number;
  34. }
  35.      
  36. int sumOfDoubleEvenPlace(const string& cardNumber)
  37. {
  38. //cout << "sumOfDoubleEvenPlace recieved cardNumber: " << cardNumber << endl;
  39.     int sumOfEven = 0;
  40. //cout << "sumOfEven is initialized as " << sumOfEven << endl;
  41. //cout << "attempting to initialize for loop with first index of " << (cardNumber.length()-(cardNumber.length()%2))-1 << endl;
  42.     for(int i=(cardNumber.length()-(cardNumber.length()%2))-2; i >= 0; i -= 2)
  43.     {
  44.         int doubledCardNumber = int(cardNumber.at(i)-'0');
  45.         doubledCardNumber *= 2;
  46.         sumOfEven += getDigit(doubledCardNumber);
  47. //cout << "sumOfEven is " << sumOfEven << " += cardNumber.at(i) " << cardNumber.at(i) << " *2 = " << doubledCardNumber << " processed with getDigit()" << endl;
  48.     }
  49. //cout << "sumOfDoubleEvenPlace is returning: " << sumOfEven << endl;
  50.         return sumOfEven;
  51. }
  52.      
  53. int sumOfOddPlace(const string& cardNumber)
  54. {
  55. //cout << "sumOfOddPlace recieved cardNumber: " << cardNumber << endl;
  56.     int sumOfOdd = 0;
  57.     for(int i=cardNumber.length()+(-1+cardNumber.length()%2); i >= 0; i -= 2)
  58.     {
  59. //cout << "sumOfOdd is " << sumOfOdd << " plus cardNumber.at(i) " << cardNumber.at(i) << endl;
  60.         sumOfOdd += int(cardNumber.at(i)-'0');
  61.     }
  62. //cout << "sumOfOddPlace is returning: " << sumOfOdd << endl;
  63.         return sumOfOdd;
  64. }
  65.      
  66. bool isValid(const string& cardNumber)
  67. {
  68. //cout << "isValid recieved cardNumber: " << cardNumber << endl;
  69.     bool valid = false;
  70. //cout << "The length of your input is " << cardNumber.length() << endl;
  71.     int sum = (sumOfOddPlace(cardNumber) + sumOfDoubleEvenPlace(cardNumber)) %10;
  72. //cout << "Sum % 10 is " << sum << endl;
  73.     if((cardNumber.length() >= 13 && cardNumber.length() <= 16) &&
  74.         sum == 0 &&
  75.         (startsWith(cardNumber, "37") || startsWith(cardNumber, "4") ||
  76.         startsWith(cardNumber, "5") || startsWith(cardNumber, "6")))
  77.     {
  78.         valid = true;
  79.     }
  80. //cout << "isValid is returning (0|1 for false|true): " << valid << endl;
  81.         return valid;
  82. }
  83. // The main function that uses the other functions to determine whether the card is valid or not
  84. void main()
  85. {
  86.         cout << "Enter a credit card number: ";
  87.         string cardNumber;
  88.         cin >> cardNumber;
  89.      
  90.         if(isValid(cardNumber))
  91.                 cout << "The credit card number is valid" << endl;
  92.         else
  93.                 cout << "The credit card number is invalid" << endl;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement