为啥这个计算代码没有正确执行?

Posted

技术标签:

【中文标题】为啥这个计算代码没有正确执行?【英文标题】:Why this calculating code is not executing properly?为什么这个计算代码没有正确执行? 【发布时间】:2019-01-11 12:43:10 【问题描述】:

我是 C++ 新手,我想制作一个非常低级别的迷你计算器,它可以使用 数据结构 技术计算电费。它是基于菜单的程序,每天可以从用户那里获取设备和小时数。我正在使用一个结构和两个堆栈,一个可以存储用户对设备的选择,另一个将存储每天消耗的小时数。

    #include<iostream>
const int size=20;
struct bill

    float arr[size];
    int top;
app,hrs;

void push(bill *ps, float x);
float pop(bill *ps);
float calculation(bill *app , bill *hrs);

using namespace std;
int main()

    float hours=0.0, result=0.0;
    int c=1 , choice=0;
    app.top=-1;
    hrs.top=-1;

        cout<<"***********APPLIANCES******WATTS************\n";
        cout<<"1.Color TV\t150W\n";
        cout<<"2.Light Bulb\t60W\n";
        cout<<"3.Celling Fan\t50W\n";
        cout<<"4.Cloth dryer\t2500W\n";
        cout<<"5.Coffee Maker\t1100W\n";
        cout<<"6.Desktop Computer\t275W\n";
        cout<<"7.Electric Heater\t2500W\n";
        cout<<"8.Electric Kettle\t2100W\n";
        cout<<"9.Food Blender\t350W\n";
        cout<<"10.Refrigerator\t275W\n";
        cout<<"11.Hair Dryer\t2150W\n";
        cout<<"12.Air Conditioner\t2500W\n";
        cout<<"13.Iron\t1000W\n";
        cout<<"14.Laptop\t75W\n";
        cout<<"15.LED LightBulb\t8.5W\n";
        cout<<"16.Microwave\t1150W\n";
        cout<<"17.Oven\t2150W\n";
        cout<<"18.Smart Phone charger\t5.5W\n";
        cout<<"19.Vacuum Cleaner\t450W\n";
        cout<<"20.Washing Machine\t500W\n";


        while(c!=0)
        
            cout<<"Enter 0 for exit and 1 to continue";
            cin>>c;
            if(c==0)
            break;
            else if(c==1)
            
            cout<<"Enter your choice ";
            cin>>choice;
                push(&app, choice); 
        cout<<"Enter hours/per day used";
            cin>>hours;
            push(&hrs, hours);
        
        else cout<<"Invalid input"; 
        
        result=calculation(&app, &hrs);
        cout<<"Total Electricity Bill is : "<<result;
    return 0;


float calculation(bill *a, bill *h)

    float units=0.0, kWh=0.0, temp=0.0, cost=0.0;
    float w=0.0,total_w=0.0, total_h=0.0;
    for(int i=0; i<size; i++)
    if(temp=pop(&app) == 1)
    w=150;
    else if(temp=pop(&app) == 2)
    w=60;
    else if(temp=pop(&app) == 3)
    w=50;
    else if(temp=pop(&app) == 4)
    w=2500;
    else if(temp=pop(&app) == 5)
    w=1100;
    else if(temp=pop(&app) == 6)
    w=275;
    else if(temp=pop(&app) == 7)
    w=2500;
    else if(temp=pop(&app) == 8)
    w=2100;
    else if(temp=pop(&app) == 9)
    w=350;
    else if(temp=pop(&app) == 10)
    w=275;
    else if(temp=pop(&app) == 11)
    w=2150;
    else if(temp=pop(&app) == 12)
    w=2500;
    else if(temp=pop(&app) == 13)
    w=1000;
    else if(temp=pop(&app) == 14)
    w=75;
    else if(temp=pop(&app) == 15)
    w=8.5;
    else if(temp=pop(&app) == 16)
    w=1150;
    else if(temp=pop(&app) == 17)
    w=2150;
    else if(temp=pop(&app) == 18)
    w=5.5;
    else if(temp=pop(&app) == 19)
    w=450;
    else if(temp=pop(&app) == 20)
    w=500;
    else 
    cout<<"Invalid Input";
    total_w=total_w+w;
    total_h=total_h+pop(&hrs);

