2014-07-24 4 views
0

내 프로그램에서 사용자에게 신용 카드 번호를 입력 한 다음 해당 번호가 유효한지 유효하지 않은지 여부를 표시하고 유효한 경우 카드 유형을 표시하도록되어 있습니다. 카드 종류가 비자, 마스터 카드, 아메리칸 익스프레스인지 발견 (비자 4 건, 마스터 카드 5 건, 아메리칸 익스프레스 37 건, 북미 카드 6 건)인지 알아보기 위해 cardNumber 문자열의 처음 2자를 읽는 데 문제가 있습니다. 디스) 문제의문자열에서 문자를 읽는 데 도움이 필요합니다.

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

프로 팁 : 당신은 당신이 그것을 제대로 포맷하면보다 쉽게 ​​코드를 디버깅을 찾을 수 있습니다 . –

+2

'cardNumber.length()> = 13 && cardNumber.length()> = 16' 조건에 관해서. 길이가 16보다 크거나 같으면 가장 명확하게 13보다 크거나 같습니다. –

+0

좋아요, 당신의 접근 방식에서 분명히해야 할 개념이 많이 있습니다. C++을 사용한다면이 코드를 작성하는 더 좋은 방법이 있습니다. –

답변

1

코드에 이상한 부분이 있지만 문제는 숫자가 문자열에 저장되어있는 동안 숫자에 대해 첫 번째 숫자를 테스트한다는 것입니다. 따라서 테스트는 if (cardNumber.at(0) == '4') ...이어야합니다. 그런데

1

하나는 위치 0에서 (첫 번째 문자를 얻을)와 int과 비교한다는 것입니다. 문자의 값은 정수이지만 현재 인코딩에서 문자의 값입니다. 예를 들어 ASCII encoding (가장 많이 사용되는 문자)에 '4'의 문자는 52입니다.

4'4'과 같지 않으므로 비교 cardNumber.at(0)==4은 실패합니다.

1
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) {...} 
관련 문제