2013-01-19 3 views
-2

왜 변수가 알려진 지 알 수 없습니다. 그것은 항상 두 번 두 배가됩니다. 코드는 유효한 카드 유효하지 않은 카드와 알 수없는 카드를 처리 한 시간을 표시한다고 가정합니다. 알려진 카드는 아메리칸 익스프레스 비자 및 마스터 카드입니다. 메신저는 그들의 수를 얻으려고 노력하지만, 항상 어떤 이유로왜 코드가 두 번 카운트되는지 잘 모르겠 음

#include <iostream> 
#include <string> 
#include <fstream> 
using namespace std; 

void validateCC(string); 
string checkCC(string, int, bool&); 
bool validateCCNum(string); 
string setCCType(string); 
int proc = 0, valid = 0 , invalid = 0 , unknown = 0 , known = 0; 

void main() { 
    string cardnum[300]; 
    int ccLen; 
    ifstream openfile("Sample Credit Card numbers.txt"); 
    if (openfile.is_open()) 
    { 
     while(!openfile.eof()) 
     { 
      for (int count = 0; !openfile.eof(); count++) 
      { 
       getline(openfile,cardnum[count]); 
       ccLen = cardnum[count].length(); 
       cout<<"sdfsd"; 
       proc++; 
       if (ccLen !=0) 
       { 
       validateCC(cardnum[count]); 
       } 
      } 

     } 

     cout<<valid<<" valid\n"; 
     cout<<invalid<<" invalid\n"; 
     cout<<unknown<< " unknwon\n"; 
     cout<<proc<<" processed\n"; 
     system("Pause"); 
    } 
} 

void validateCC(string ccn) { 
    string msg; 
    bool OK; 
    int ccLen; 
    ccLen = ccn.length(); 
    msg = checkCC(ccn, ccLen, OK); 
    if(!OK) 
    { 
     cout <<ccn<< msg << "\n"; 
     invalid++; 
    } 
    else 
    { 
     if(validateCCNum(ccn)) 
     { 
      msg = setCCType(ccn); 
      setCCType(ccn); 
      valid++; 
      cout<<ccn<<msg << "Card Type\n"; 
     } 
     else 
     { 

     cout << (ccn)<<" Invalid"<< " credit card number\n"; 
     invalid++; 
     } 
    } 
} 

string checkCC(string c, int cLen, bool& ccOK) { 
    string s = ""; 
    ccOK = true; 
    for(int i=0;i<cLen && ccOK;++i) 
     ccOK = isdigit(c[i]); 
    if(ccOK == false) { 
     s = " Invalid credit card number digits"; 
    } else if(cLen == 15) { 
     if(c.substr(0, 2) != "34" && c.substr(0, 2) != "37") { 
      ccOK = false; 
      s = " Invalid American Express credit card number"; 
     } 
    } else if(cLen != 16) { 
     ccOK = false; 
     s = " Invalid credit card number length"; 
    } 
    return s; 
} 

bool validateCCNum(string cc) { 
    bool flip = true; 
    int tmp, num = 0, ccLen = cc.length()-1; 
    for(int ndx=ccLen;ndx>=0;ndx--) { 
      if (flip) 
       num += cc[ndx] - '0'; 
      else { 
       tmp = (cc[ndx] - '0') * 2; 
       if(tmp <= 9) 
        num += tmp; 
       else 
        num += (1 + (tmp - 10)); // max of 18 
      } 
      flip = !flip; 
    } 
    return num % 10 == 0; 
} 

string setCCType(string cc) { 
    int num = cc[0]-'0'; 
    int num1 =cc[1]-'0'; 
    int num2 = cc[2]-'0'; 
    int num3 = cc[3]-'0'; 
    string cct = " Unknown"; 
    if(cc.length()==15 &&num ==3 &&num1 ==4|| cc.length()==15 &&num ==3 &&num1 ==7) 
    { 
     cct = " American Express"; 
     known++; 
    } 
    else if(num == '4') 
    { 
     cct = " Visa"; 
     known++; 
    } 
    else if(num ==5 && num1 ==1 ||num ==5 && num1 ==2|| num ==5 && num1 ==3||num ==5 && num1 ==4|| num ==5 && num1 ==5) 
    { 
     cct = " MasterCard"; 
     known++; 
    } 
    else if (num == 6 && num1 ==0 && num2 == 1 && num3==1 || num ==6 && num==5) 
    { 
     cct = " Discover"; //ignoring other prefixes 
     known++; 
    } 
    else 
    { 
     unknown++; 
    } 
    return cct; 
} 
+7

코드에서 사람들에게 오류를 발견하도록 요청하는 것은 생산성이 떨어집니다. 디버거를 사용하여 (또는 인쇄 문을 추가하여) 문제를 격리 한 다음 [최소 테스트 케이스] (http://sscce.org)를 구성해야합니다. –

+0

1) 왜 두 개의 루프가 필요한가요? 2) 두 루프 모두 올바르지 않습니다. 3)이 사이트에서 C++ 스트림을 사용하여 파일을 읽는 방법을 검색하십시오. 수백 가지 주제가 있습니다. – Nawaz

+1

또한'void main()'은 죽음에 의해 처벌되어야합니다. –

답변

2
msg = setCCType(ccn); 
     setCCType(ccn); 

당신은 함수를 두 번 호출에 대한 두 배로하는 것처럼 보인다. 이 경우 known/unknown이 두 번 계산됩니다.

+0

도움에 감사드립니다 죄송합니다. –

관련 문제