kWh=total_w*total_h*30;
units=kWh/1000;
cost=units*9;
return cost;


void push(bill *ps, float x)

    if(ps->top!=size-1)
    
        ps->top=ps->top+1;
        ps->arr[ps->top]=x;
    


float pop(bill *ps)

        return ps->arr[ps->top--];

它会造成运行时错误并且计算不正确

每当我们按 0 退出时,它都会给出错误的输出 谁能帮我解决这个问题。

【问题讨论】:

【参考方案1】:

您的代码中存在三个问题,首先是您的calculation 函数中的for 循环。它必须从 0 到 top 而不是 size,因为 size 必须包含您未初始化的位置的原始值。考虑一下你有一个 5 的数组,让我们用以下方式说:

int a[5];
a[0]=2;
a[1]=4;

现在你说添加所有位置并给出如下结果:

result=a[0]+a[1]+a[2]+a[3]+a[4];

位置 0 和 1 分别有 2 和 4,但其余位置有垃圾。

代码中的第二个问题是重复 if 语句中的 pop 函数调用。为此,您可以在循环语句的开头执行此操作:

top=pop(a);

a 将被传递而不是 app,因为您在 a 中传递了应用程序。

最后再添加一条语句作为检查语句或安全控制w=0;,因为在您的 else 中无效正在打印并且 w 仍然具有其先前的值,因此无法提供正确的输出。

即使 a 的选项无效,您的小时数也必须包含在总小时数中,因此要阻止这种情况发生,您必须使用变量 h 并且如果输入有效则必须为其赋值,否则它必须为零。因此,您的代码将如下所示:

 float calculation(bill *a, bill *h)
 
     float units=0.0, kWh=0.0, temp=0.0, cost=0.0;
     float w=0.0,total_w=0.0, total_h=0.0,hr=0.0;
     for(int i=0; i<size; i++)
         temp=pop(a);
         w=0.0;
         hr=pop(h);
         if(temp == 1)
             w=150;
         else if(temp == 2)
             w=60;
         else if(temp == 3)
             w=50;
         else if(temp == 4)
             w=2500;
         else if(temp == 5)
             w=1100;
         else if(temp == 6)
             w=275;
         else if(temp == 7)
             w=2500;
         else if(temp == 8)
             w=2100;
         else if(temp == 9)
             w=350;
         else if(temp == 10)
             w=275;
         else if(temp == 11)
             w=2150;
         else if(temp == 12)
             w=2500;
         else if(temp == 13)
             w=1000;
         else if(temp == 14)
             w=75;
         else if(temp == 15)
             w=8.5;
         else if(temp == 16)
             w=1150;
         else if(temp == 17)
             w=2150;
         else if(temp == 18)
             w=5.5;
         else if(temp == 19)
             w=450;
         else if(temp == 20)
             w=500;
         else
             cout<<"Invalid Input";
             hr=0;
         
         total_w=total_w+w;
         total_h=total_h+hr;
      
      kWh=total_w*total_h*30;
      units=kWh/1000;
      cost=units*9;
      return cost;
   

【讨论】:

【参考方案2】:

calculation 函数中,每个 if 将调用pop。除非您想连续多次调用pop,否则请调用它一次并将结果存储在您用于检查的变量中。

我还建议您阅读switch 语句,因为它会使您的代码更简洁。

另一个问题是由于operator precedence,像temp=pop(&amp;app) == 2 这样的表达式等于temp=(pop(&amp;app) == 2)。这意味着您将pop(&amp;app) == 2 的比较结果分配给temp,这将使temp 成为1(如果比较是true)或0(如果它是false)。由于您(在您当前的代码中)不使用 temp 没关系,但这是您未来需要牢记的事情。

【讨论】:

以上是关于为啥这个计算代码没有正确执行?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 Joda 偏移不能正确实现夏令时

为啥我的代码没有执行正确的答案/回文检查器 javascript

我有这个错误:无法读取 null 的属性“值”,我不明白为啥

当计算使用后台线程时,如何正确声明计算属性?

为啥我必须添加小数才能在 C++ 中正确计算 [重复]

为啥NodeJs获取客户端的IP都是这样的