错误的值与分区

问题描述:

我有以下问题。在我的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

没有缩进让我难过。 –

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) 

howmany从未通信items回其以任何方式调用程序,所以没有办法它可以打印出来。我也无法快速验证它是否做得正确。

然后,当您拨打howmany时,打印出cash作为项目的数量,并将item作为现金余额打印出来,这也是错误的。可能还有其他的错误。

您应该花很长时间仔细查看代码,并且一次开始单步执行一个代码路径。

+0

办公桌检查您的代码! –

我相信你可能需要打“Q”一次,每次调用menu
我不认为需要3个。

do-while循环中,您可以在不检查返回值的情况下调用menu。你需要按这封信的一个字母,所以你输入'Q',什么都不会发生。

该程序然后遇到第二个电话menu,这次将返回值放入一个变量。所以你在这里输入'Q'。

do-while循环终止,但另一个呼叫是menu。它会再次提示您,因此您第三次输入Q

您需要决定是否让menu函数显示并接收数据或将功能拆分为显示器和数据检索器。对menu的第一个电话表明了这一逻辑。无论您决定什么,在整个计划中保持一致。