2014-04-09 2 views
0

나는 사용자에게 구매 한 총 비용과 지불 한 금액을 입력하고 사용자에게 전체 변경 사항을 제공하고 사용자, , 십센트, 페니 등 ....하지만이 변경 오류 (아래 그림)를 계속 유지하면서 올바른 금액을 표시하는 변경을 얻을 수없는 몇 가지 이유로 그리고 그것은 또한 루핑과 루핑을 유지합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?루핑 및 이상한 주소 결과 C++

미리 도움 주셔서 감사합니다.

Looping Over & Over

Driver.cpp

#include "MoneyChanger.h" 
#include <string> 
#include <iostream> 

using namespace std; 

int main() 
{ 
    MoneyChanger results; 
    int twenties, tens, fives, ones, quarter, dimes, nickels, pennies; 
    double purchase, given; 
    string again = "yes"; 

    do{ 

    cout << "please enter total cost of purchase: $"; 
    cin >> purchase; 

    cout << "\nplease enter amount given: $"; 
    cin >> given; 

     //grabbing the bills and coins 
     results.GetBills(&twenties, &tens, &fives, &ones); 
     results.GetCoins(&quarter, &dimes, &nickels, &pennies); 

     results.setData(purchase, given); 

     //results 
     cout << "Your change is: $" << results.getTotalChange() << "\n\n"; 
     cout << twenties << " Twenties" << endl; 
     cout << tens << " Tens" << endl; 
     cout << fives << " Fives" << endl; 
     cout << ones << " Ones" << endl; 
     cout << quarter << " Quarters" << endl; 
     cout << dimes << " Dimes" << endl; 
     cout << nickels << " Nickels" << endl; 
     cout << pennies << " Pennies" << endl; 

     cout << "\n\nWould you like to calculate again?\nEnter yes or no\n"; 
     cin >> again; 
    } while (again == "yes"); 


    cout << "Thank you for using this MoneyChanger!" << endl; 

    return 0; 
} 

MoneyChanger.cpp

#include "MoneyChanger.h" 
#include <iostream> 
#include <iomanip> 
#include <string> 
#include <fstream> 
#include <cstdlib> 

using namespace std; 

MoneyChanger::MoneyChanger() 
{ 


} 

void MoneyChanger::setData(double pp, double given) 
{ 
    amountP = pp; 
    amountG = given; 
    CalcChange(); 
} 
void MoneyChanger::CalcChange() 
{ 
    while(totalChange >= 20){totalChange = totalChange-20; twenty++;} 
    while(totalChange >= 10){totalChange = totalChange-10; ten++;} 
    while(totalChange >= 5){totalChange = totalChange-5; five++;} 
    while(totalChange >= 1){totalChange = totalChange-1; one++;} 
    while(totalChange >= .25){totalChange = totalChange-.25; quarter++;} 
    while(totalChange >= .10){totalChange = totalChange-.10; dime++;} 
    while(totalChange >= .05){totalChange = totalChange-.05; nickel++;} 
    while(totalChange >= .01){totalChange = totalChange-.01; penny++;} 
} 
double MoneyChanger::getTotalChange() 
{ 
    totalChange = amountG - amountP; 
    return totalChange; 
} 
void MoneyChanger::GetBills(int *twenties, int *tens, int *fives, int *ones) 
{ 
    *twenties = twenty; 
    *tens = ten; 
    *fives = five; 
    *ones = one; 
    CalcChange(); 
} 
void MoneyChanger::GetCoins(int *quarters, int *dimes, int *nickels, int *pennies) 
{ 
    *quarters = quarter; 
    *dimes = dime; 
    *nickels = nickel; 
    *pennies = penny; 
    CalcChange(); 
} 

MoneyChanger.h

#ifndef H_MONEYCHANGER_H 
#define H_MONEYCHANGER_H 

using namespace std; 

class MoneyChanger 
{ 
private: 
    double amountP, amountG, totalChange; 
    int twenty, ten, five, one, change; 
    int quarter, dime, nickel, penny; 
    void CalcChange(); 
public: 
    MoneyChanger(); 
    void setData(double pp, double given); 
    double getTotalChange(); 
    void GetBills(int *twenties, int *tens, int *fives, int *ones); 
    void GetCoins(int *quarters, int *dimes, int *nickels, int *pennies); 
}; 
#endif 
+2

GetCoins는 '()는'초기화 데이터 멤버에 매개 변수를 지정한다. – 0x499602D2

+2

이러한 'cin.ignore();' 좋지 않다 –

+0

@ DieterLücking 젠장, 나는 그들을 제거하는 것을 잊었다. 그것을 발견해 주셔서 감사합니다. – Mario

답변

3

당신은 당신의 멤버 변수를 초기화하지 않는 건설 중. 이에

MoneyChanger::MoneyChanger() 
{ 
} 

:이

변경

void MoneyChanger::CalcChange() 
{ 
    twenty = ten = five = one = 0; 
    quarter = dime = nickel = penny = 0; 

    while(totalChange >= 20){totalChange = totalChange-20; twenty++;} 
    while(totalChange >= 10){totalChange = totalChange-10; ten++;} 
    while(totalChange >= 5){totalChange = totalChange-5; five++;} 
    while(totalChange >= 1){totalChange = totalChange-1; one++;} 
    while(totalChange >= .25){totalChange = totalChange-.25; quarter++;} 
    while(totalChange >= .10){totalChange = totalChange-.10; dime++;} 
    while(totalChange >= .05){totalChange = totalChange-.05; nickel++;} 
    while(totalChange >= .01){totalChange = totalChange-.01; penny++;} 
} 

가 나는 또한 거의 지점을 참조하십시오

MoneyChanger::MoneyChanger() 
    : amountP(), amountG(), totalChange(), 
     twenty(), ten(), five(), one(), change() 
     quarter(), dime(), nickel(), penny() 
{ 
} 

이 클래스는 원격으로 재사용 할 수 있도록하려면, 다음의 라인을의 에서 CalcChange()을 호출합니다.기능. 그것은 무엇보다도 처음에 있어야합니다.

+0

"나는 Get 함수가 끝날 때 CalcChange()를 호출하는 것이 거의 없다"는 의미를 이해하지 못합니다. – Mario

+1

그 문장에는 그 자체로 설명이없는 내용이 있습니까? ** 모든 아웃 매개 변수를 지정하기 전에 ** 호출해야합니다. 그리고이 객체는 반복적으로 사용할 수 없습니다. 'CalcChange'는 모든 변경 값을 지우고 값을 계산해야합니다. – WhozCraig

+0

이제 알겠습니다.네가 무슨 말을했는지는 분명하지 않았다. 이제 내 문제로 결과를 표시하려고합니다. 지금 당장은 프로그램을 처음 시작할 때 표시되지 않으며 때로는 올바른 결과가 절반 만 표시되는 경우도 있습니다. – Mario

-2
  • 입력 코드를 사용하기 전에 모든 변수를 초기화해야합니다.
  • 포인터보다 변수에 대한 참조를 사용하는 것이 더 안전합니다.
  • 당신 사항 setData() 는 * totalChange가 호출 사항 setData 전에 초기화되어야합니다 말에 한 번) CalcChange를 (호출 할 수 있습니다 같은 : { (두 번 주어진 이중 쪽)

    무효 환전상 :: 사항 setData amountP = pp; amountG = 지정; totalChange = amountG - amountP;

    CalcChange(); 
    

  • }