(Да, это БЫЛО домашнее задание, но уже выполнено, я просто пытаюсь улучшить его сейчас на практике)
В основном это калькулятор продаж, который позволяет вам иметь несколько входов для позиций продаж, а затем отображает итоговую сумму, налог с продаж и общую сумму.
Модификация, которую я пытаюсь сделать, заключается в том, что я хочу сохранять стоимость каждого числа элементов в переменной, не перекрывая их память, а затем вызывать их выше общей суммы, чтобы вы могли видеть сколько стоил каждый предмет
================================================== =========================
//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.
Вот один из способов использовать простой массив для хранения значений элемента.
Объявите массив сверху. Примечание: вам нужно будет указать фиксированный размер. Есть способы иметь переменный размер, но они становятся более сложными (например, векторы). Лучше указывать размер, используя константу, а не жестко закодированное число, так как вам понадобится константа позже.
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
в доступе к массиву — массивы основаны на 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
Версия проще, но я хотел изменить как можно меньше.
Других решений пока нет …