Моя программа должна попросить пользователя ввести номер своей кредитной карты, а затем отобразить, являются ли номера действительными или недействительными, и если они действительны, отобразите тип карты. У меня возникли проблемы с попыткой прочитать первые 2 символа в строке cardNumber, чтобы узнать, является ли тип карты визой, mastercard, american express или Discover (4 для визы, 5 для mastercard, 37 для american express, 6 для обнаружить)
#include <iostream>
#include <string>
using namespace std;
int main()
{
string cardNumber; //this will carry the number given by the user.
int sum(0), sumOfDoubleEven(0), sumOfOdd(0), evenDigit(0), oddDigit(0);
cout << "This program is the Credit Card Number Validator." << endl;
cout << "This program will check the validity status of your card number" << endl;
//Main loop
do
{
cout << endl << "Please provide a number to validate or type 'n' to quit ";
cin >> cardNumber; //gets cardNumber from user
if(cardNumber.length()>=13 && cardNumber.length()>=16)
{
if (cardNumber == "n") break; //exits loop on user request
//this for loop repeats once for each digit of the cardNumber.
//digitPosition decrements by one on each pass from last position to first position
for (int digitPosition=cardNumber.length(); digitPosition>0; digitPosition--)
{
if (digitPosition%2 == 0)
{ //executes the following code if digitPosition is even
oddDigit=(int)cardNumber[digitPosition-1]-'0';
sumOfOdd=sumOfOdd+oddDigit;
} else { //executes the following code if digitPosition is odd.
evenDigit=((int)cardNumber[digitPosition-1]-'0')*2;
evenDigit=evenDigit%10+evenDigit/10;
sumOfDoubleEven=sumOfDoubleEven + evenDigit;
}
}
sum=sumOfOdd+sumOfDoubleEven; //sums the result
cout << endl <<"The number "<<cardNumber<<" you provided is ";
if (sum%10==0) //executes if sum is divisible by 10
cout << "valid" << endl;
else //executes if sum is not divisible by 10
cout << "invalid" << endl;
if(cardNumber.at(0)==4) {
cout<<"Your Card type is VISA"<<endl;
} else {
cout<<"Sorry, you've entered a card number not in the range of 13-16 digits" <<endl;
}
}
}while (cardNumber != "n");
return 0;
}
В коде есть некоторые нечетные части, но проблема в том, что вы проверяете первую цифру на число, а ваша цифра хранится в строке. Поэтому тест должен быть, if (cardNumber.at(0) == '4')...
Одна из ваших проблем состоит в том, что вы получаете первый символ (в позиции 0
) и сравниваете его с int
. Значение символа, а целое число - это значение, которое имеет символ в текущей кодировке. Например, в кодировке ASCII (которая является наиболее распространенной) символ '4'
имеет значение 52
.
Поэтому, почему сопоставление cardNumber.at(0)==4
будет выполнено, поскольку 4
не равно '4'
.
if (cardNumber[0] == '4') {
// VISA
} else if (cardNumber[0] == '5') {
// mastercard
} else if (cardNumber[0] == '6') {
// discover
} else if (cardNumber[0] == '3' && cardNumber[1] == '7') {
// American Express
} else {
// Invalid card type
}
Кстати, условие проверки длины номера вашей карточки не то, что вы ожидаете, это должно быть
if (cardNumber.length() >= 13 && cardNumber.length() <= 16) {...}
cardNumber.length()>=13 && cardNumber.length()>=16
. Если длина равна или больше 16, то она также определенно равна или больше 13.