Как мне заставить переменную накапливаться? C

#c

#c

Вопрос:

Как мне получить переменную total, чтобы получать каждую цену каждый раз, когда программа запускается? Ожидаемые значения — это общее количество для каждого введенного числа, сложенного вместе, и каждое число имеет определенное значение. Я не получаю никаких выходных данных, когда вводится число 8, которое должно печатать и завершать цикл.

 #include <iostream>
using namespace std;
int main() {
int option;
double one = 17.50;
double two = 12.95;
double thre = 11.56;
double four = 7.99;
double five = 15.00;
double six = 9.99;
double total = 0;
do{
cout<<"**************************************BRAINS!**************************************"<<endl;
cout<<"**************************************Menu**************************************"<<endl;
cout<<"1) Thalamustard-Crusted Filet - $17.50"<<endl;
cout<<"2) Hypothamoussaka - $12.95"<<endl;
cout<<"3) Amyg-DAL-a - $11.56"<<endl;
cout<<"4) CHIPpocampus amp; Dip- $7.99"<<endl;
cout<<"5) Pons Pasta Special - $15.00"<<endl;
cout<<"6) Medulla Frittata - $9.99"<<endl;
cout<<"7) Finish Current Sale   Start a New Sale"<<endl;
cout<<"8) Quit Forever - APOCALYPSE"<<endl;
cin>>option;}
while ( option <= 8 amp;amp; option > 0);

while(option <= 0){
  if (option == 1){
    double total = total   one;
  }
  else if (option == 2){
    double total = total   two;
  }
  else if (option == 3){
    double total = total   thre;
  }
  else if (option == 4){
    double total = total   four;
  }
  else if (option == 5){
    double total = total   five;
  }
  else if (option == 6){
    double total = total   six;
  }
  else if (option == 7){
    double total = total   (total*0.06);
  }
  else{
    cout<<"HURRY UP!";
  } 
if (option == 8){
cout<<"Your total is: $"<<total; //This does not print or accumulate
}
}
}
  

Комментарии:

1. Измените все double total = total ... на total = total ... . В противном случае вы затеняете фактический накопитель total .

2. Вы говорите, что она не печатается и не накапливается. Что это значит? Он вообще ничего не печатает? Или просто 0? Какой результат вы получаете? @cigien уже нашел основную проблему, но я думаю, что ваша проверка ввода также неверна, она будет повторяться до тех пор, пока option находится между 0 и 8, т. Е. До тех пор, пока ввод действителен?

3. Первый цикл прерывается только тогда, когда пользователь вводит недопустимый элемент меню. И второй цикл будет выполняться только в том случае, если option значение недопустимо (точнее, равно или меньше нуля), и тогда он будет выполняться вечно. Подумайте об этой логике некоторое время и попытайтесь объяснить это своей резиновой утке .

4. Я что-то упускаю — как это когда-либо печатает какие-либо выходные данные? Вы выходите из цикла ввода только при вводе меньше 1 или больше 8, затем вы зависнете в следующем цикле, если ваш ввод меньше 1. Единственный способ чисто выйти из этой программы — ввести 9 или больше.

5. Просмотрите switch инструкцию.

Ответ №1:

Каждый раз, когда вы создаете новую локальную итоговую переменную в строках

   double total = total   one;
  

и это не меняет фактическое total значение. Изменение этой строки на

    total  = one; //or two....
  

может решить эту проблему.

Ответ №2:

Почему ваш код не работает

посмотрите на эквивалент кода

    do{
      // print measseges
      cin>>option;
   } while (option <= 8 amp;amp; option > 0);

   while(option<=0){
      // decode the option meaning
   }


  

код будет повторяться в первом цикле (вывод сообщения и получение входных данных) и завершит цикл, когда option переменная будет больше 8 или нулевого значения

  • если первый цикл заканчивается на option is positve (больше 8), то второй цикл никогда не завершится, и программа завершится без какого-либо ответа!!

  • второй цикл будет выполняться только тогда, когда option переменная имеет отрицательное значение… и в этом случае это приведет к бесконечному циклу>>> только else statment будет сохраняться навсегда.

