2011-10-11 3 views
1

총 값에 난수를 추가하는 두 가지 함수가 있습니다.추가 진술 후에 값이 증가하지 않습니까?

문제는 내가 함수를 호출하고 합계를 인쇄 할 때마다 추가되지 않는다는 것입니다. 2를 생성하면 합계가 2라고 표시됩니다. 그런 다음 다시 호출하고 5를 생성하면 합계는 5이고 추가하지 않습니다 (이 경우 일어난 경우 7이어야 함).

여기 모두 괜찮아 보입니다 ...

int human(int humanscore) 
{ 
    int diceRoll= rand() % 7; 
    cout << "player rolled: "; 
    humanscore+= diceRoll; 
    cout << diceRoll; 
    cout << "human score is: " << humanscore; 
} 

int computer(int compscore) 
{ 
    int diceRoll= rand() % 7; 
    cout << "computer rolled: "; 
    compscore+= diceRoll; 
    cout << diceRoll; 
    cout << "computer score is: " << compscore; 
} 
+0

이 숙제가 있습니까? – Rob

+1

직접 반복하지 마십시오. 이 두 함수는 하나 여야합니다. –

+5

전에는 7 면체를 보지 못했습니다 ... – tenfour

답변

9

함수에 전달 된 인수의 내부 복사본 값을 수정하고 있습니다. 변경 사항을 외부 변수에서 수행하려면 함수 정의를 변경하여 참조 번호 대신 int& score을 사용하십시오.

또한 rand() % 7은 [0, 6] 범위의 값을 제공합니다. 주사위는 [1, 6] 범위의 값을 가지므로 대신 1 + rand() % 6을 사용해야합니다.

* 업데이트 * 이는 C++ 참조하여 행해질 수

이 선언

int computer(int& compscore) 
{ 
    ... 
    compscore += diceRoll; 
    ... 
} 

int var = 0; 
computer(var); 

이 함수는 인수로 실제 변수 var 걸리고, 변경 내에 compscore 짓 함수는 변수 varcompscorevar으로 반영됩니다. 특정 호출은 동일한 변수에 대한 별칭 일뿐입니다.

C는 동일한 효과를 포인터로 달성된다 : 함수

int computer(int* compscore) 
{ 
    ... 
    *compscore += diceRoll; 
    ... 
} 

int var = 0; 
computer(&var); 

이 호출은 그것을 변경되어야하는 변수의 주소를 제공한다. 일반적으로 참조를 사용하는 첫 번째 구현은이 마지막 스 니펫과 비슷한 컴파일러에 의해 자동으로 솔루션을 생성한다고 가정 할 수 있습니다.

+0

그래서 &를 추가해야합니까? 나는 &가 무엇인지 모릅니다. – mystycs

+1

복사를 변경하고 복사본을 변경 한 다음 복사본을 버리는 대신 주사위 롤을 요청한 장소에서'int' 포인터로 변경중인'int'를 바꿉니다. – darvids0n

+0

@mystycs : 참조에 익숙하지 않은 경우 사용하기 전에 참조하십시오. 그 사이에 포인터를 사용할 수 있습니다. –

1

여기 diceRollcout입니다. 따라서 현재 롤을 총계와 반대로 인쇄 할 것입니다.

주사위 굴리기가 올바르게 인쇄되었다고 가정하면, 해당 기능의 끝 부분에 return humanscore;return compscore;을 작성하여 새로운 결과로 다시 전달해야합니다.

1

매개 변수를 값으로 전달 중입니다. 즉, 함수에 대한 변경 사항은 함수가 완료되면 버려집니다. 점수를 계속 유지하려면 몇 가지 선택 사항이 있습니다. 포인터를 점수에 전달하여 C++에서 매개 변수를 전달할 수 있습니다. 함수가 새 점수를 반환하게하고 다음에 호출 할 때 반환 된 값을 함수에 전달할 수 있습니다. 또한 전역 변수를 사용하는 것이 덜 바람직 할 수도 있습니다.

관련 문제