c++ - 需要 7 个并行向量的 C++ 程序(用于学校)存在问题
问题描述
实验室问题:
编写一个程序来跟踪五金店的库存。这家商店出售各种商品。对于商店中的每件商品,将保留以下信息:商品 ID、商品名称、订购的件数、当前在商店中的件数、售出的件数、该商品的制造商价格和商店的售价。在每周结束时,商店经理希望查看以下形式的报告:
Friendly Hardware Store itemID itemName pOrdered pInStore pSold manufPrice sellPrice 4444 圆锯 150 150 40 45.00 125.00 3333 Cooking Range 50 50 20 450.00 850.00 . . . 总库存:$#########.## 商店中的商品总数:_____________
...
输入格式:
itemID itemName pOrdered manufPrice sellPrice
使用七个并行向量来存储信息。该程序必须至少包含以下功能:一种将数据输入到向量中,一种用于显示菜单,一种用于销售商品,以及一种用于为经理打印报告。
我的代码:
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <iomanip>
using namespace std;
// Function Prototypes
void getInventory (ifstream& infile, vector<string>& itemID, vector<string>& itemName,
vector<int>& pOrdered, vector<int>& pInStore, vector<int>& pSold,
vector<double>& manufPrice, vector<double>& sellingPrice);
void displayMenu (vector<string>& itemID, vector<string>& itemName, vector<int>& pOrdered,
vector<int>& pInStore, vector<int>& pSold, vector<double>& manufPrice,
vector<double>& sellingPrice);
void sellItem (vector<string>& itemID, vector<string>& itemName, vector<int>& pOrdered,
vector<int>& pInStore, vector<int>& pSold, vector<double>& manufPrice,
vector<double>& sellingPrice);
void searchItem (vector<string>& itemID, vector<string>& itemName, vector<int>& pOrdered,
vector<int>& pInStore, vector<int>& pSold, vector<double>& manufPrice,
vector<double>& sellingPrice);
void printReport (vector<string>& itemID, vector<string>& itemName, vector<int>& pOrdered,
vector<int>& pInStore, vector<int>& pSold, vector<double>& manufPrice,
vector<double>& sellingPrice);
//Driver Function: Open File, Get Inventory, Display Menu, Close File.
int main() {
//Vectors
vector<int> itemQuantity;
vector<string> itemID;
vector<string> itemName;
vector<int> pOrdered;
vector<int> pInStore;
vector<int> pSold;
vector<double> manufPrice;
vector<double> sellingPrice;
// External Inventory File
ifstream infile;
infile.open("inventory.txt");
if (!infile)
{
cout << "Error opening inventory file! " << endl;
return 1;
}
getInventory (infile, itemID, itemName, pOrdered, pInStore, pSold, manufPrice, sellingPrice);
displayMenu (itemID, itemName, pOrdered, pInStore, pSold, manufPrice, sellingPrice);
infile.close();
return 0;
}
// Get Inventory Definition
void getInventory (ifstream& infile, vector<string>& itemID, vector<string>& itemName, vector<int>& pOrdered,
vector<int>& pInStore, vector<int>& pSold, vector<double>& manufPrice, vector<double>& sellingPrice)
{
// Declaring some Temp variables.
string item;
string name;
int ordered;
double mPrice;
double sPrice;
while (infile)
{
infile >> item;
infile.ignore(100,'\n'); // process the new-line character
getline(infile,name);
infile >> name >> ordered >> mPrice >> sPrice;
itemID.push_back(item);
itemName.push_back(name);
pOrdered.push_back(ordered);
manufPrice.push_back(mPrice);
sellingPrice.push_back(sPrice);
}
pInStore = pOrdered;
}
// Display Menu Definition
void displayMenu (vector<string>& itemID, vector<string>& itemName, vector<int>& pOrdered,
vector<int>& pInStore, vector<int>& pSold, vector<double>& manufPrice,
vector<double>& sellingPrice)
{
char menuAnswer;
cout << "Type 'C' to check if an item is in stock." << endl;
cout << "Type 'S' to sell an item to a customer." << endl;
cout << "Type 'R' to print an inventory report." << endl;
cin >> menuAnswer;
if (menuAnswer == 'C' || menuAnswer == 'c')
searchItem(itemID, itemName, pOrdered, pInStore, pSold, manufPrice, sellingPrice);
if (menuAnswer == 'S' || menuAnswer == 's')
sellItem(itemID, itemName, pOrdered, pInStore, pSold, manufPrice, sellingPrice);
if (menuAnswer == 'R' || menuAnswer == 'r')
printReport(itemID, itemName, pOrdered, pInStore, pSold, manufPrice, sellingPrice);
}
// Sell Item
void sellItem (vector<string>& itemID, vector<string>& itemName, vector<int>& pOrdered,
vector<int>& pInStore, vector<int>& pSold, vector<double>& manufPrice,
vector<double>& sellingPrice)
{
int itemNumber;
int amtBought;
double cash;
char verifyItem;
int i;
cout << "Enter, or scan the Item ID. ";
cin >> itemNumber;
i = itemNumber;
if (i != -1)
{
cout << "You are selling " << itemName[i] << ", which costs $"
<< sellingPrice[i] << "Is this correct? (Y/N)" << endl;
cout << endl;
cin >> verifyItem;
if (verifyItem == 'N' || verifyItem == 'n')
{
cout << "What item number is being purchased? " << endl;
cin >> itemNumber;
}
cout << "How many items are being purchased? " << endl;
cin >> amtBought;
if (amtBought < 1)
cout << "None of this item is being purchased!" << endl;
else
{
if (pInStore[i] < amtBought)
cout << "Only " << pInStore[i] << " of these items can be sold." << endl;
else
{
cout << "The total price of this transaction is " << amtBought * sellingPrice[i] << endl;
cout << "Enter amount given." << endl;
cin >> cash;
pInStore[i] = pInStore[i] - amtBought;
cout << "The change is $" << cash - (amtBought * sellingPrice[i]) << endl;
cout << "Have a nice day!" << endl;
}
}
}
}
// Search Item Definition
void searchItem (vector<string>& itemID, vector<string>& itemName, vector<int>& pOrdered,
vector<int>& pInStore, vector<int>& pSold, vector<double>& manufPrice,
vector<double>& sellingPrice)
{
int number;
cout << "Which item would you like to check?" << endl;
cout << endl;
cin >> number;
for (number = 0; number < 5; number++)
if (pInStore[number] > 0)
cout << "There are " << pInStore[number] << "of that item available." << endl;
}
// Print Report Definition
void printReport (vector<string>& itemID, vector<string>& itemName, vector<int>& pOrdered,
vector<int>& pInStore, vector<int>& pSold, vector<double>& manufPrice,
vector<double>& sellingPrice)
{
unsigned int i;
int totalItems = 0;
double totalInventory = 0;
cout << " AJ's Hardware Store " << endl << endl;
cout << "itemID ItemName pOrdered pInStore pSold manufPrice sellingPrice" << endl;
cout << fixed << showpoint;
cout << setprecision(2);
for (i = 0; i < itemID.size(); i++)
{
cout << left;
cout << setw(7) << itemID.at(i);
cout << setw(15) << itemName.at(i);
cout << right;
cout << setw(8) << pOrdered.at(i);
cout << setw(9) << pInStore.at(i);
cout << setw(6) << pSold.at(i);
cout << setw(11) << manufPrice.at(i);
cout << setw(13) << sellingPrice.at(i) << endl;
totalInventory += pInStore.at(i) * sellingPrice.at(i);
totalItems += pInStore.at(i);
}
cout << endl;
cout << "Total Inventory: $" << totalInventory << endl;
cout << "Total number of items in the store: " << totalItems << endl;
}
我遇到了一个从未遇到过的分段错误,本章(Ch16.23 Malik 8th Edition)对我来说是新的。我相信我尝试加载向量的方式有问题,我似乎无法弄清楚。
提前感谢您的任何指导。
解决方案
分段错误错误是因为您正在访问不允许(或尚未考虑)的内存。考虑使用“push_back”(或我不知道的其他一些函数)将项目插入向量。这就是向向量添加新项目的方式。
而这部分代码没有任何意义:
...
cin >> number;
for (number = 0; number < 5; number++)
if (pInStore[number] > 0)
cout << "There are " << pInStore[number] << "of that item available." << endl;
...
我还建议制作如下所示的结构类型,然后创建它的向量。因为您需要知道向量的项目与另一个项目中的哪个项目相关:
struct itemName {
int itemName;
int itemID; // or something that is unique for each item( product )
}
通过这种方式,您可以在项目(产品)的不同属性之间建立关系。
推荐阅读
- google-cloud-platform - 无法将实体导入数据存储模拟器
- c# - 如何在我的 iis8 c# web-api 应用程序上找到所有网络打印机?
- python - Pandas 滚动聚合函数列表。值错误:没有结果
- python - 在 Python 的 Kivy 中使用 Config 设置 maxfps 不会限制 fps
- xaml - 闪烁 ListView 加载 Xamarin.forms
- android - Flutter:无法更新访问被拒绝
- javascript - 如何使用字典提高性能?
- javascript - 在具有 Empire 主题的 Shopify 商店中将 gtag 跟踪代码放在哪里?
- c - 使用宏在运行时堆栈中优雅地创建可变大小的“二维指针”列表
- pytorch - pytorch - 具有动量的 GroupNorm