2011-11-04 39 views
-1

我有以下問題。在我的howmany函數中,它應該讀取您有多少錢以及一個物品的成本,然後它應該告訴您可以購買多少物品以及剩餘的貨幣。到目前爲止,我所能得到的所有項目數量都是0,貨幣數量顯示爲輸入的原始數量。錯誤的值與分區

任何幫助將不勝感激,也無論何時我打Q退出程序,我必須輸入它2或3次循環實際停止。

#include <iostream> 
using namespace std; 

void bestbuy(double&, double&, double); 
void discountresults (double&, double&); 
void howmany(double&, double&); 
char menu(); 

double price1, price2, price3;//bestbuy variables 
double price, discount;//discountresults variables 
double cash,item;//howmany variables 

int main() 
{ 
    char choice; 
    do 
    {menu(); 
    choice = menu();} 
    while(choice != 'Q'); 
    menu(); 

    system ("PAUSE"); 
    return 0; 
} 

void bestbuy(double &val1,double &val2, double val3) 
{ 
    if (val1 < val2 && val1 < val3) 
     val2 = 1; 
    else if (val2 < val1 && val2 < val3) 
     {val1 = val2; 
     val2 = 2;} 
    else 
    {val1 = val3; 
    val2 = 3;} 
} 

void discountresults(double &price, double &discount) 
{ 
    double hold; 
    hold = price; 
    price *= discount; //discount amount 
    hold -= price; 
    discount = hold; //price after discount 
} 

void howmany(double &money, double &itemcost) 
{ 
    double items; 
    items = money/itemcost; 
    itemcost = itemcost * items; 
    money = money - itemcost; 
} 

char menu() 
{ 
    char option; 

    cout<<"(B)est Buy Calculation.\n"; 
    cout<<"(D)iscount Calculation.\n"; 
    cout<<"(H)ow Many Calculation.\n"; 
    cout<<"(Q)uit.\n"; 
    cout<<"Please enter the option B, D, H, or Q\n"; 
    cin>>option; 

    switch(option) 
{ 
case 'B': 
cout<<"Please enter 3 prices\n"; 
cin>>price1; 
cin>>price2; 
cin>>price3; 
bestbuy(price1,price2,price3); 
cout<<"Your lowest price entered was "<<price1<<" and it was the "<<price2<<" number you entered.\n"; 
break; 
case 'D': 
    cout<<"Please enter price of item and discount percent\n"; 
    cin>>price; 
    cin>>discount; 
    discountresults(price,discount); 
    cout<<"Your discount amount is "<<price<<" and the discounted price is "<<discount<<endl; 
    break; 
case 'H': 
    cout<<"Please enter amount of money available and cost of item\n"; 
    cin>>cash; 
    cin>>item; 
    howmany(cash,item); 
    cout<<"You can buy "<<cash<<" of that item and have $"<<item<<" left over\n"; 
    break; 
case 'Q': 
    return option; 


}} 
+1

您是否嘗試過調試? – crashmstr

+5

沒有縮進讓我難過。 –

回答

0
void howmany(double &money, double &itemcost) 
{ 
    double items; 
    items = money/itemcost; 
    itemcost = itemcost * items; 
    money = money - itemcost; 
} 

在數學上,這個函數總是返回零:itemcost = itemcost * (money/itemcost)始終計算爲money(一個數值誤差)。因此money - itemcost等於零(同樣,數值錯誤)。

您需要考慮到您只能購買整件物品的事實。由於這是作業,因此找出最佳做法是留作練習。

還要記住,當您通過引用傳遞事件時,修改後的值對調用者可見。你可能需要考慮一下你是否真的要參照這裏傳遞moneyitemcost

void howmany(double &money, double &itemcost) 
0

howmany從未通信items回其以任何方式調用程序,所以沒有辦法它可以打印出來。我也無法快速驗證它是否做得正確。

然後,當您撥打howmany時,打印出cash作爲項目的數量,並將item作爲現金餘額打印出來,這也是錯誤的。可能還有其他的錯誤。

您應該花很長時間仔細查看代碼,並且一次開始單步執行一個代碼路徑。

+0

辦公桌檢查您的代碼! –

0

我相信你可能需要打「Q」一次,每次調用menu
我不認爲需要3個。

do-while循環中,您可以在不檢查返回值的情況下調用menu。你需要按這封信的一個字母,所以你輸入'Q',什麼都不會發生。

該程序然後遇到第二個電話menu,這次將返回值放入一個變量。所以你在這裏輸入'Q'。

do-while循環終止,但另一個呼叫是menu。它會再次提示您,因此您第三次輸入Q

您需要決定是否讓menu函數顯示並接收數據或將功能拆分爲顯示器和數據檢索器。對menu的第一個電話表明了這一邏輯。無論您決定什麼,在整個計劃中保持一致。