Проверка кредитной карты на C ++ с помощью формулы LUHN (ошибка цикла и ошибки SumToken)

Раньше я программировал на C #, сейчас я изучаю C ++ на UOW.
Есть это назначение, которое я должен проверить кредитную карту, действительна ли она по модулю 10 (формула LUHN)
Однако мне не удалось получить правильный ответ, отображаемый / требуемый лектором.
Ниже приведены мои усилия на C ++ для этого задания. Посоветуйте, ура.

Проблема1 — Ошибка цикла / бесконечна
Проблема 2 — я считаю неверной сумму 4 токенов (цифр), которые я получил.
Задача 3 — Любой совет по улучшению этого кодирования (без особых изменений) — просто для того, чтобы сделать его более эффективным.

#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;
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]