【问题标题】:Looping & Strange Address Results C++循环和奇怪的地址结果 C++
【发布时间】:2014-04-09 21:58:44
【问题描述】:

我假设要求用户输入他们购买的总成本和他们支付的金额,并向用户提供他们的总零钱以及他们从一、五、十、一角、便士等中获得的零钱。 ...但由于某种原因,我无法让更改显示正确的数量,因为我不断收到此更改错误(下图),并且它也不断循环和循环。我究竟做错了什么?

提前感谢您的帮助!

驱动程序.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

【问题讨论】:

  • GetCoins() 正在将参数分配给未初始化的数据成员。
  • 这些'cin.ignore();'不好
  • @DieterLücking 废话,我忘了删除那些。感谢您发现它。

标签: c++ loops


【解决方案1】:

你没有在构造时初始化你的成员变量。

改变这个:

MoneyChanger::MoneyChanger()
{
}

到这里:

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

要使此类远程可重用,请执行以下操作:

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

我还认为在 Get 函数的 end 调用 CalcChange() 没什么意义。如果有的话,它应该在开头。

【讨论】:

  • 我不明白您所说的“我也认为在 Get 函数的末尾调用 CalcChange() 没什么意义。”
  • 那句话中是否有一些不言自明的地方?如果有的话,应该在 分配所有输出参数之前调用它。并且正如所写的那样,这个对象在某种程度上无法重复使用。 CalcChange 应该清除所有更改变量,然后计算它们的值。
  • 我现在明白了。不是很清楚你在说什么。现在我的问题是尝试显示结果。现在它要么在我第一次启动程序时不显示,有时它只在中途显示正确的结果。
  • @SeanK_ 好吧,因为您的 do-while 循环中的任何内容都不会将 again 更改为除了 "yes" 的初始值之外的任何内容,如果它不是无限循环,我会感到惊讶,但在至少你现在有结果了。
【解决方案2】:
  • 您应该在此处初始化输入代码,然后再使用所有变量。
  • 使用对变量的引用比使用指针更安全。
  • 您可以在 setData() 结束时调用一次 CalcChange() *totalChange 应该在调用 setData 之前初始化: 喜欢:

    void MoneyChanger::setData(double pp, double given) { 数量P = pp; 数量G =给定; totalChange = amountG - amountP;

    CalcChange();
    

    }

【讨论】:

    猜你喜欢
    • 2017-05-19
    • 2016-05-26
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2016-02-16
    • 1970-01-01
    相关资源
    最近更新 更多