C++ verify creditcard via LUHN Formula (Loop & SumToken Error)

核能气质少年 提交于 2019-12-25 08:23:05

问题


I used to be coding with C#, I'm learning C++ at UOW currently. There's this assignment that im supposed to verify a credit card whether its valid via modulus 10 (LUHN formula) However I didn't manage to get the correct answer as displayed/required by the lecturer. The below are my C++ efforts for this assignment. Do advise, cheers.

Problem1 - Loop error / infinite Problem2 - sum of 4 tokens (Digits) I got are incorrect I believe. Problem3 - Any advice to improve on this coding (without changing too much) - just to make it more efficient.

#include <iostream>
using namespace std;

// Get Reverse of an int
int getReverse(int);

// Double 2nd and 4th digit
int newDigits (int);

// Sum Token up
int sumToken (int);

// Modulus 10 Verification
bool verifyToken (int);

int main()
{
    int card,card1, card2, card3, card4;
    int cardReverseD, cardReverseC, cardReverseB, cardReverseA;
    int reverseA, reverseB, reverseC, reverseD;
    int newNumber4, newNumber3, newNumber2, newNumber1;
    int sumToken4, sumToken3, sumToken2, sumToken1;
    int sumTokenFinal; // Used for data verification via modulus 10
    char again; // For loop

    cout << "Welcome to Marcus Moo Legal Licensed Money Lender Card Company" << endl;
    cout << endl;

    // Enter Credit Card Number
    do 
    {
    cout << "Enter credit card number: ";

    // Fourth (4th) Card Number
    cin >> card4;
    cin.ignore(1,'-');

    cardReverseD = getReverse(card4);

    newNumber4 = newDigits(cardReverseD); // new int after double 2nd and 4th digit
    sumToken4 = sumToken(newNumber4); // sum of token of sector 4

    // Third(3rd) Card Number
    cin >> card3;
    cin.ignore(1,'-');

    cardReverseC = getReverse(card3);

    newNumber3 = newDigits(cardReverseC); // new int after double 2nd and 4th digit
    sumToken3 = sumToken(newNumber3); // sum of token of sector 3      

    // Second(2nd) Card Number
    cin >> card2;
    cin.ignore(1,'-');

    cardReverseB = getReverse(card2);

    newNumber2 = newDigits(cardReverseB); // new int after double 2nd and 4th digit
    sumToken2 = sumToken(newNumber2); // sum of token of sector 2     

    // First(1st) Card Number
    cin >> card1;

    cardReverseA = getReverse(card1);

    newNumber1 = newDigits(cardReverseA); // new int after double 2nd and 4th digit
    sumToken1 = sumToken(newNumber1); // sum of token of sector 1    

    // Addition of 1-4 tokens NEW & Verification & COUT
    sumTokenFinal = sumToken1 + sumToken2 + sumToken3 + sumToken4; 

    cout << "The special sum is " << sumTokenFinal << endl;

    if (verifyToken(sumTokenFinal)==true)
    {
        cout << card1 << "-" << card2 << "-" << card3 << "-" << card4
        << " is a valid credit card number" << endl;
    }     
    else 
    {
        cout << card1 << "-" << card2 << "-" << card3 << "-" << card4
        << " is not a valid credit card number" << endl;
    }

    // Let loop go again?

    cout << endl;
    cout << "Another Card (y/Y/n/N): ";
    cin.get(again);
    cout << endl;
    cout << "------------------------------------------------" << endl;
    } while ((again='y')||(again='Y')&&(again!='n')&&(again!='N'));
}

// Get Reverse of an int
int getReverse(int x)
{
    int reverse=0;
    int lastDigit;
    while (x>0)
    {
        lastDigit = x%10;
        reverse = (reverse*10)+lastDigit;
        x = x/10;
    }
    return reverse;
}

// Double 2nd and 4th digit
int newDigits (int x)
{
    int newNumber, length;
    int secondDigit, fourthDigit;
    secondDigit = x%1000/100*2;
    fourthDigit = x%10*2; // Edited as per advised
    if ((secondDigit<10)&&(fourthDigit<10))
    {
        newNumber = (x%10000/1000*1000)+(secondDigit*100)+(x%100/10*10)+(fourthDigit);
    }
    else if ((secondDigit>10)&&(fourthDigit<10))
    {
        newNumber = (x%10000/1000*10000)+(secondDigit*100)+(x%100/10*10)+(fourthDigit);
    }
    else if ((secondDigit<10)&&(fourthDigit>10))
    {
        newNumber = (x%10000/1000*10000)+(secondDigit*1000)+(x%100/10*100)+(fourthDigit);
    }
    else if ((secondDigit>10)&&(fourthDigit>10))
    {
        newNumber = (x%10000/1000*100000)+(secondDigit*1000)+(x%100/10*100)+(fourthDigit);
    }

    return newNumber;
}

// Sum Token up
int sumToken (int x)
{
    int lastDigit;
    int sumDigits=0;
    while (x>0)
    {
        lastDigit = x % 10;
        sumDigits += lastDigit;
        x /= 10;
    }
    return sumDigits;
}

// Modulus 10 Verification
bool verifyToken (int x)
{
    bool verify = false;

    if (x%10==0)
    {
        verify = true;    
    }
    return verify;
}

来源:https://stackoverflow.com/questions/42144329/c-verify-creditcard-via-luhn-formula-loop-sumtoken-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!