Почему этот вычислительный код не выполняется должным образом? - PullRequest
0 голосов
/ 11 января 2019

Я новичок в 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, чтобы выйти, это дает неправильный вывод может кто-нибудь помочь, чтобы я мог избавиться от этой проблемы.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

В вашем коде есть три проблемы: во-первых, это цикл for в вашей функции calculation. Это должно быть от 0 до top, а не 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 соответственно, но остальные имеют мусор.

Вторая проблема в вашем коде - это повторный вызов функции pop в операторе if. для этого вы можете сделать в начале операторов цикла:

top=pop(a);

a будет передано не app, так как вы передали приложение в.

Наконец, добавьте еще один оператор в качестве оператора проверки или безопасного управления. w=0;, поскольку в вашем другом недопустимом является печать, а 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;
   }
0 голосов
/ 11 января 2019

В функции calculation каждый if будет вызывать pop. Если вы не хотите вызывать pop, возможно, несколько раз подряд, затем вызывайте его один раз и сохраните результат в переменной, которую вы используете для проверки.

Я также предлагаю вам прочитать об операторе switch, поскольку он сделает ваш код чище.

Другая проблема состоит в том, что выражение типа (например) temp=pop(&app) == 2 равно temp=(pop(&app) == 2) из-за приоритета оператора . Это означает, что вы присваиваете результат сравнения pop(&app) == 2 для temp, что составит temp либо 1 (если сравнение true), либо 0 (если оно false). Поскольку вы (в своем текущем коде) не используете temp, это не имеет значения, но это то, что вам нужно иметь в виду на будущее.

...