итак, здесь у вас есть две основные ошибки

  1. значение option во втором цикле (если первый цикл завершается с отрицательным значением) всегда отрицательно, поэтому отсутствие вашей if проверки состояния имеет значение
  2. вы объявляете общую переменную многократно

и эта проблема может быть решена с помощью следующего кода :

 #include <iostream>
using namespace std;
int main() {
    int option;
    double one = 17.50;
    double two = 12.95;
    double thre = 11.56;
    double four = 7.99;
    double five = 15.00;
    double six = 9.99;
    double total = 0;
    do {
        cout << "**************************************BRAINS!**************************************" << endl;
        cout << "**************************************Menu**************************************" << endl;
        cout << "1) Thalamustard-Crusted Filet - $17.50" << endl;
        cout << "2) Hypothamoussaka - $12.95" << endl;
        cout << "3) Amyg-DAL-a - $11.56" << endl;
        cout << "4) CHIPpocampus amp; Dip- $7.99" << endl;
        cout << "5) Pons Pasta Special - $15.00" << endl;
        cout << "6) Medulla Frittata - $9.99" << endl;
        cout << "7) Finish Current Sale   Start a New Sale" << endl;
        cout << "8) Quit Forever - APOCALYPSE" << endl;
        cin >> option;


        if (option == 1) {
            total = total   one;
        }
        else if (option == 2) {
            total = total   two;
        }
        else if (option == 3) {
            total = total   thre;
        }
        else if (option == 4) {
            total = total   four;
        }
        else if (option == 5) {
            total = total   five;
        }
        else if (option == 6) {
            total = total   six;
        }
        else if (option == 7) {
            total = total   (total * 0.06);
        }
        else if (option == 8) {
            cout << "Your total is: $" << total; 
            breack;
        }
        else {
            cout << "not valied input";
        }
        
    } while (option <= 8 amp;amp; option > 0);

   
}

  

советы по кодированию для лучшего чтения

  1. вы могли бы инкапсулировать меню печати в другую функцию
  2. используйте switch statment, а не if это сделает его намного более понятным для чтения
  3. do while является ли suck использовать while цикл с истинным условием сначала
  4. вы можете использовать массив, а не дискретную переменную для сохранения константы

ищите следующий код, он намного красивее после применения этих простых приемов

 #include <iostream>
using namespace std;

void printMenu();

int main() {
    int option =0;
    double one = 17.50;
    double two = 12.95;
    double thre = 11.56;
    double four = 7.99;
    double five = 15.00;
    double six = 9.99;
    double total = 0;
    cout << "**************************************BRAINS!**************************************" << endl;
    while(option != 8) 
    {
        
        printMenu();
        cin >> option;

        switch (option)
        {
            case 1:total  = one;break;
            case 2:total  = two;break;
            case 3:total  = thre;break;
            case 4:total  = four;break;
            case 5:total  = five;break;
            case 6:total  = six;break;
            case 7:
                cout << "Your total is" << total << " $n starting new sale ... n";
                total =0;
                break;
            case 8:
                cout << "Your total is: " << total << " $ n"<<"End of the program";
                break;

            default:
                cout << "you entered "<<option<<"and this is not a valid option please try agiann";
                break;
        } 
    } 

}



void printMenu() {
    cout << "**************************************Menu**************************************" << endl;
    cout << "1) Thalamustard-Crusted Filet - $17.50" << endl;
    cout << "2) Hypothamoussaka - $12.95" << endl;
    cout << "3) Amyg-DAL-a - $11.56" << endl;
    cout << "4) CHIPpocampus amp; Dip- $7.99" << endl;
    cout << "5) Pons Pasta Special - $15.00" << endl;
    cout << "6) Medulla Frittata - $9.99" << endl;
    cout << "7) Finish Current Sale   Start a New Sale" << endl;
    cout << "8) Quit Forever - APOCALYPSE" << endl;
}

  

Комментарии:

1. Вы могли бы объявить const char массив, содержащий меню, а затем использовать std::cout.write() для переноса текста на консоль. Сначала измените все это endl на n .

2. Цены должны быть объявлены как const double , поскольку их значения не меняются после объявления.