2013-08-15 5 views
2

간단한 책 만들기 프로그램을 만들었습니다. MAIN 함수의 루프를 사용하여 generateNumbers()에서 rand()를 사용하여 "genNum"변수에 임의의 숫자를 할당하려고했습니다.) 함수를 호출 한 다음 'genNum'값을 MAIN의 세 지역 변수에 전달한 다음 내 BOOKIE 클래스의 멤버 함수에 전달합니다. 함수가 처음 두 번 반복하면 난수가 생성되지만 세 번 째 루프에서는 두 번째 루프에 대해 생성 된 것과 동일한 수를 생성합니다. rand()에 관한 모든 스레드를 살펴 보았지만 아무도 내 질문에 대답하지 않았습니다. 이는 임의의 생성 된 값을 수신하는 멤버 함수 인rand() 루프에서 번호 중복

void generateNumbers(double & number) { 
number = 1 + rand() % 500; 
} 

:

이이 난수를 생성하기위한 함수이고

int main() 
{ 
    bool genNumber = false; 

    int genCount = 0; 
    double genNum; 
    double genNum1; double genNum2; double genNum3; 
    Bookie bookKeeper; 
    srand(time(0)); 
    bookKeeper.welcomeMessage(); 

    clientEntry(); 
    bookKeeper.clientList(firstClient, secondClient, thirdClient); 
    while(genNumber == false) { 
    generateNumbers(genNum);//This is where the numbers are generated 
    genCount++; 
    if(genCount == 1) { 
     genNum1 = genNum; 
    } 
    if(genCount == 2) { 
     genNum2 = genNum; 
    } 
    if(genCount == 3) { 
     genNum3 = genNum; 
     bookKeeper.clientStatus(genNum1, genNum2, genNum3); 
     genNumber = true; 
     } 
    } 

    return 0; 
} 

주요 기능은 : 여기 코드 :

void Bookie::clientStatus(double num1, double num2, double num3) { 
clientAOwes = num1; clientBOwes = num2; clientCOwes = num3; 
string answer; 

    enum Status{PAID, LATE}; 
Status clientAStat; 
Status clientBStat; 
Status clientCStat; 

bool cStatus = false; 
while(cStatus == false){ 
    cout<<clientA <<" owes " <<clientAOwes <<".\n" 
     <<"Has this client paid, (Y)es or (N)o?\n" 
     <<"::"; 
    getline(cin, answer); 
    if(answer == "Y") { 
     clientAStat = PAID; 
     Astat = "PAID"; 
    } 
    if(answer == "N") { 
     clientAStat = LATE; 
     Astat = "LATE"; 
    } 

    //Client 2 
    cout<<clientB <<" owes " <<clientBOwes <<".\n" 
     <<"Has this client paid, (Y)es or (N)o?\n" 
     <<"::"; 
    getline(cin, answer); 
    if(answer == "Y") { 
     clientBStat = PAID; 
     Bstat = "PAID"; 
    } 
    if(answer == "N") { 
     clientBStat = LATE; 
     Bstat = "LATE"; 
    } 

    //Client 3 
    cout<<clientC <<" owes " <<clientBOwes <<".\n" 
     <<"Has this client paid, (Y)es or (N)o?\n" 
     <<"::"; 
    getline(cin, answer); 
    if(answer == "Y") { 
     clientCStat = PAID; 
     Cstat = "PAID"; 
    } 
    if(answer == "N") { 
     clientCStat = LATE; 
     Cstat = "LATE"; 
    } 
    cStatus = true; 
} 

cout<<fixed <<setprecision(2); 
cout<<setw(4) <<"STATUS" <<setw(21) <<"CLIENT" <<'\n' <<endl; 
cout<<setw(4) <<Astat <<setw(21) <<clientA <<'\n' <<endl; 
cout<<setw(4) <<Bstat <<setw(21) <<clientB <<'\n' <<endl; 
cout<<setw(4) <<Cstat <<setw(21) <<clientC <<'\n' <<endl; 
cout<<'\n' <<endl; 
} 
+0

genCount가 0으로 되돌아 오는 것을 찾지 못했습니까 .....? – alexbuisson

+0

clientStatus의 시작 부분에 인쇄 된 값을 인쇄 해보십시오. 뭐라구? –

답변

4

std의 새로운 임의 생성기를 권장하지만 코드는 정상적으로 작동합니다!

변경

//Client 2 
    cout<<clientB <<" owes " <<clientBOwes <<".\n" 

//Client 3 
    cout<<clientC <<" owes " <<clientBOwes <<".\n" 

당신은 코드를 복제

//Client 2 
    cout<<clientB <<" owes " <<clientBOwes <<".\n" 

//Client 3 
    cout<<clientC <<" owes " <<clientCOwes <<".\n" 
+0

나는 그것이 유형이라고 믿을 수 없다. 모두의 시간을 낭비해서 미안해. 그러나 나는 여기에 주어진 모든 충고에 진심으로 감사한다. 의심의 여지없이 긍정적 인 방향으로 나아갈 수 있도록 도와주는 훌륭한 조언이다. – ExpletiveDeleted

+0

@ExpletiveDeleted 괜찮습니다. 사람들은 실수를합니다. –

2

즉각적인 문제에 대한 해결책이 아닙니다. @ TheOtherGuy 's answer f 또는 실제 버그 수정). 그러나 코드가 불필요하게 복잡합니다. 예를 들어 루프를 사용하지 않고 초기화 작업을 수행 할 수 있습니다. 변화 :

generateNumbers(genNum1); 
generateNumbers(genNum2); 
generateNumbers(genNum3); 
bookKeeper.clientStatus(genNum1, genNum2, genNum3); 

및 변수 genNum, genNumber, genCount 제거 :

while(genNumber == false) { 
    generateNumbers(genNum);//This is where the numbers are generated 
    genCount++; 
    if(genCount == 1) { 
     genNum1 = genNum; 
    } 
    if(genCount == 2) { 
     genNum2 = genNum; 
    } 
    if(genCount == 3) { 
     genNum3 = genNum; 
     bookKeeper.clientStatus(genNum1, genNum2, genNum3); 
     genNumber = true; 
    } 
} 

합니다.

+0

운에 관한 것이 아니고, 그는'clientCOwes'를 인쇄하는 것을 잊어 버렸습니다. ... –

+1

@TheOtherGuy : 좋은 캐치 - 완전히 놓쳤습니다. 대답이 업데이트되었습니다. –

+1

조언을 주셔서 감사합니다. 오랫동안 코딩하지 않았고 모든 정직한 의견을 고맙게 생각하며, 지금부터는 너무 복잡해 지려고 노력하지 않을 것입니다. – ExpletiveDeleted

1

에, 당신은 결과를 중복. 구조체의 배열 (또는 C++ 벡터)을 사용하여 코드를 재정렬하고 복사 & 붙여 넣기의 야생 사용을 피하십시오. 이렇게하면 어리석은 실수를하지 않게되고 코딩 기술이 향상됩니다.

+0

감사합니다. 나는 신입생 실수가 될 것이라는 것을 알기 위해 몇 주 동안 만 코딩을 해왔습니다. 하지만 조언을 주셔서 감사 드리며 한 발을 내줄 것입니다 !! – ExpletiveDeleted

관련 문제