Сохранение каждой итерации аккумулятора?

(Да, это БЫЛО домашнее задание, но уже выполнено, я просто пытаюсь улучшить его сейчас на практике)

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

Модификация, которую я пытаюсь сделать, заключается в том, что я хочу сохранять стоимость каждого числа элементов в переменной, не перекрывая их память, а затем вызывать их выше общей суммы, чтобы вы могли видеть сколько стоил каждый предмет

================================================== =========================

//importing libraries for cin and cout, as well as setw() and setprecision()
#include <iostream>
#include <iomanip>
using namespace std; //sets all code to standard syntax

int main(){ //initializes the main function

    //initializing variables
    char answer = ' ';
    int saleItems = 0;
    double saleTax = 0.0;
    double grandTotal = 0.0;
    double itemValue = 0.0;
    double titemValue = 0.0;
    double taxPerc = 0.0;

    //begins a post-test loop
    do {
        titemValue = 0.0; //makes sure the accumulator resets WITHIN the loop

        //prompts for sale items amount
        cout << "How many sales items do you have? : ";
        cin >> saleItems;

        //creates a loop that displays the prompt for each iteration of saleItems
        for (int x = 1; x <= saleItems; x += 1){
            cout << "Enter in the value of sales item " << x << " : $";
            cin >> itemValue;
            titemValue += itemValue; //accumulator for adding up the iterated values
        }

        //prompts the user to enter a sales percentage
        cout << endl << endl;
        cout << "Enter in the sales tax percentage(Enter 10 for 10%): ";
        cin >> taxPerc;
        cout << endl << endl;

        //processes the variables after taxPerc has been given
        saleTax = titemValue * (taxPerc / 100);
        grandTotal = titemValue + saleTax;

        //sets decimal precision to 2 places
        cout << fixed << setprecision(2);

        //displays receipt with the calculated and input values
        cout << "********************************************" << endl;
        cout << "********  S A L E S  R E C E I P T  ********" << endl;
        cout << "********************************************" << endl;
        cout << "**                                        **" << endl;
        cout << "**                                        **" << endl;
        cout << "**                                        **" << endl;
        cout << "**                                        **" << endl;
        cout << "**  Total Sales            $" << setw(9) << titemValue << "     **" << endl;
        cout << "**  Sales Tax              $" << setw(9) << saleTax << "     **" << endl;
        cout << "**                          ----------    **" << endl;
        cout << "**  Grand Total            $" << setw(9) << grandTotal << "     **" << endl;
        cout << "**                                        **" << endl;
        cout << "**                                        **" << endl;
        cout << "********************************************" << endl << endl << endl;

        //prompts user to begin loop again
        cout << "Do you want to run this program again? (Y/N):";
        cin >> answer;
        answer = toupper(answer);
        cout << endl << endl;

        } while (answer == 'Y');

================================================== =========================

Итак, по сути, мне нужно иметь возможность сохранять каждое itemValue в нескольких различных значениях без повторения цикла и просто их замены, и я не могу понять, как я могу это сделать, учитывая, что аккумулятор будет продолжать цикл и добавлять до значений itemValue.

1 ответ

Решение

Вот один из способов использовать простой массив для хранения значений элемента.

Объявите массив сверху. Примечание: вам нужно будет указать фиксированный размер. Есть способы иметь переменный размер, но они становятся более сложными (например, векторы). Лучше указывать размер, используя константу, а не жестко закодированное число, так как вам понадобится константа позже.

const int maxSaleItems = 100;
double itemValues[maxSaleItems];

После того, как вы спросили пользователя о количестве предметов, убедитесь, что они не ввели слишком большое число.

    cout << "How many sales items do you have? : ";
    cin >> saleItems;
    if (saleItems > maxSaleItems) {
        cout << "Sorry, I can only handle " << maxSaleItems << " items.";
        continue;
    }

Внутри цикла, в который вы вводите значения элемента, сохраните значение элемента в массиве:

        cout << "Enter in the value of sales item " << x << " : $";
        cin >> itemValue;
        titemValue += itemValue; //accumulator for adding up the iterated values
        itemValues[x - 1] = itemValue;

Обратите внимание x-1 в массиве access - массивы основаны на 0 (т. е. их индекс начинается с 0). Обычно я бы зациклился x от 0 в < saleItems, но я не хотел менять существующий цикл.

При печати квитанции добавьте цикл, который распечатывает все значения (вам нужно будет добавить форматирование):

    cout << "**                                        **" << endl;
    for (int x = 1; x <= saleItems; x += 1){
       cout << "** Item " << x << " $" << itemValues[x-1] << "   **" <<endl;
    }
    cout << "**                                        **" << endl;

Как я уже сказал в комментариях, используя std::vector было бы лучше, но если вы еще не до этого, массивы подойдут.

Редактировать: Простой vector пример. Для добавления векторов необходимо включить соответствующий заголовок:

#include <vector>

Нет необходимости maxSaleItems больше, так как векторы могут расти. Объявите векторную переменную. <double> делает его вектором, который содержит double ценности:

std::vector<double> itemValues;

Внутри цикла вместо установки значения массива для нового элемента по местоположению, просто добавьте его в конец вектора, используя push_back,

    cout << "Enter in the value of sales item " << x << " : $";
    cin >> itemValue;
    titemValue += itemValue; //accumulator for adding up the iterated values
    itemValues.push_back(itemValue);

Код квитанции на печать можно оставить точно таким же, каким он был для версии массива, так как вы можете получить доступ к векторам, таким как массивы:

cout << "**                                        **" << endl;
for (int x = 1; x <= saleItems; x += 1){
   cout << "** Item " << x << " $" << itemValues[x-1] << "   **" <<endl;
}
cout << "**                                        **" << endl;

Есть другие изменения, которые вы можете сделать, чтобы сделать vector Версия проще, но я хотел изменить как можно меньше.

Другие вопросы по тегам