2014-09-26 57 views
-3

我應該創建一個(一個功能)程序來計算給定變化量的硬幣的面額。將計算給定數量變化的硬幣的面額的程序

不知何故,我沒有得到硬幣/宿舍等數量顯示正確,它只是給了我00000.我做錯了什麼?

這裏是我的代碼:

#include <iostream> 

using namespace std; 

const int DOLLAR = 100; 
const int QUARTER = 25; 
const int DIME = 10; 
const int NICKEL = 5; 
const int PENNY = 1; 

void getChange (double &money, int &value); 
int change(double &money, int value); 

int main() 
{ 
    double money; 
    int value; 

    getChange (money, value); 


    int numDollar = change(money, DOLLAR); 

    int numQuarter = change(money, QUARTER); 

    int numDime = change(money, DIME); 

    int numNickel = change(money, NICKEL); 

    int numPenny = change(money, PENNY); 


    cout << numDollar << endl; 
    cout << numQuarter <<endl; 
    cout << numDime <<endl; 
    cout << numNickel <<endl; 
    cout << numPenny <<endl; 
    cout << value <<endl; 



} 

void getChange (double &money, int &value) 
{ 
    cin >> money; 
    value = static_cast<double>(money) * 100; 

} 


int change(double &money, int value) 
{ 
    int numDollar, numQuarter, numDime, numNickel, numPenny; 

    while(value>100) 
     numDollar = value/DOLLAR; 
    money = value - (numDollar*DOLLAR); 

    numQuarter = money/QUARTER; 
    money = money - (numQuarter*QUARTER); 

    numDime = money/DIME; 
    money = money - (numDime*DIME); 

    numNickel = money/NICKEL; 
    money = money - (numNickel*NICKEL); 

    numPenny = money/PENNY; 
    money = money - (numPenny*PENNY); 

    return money; 

} 
+3

首先,你需要了解你正在嘗試做什麼。 (即使這個部分已經混淆了,你似乎無法跟蹤'money'變量是以美元還是美分爲單位)。一旦你知道自己在做什麼,就在調試器中遍歷代碼並檢查每個步驟結果在你所期望的。 – 2014-09-26 06:43:39

+0

此問題應發佈到codereview或編程stackexchange。 – plaes 2014-09-26 06:46:36

+0

關注'change'函數,直到你明白爲什麼它總是返回0爲止。然後編寫一個新的'change'函數,它的工作原理與你的'main'類似。 (提示:'變化'應該完全不知道教派。) – molbdnilo 2014-09-26 06:55:40

回答

0

試圖通過程序步,你會發現,change()總是返回0,所以輸出是正確的,但功能顯然不是。

想想這個函數返回什麼以及它應該返回什麼。另外請記住,您傳遞的是參考,因此無論您對moneychange()之內做什麼,都會在函數範圍之外持續存在。

既然你想要change()返回硬幣的數量,你很可能會希望它返回的金額除以當前硬幣的價值。


不要看過去的這條線,除非你真的卡住了,但即使如此,試着自己先看着辦吧!如果不能,就一步一步閱讀,然後再想想,等

讓我們快速瀏覽一下你的實現change()

while(value>100) 
    numDollar = value/DOLLAR; 

這不會使這裏很有意義。 value將持有當前硬幣的價值,但你不知何故試圖用它做一些計算。由於value在此循環內不會更改,因此您基本上創建了一個無限循環。它沒有輸入,因爲value現在不會大於100(因爲DOLLAR100)是通過的最大值)。

numQuarter = money/QUARTER; money = money - (numQuarter * QUARTER);

這將正確計算季度數並計算餘數。然而,這不是你應該在這裏做的,因爲實際的硬幣value是由參數決定的。

最後,但並非最不重要的,你有你的return語句:

return money; 

如果一切工作正常(假設當前實現所預期的,即計算所有的硬幣計數),那麼資金現在應該是0,這是返回。


的「編程」的很大一部分實際上是對能夠採取一些想法,然後將其轉換成一些代碼結構。這不是要了解某些名稱空間或頭文件中的所有可能的函數(您可以隨時查看這些函數)。這是關於如果寫下其他人的概念和想法並理解它們。如果你願意,可以使用下面的代碼來獲取靈感,但是除非你真正理解每一行的功能,否則不會繼續。


這是我的快速和骯髒的解決方案。有沒有錯誤處理等,但它似乎工作正常:

#include <iostream> 

const unsigned int DOLLAR = 100; 
const unsigned int QUARTER = 25; 
const unsigned int DIME = 10; 
const unsigned int NICKEL = 5; 
const unsigned int PENNY = 1; 

unsigned int change(unsigned int &money, unsigned int coin); 

int main(int argc, char **argv) { 
    double input; 

    // Retrieve the amount of money from the user. 
    std::cout << "Enter the amount in USD: "; 
    std::cin >> input;  

    // Now convert it into cents for processing. 
    unsigned int money = input * 100; 

    // And now count and output the number of coins: 
    std::cout << "You'll get:\n"; 
    std::cout << "\t" << change(money, DOLLAR) << " dollar(s)\n"; 
    std::cout << "\t" << change(money, QUARTER) << " quarter(s)\n"; 
    std::cout << "\t" << change(money, DIME) << " dime(s)\n"; 
    std::cout << "\t" << change(money, NICKEL) << " nickel(s)\n"; 
    std::cout << "\t" << change(money, PENNY) << " penny(s)" << std::endl; 
    return 0; 
} 

unsigned int change(unsigned int &money, unsigned int coin) { 
    // First count the number of coins that fit into the amount. 
    // Since we're doing integer division, all results will be rounded down. 
    const unsigned int count = money/coin; 
    // Then calculate the remainder and update it. 
    // The modulo operator (%) always returns the integer remainder. 
    money %= coin; 
    // Return the number of coins of this size 
    return count; 
} 
+0

嗨,謝謝馬里奧的建議,現在我將重點關注的是我的change()函數,我甚至將整個結構繪製在紙上,目前正在弄清楚......我想我的錯誤是快速跳入編碼..我仍然在學習,但我確信當我習慣編碼時,我會更瞭解更多。順便說一句,我是一個應用物理學專業,試圖理解CS ...顯然,我在物理學中知道的一切都是在CS中有點不同,我很努力地對待這個課程: – 2014-09-26 07:22:21

+0

不要擔心。 ()'實現是正確的(除了循環),你只需要把所有的東西都放到函數中,而不是僅僅是重複的模式。 – Mario 2014-09-26 07:26:14