C++硬件店库存管理项目:打印/二分查找/排序功能报错求助
代码核心问题点
- Item类缺少需求要求的当前库存、售出数量两个属性,也未实现类比较运算符,导致排序、查找逻辑直接报错
- 输入输出运算符重载逻辑不符合格式化要求,打印报表时内容无分隔
- 二分查找逻辑边界错误,存在数组越界风险
- main函数switch分支未加break,存在分支穿透问题
- 输入文件重复打开,会导致读取失败
- 缺失售卖商品函数
makeSale的实现
修复后完整代码
#include <iostream> #include <fstream> #include <iomanip> #include <vector> #include <string> #include <limits> #include <algorithm> using namespace std; class Item { private: int itemID = 0; string itemName = ""; int pOrdered = 0; int pInstock = 0; // 当前库存,初始等于订购量 int pSold = 0; // 售出数量,初始为0 double manufPrice = 0; double sellingPrice = 0; public: Item() {}; Item(int ID, string name, int quantityOrdered, double mPrice, double sPrice) { itemID = ID; itemName = name; pOrdered = quantityOrdered; pInstock = quantityOrdered; pSold = 0; manufPrice = mPrice; sellingPrice = sPrice; }; // 对外暴露商品名称用于比较 string getName() const { return itemName; } // 对外暴露库存、售价、售出计数用于售卖逻辑 int getStock() const { return pInstock; } double getPrice() const { return sellingPrice; } void sell(int num) { pInstock -= num; pSold += num; } // 重载比较运算符,按商品名称比较 bool operator<(const Item& other) const { return this->itemName < other.itemName; } bool operator==(const string& name) const { return this->itemName == name; } bool operator>(const string& name) const { return this->itemName > name; } friend istream& operator>>(istream& inp, Item& item) { inp >> item.itemID; inp.ignore(numeric_limits<streamsize>::max(), '\n'); getline(inp, item.itemName); inp >> item.pOrdered >> item.manufPrice >> item.sellingPrice; item.pInstock = item.pOrdered; item.pSold = 0; inp.ignore(numeric_limits<streamsize>::max(), '\n'); return inp; }; friend ostream& operator<<(ostream& os, const Item& item) { os << left << setw(12) << item.itemID << setw(20) << item.itemName << setw(10) << item.pOrdered << setw(8) << item.pInstock << setw(10) << item.pSold << setw(10) << fixed << setprecision(2) << item.manufPrice << setw(10) << fixed << setprecision(2) << item.sellingPrice; return os; }; }; void menu() { cout << "\n欢迎来到友好五金店!" << endl; cout << "请选择以下操作: " << endl; cout << "1. 查询商品是否在售 " << endl; cout << "2. 购买商品 " << endl; cout << "3. 查询商品价格 " << endl; cout << "4. 打印库存清单 " << endl; cout << "9. 退出程序 " << endl; cout << "请输入选项编号:"; }; void getData(ifstream& inp, vector<Item>& items) { Item item; while (inp >> item) items.push_back(item); // 读取完成后直接按商品名排序 sort(items.begin(), items.end()); }; int binSearch(const vector<Item>& items, string searchItem) { int first = 0; int last = items.size() - 1; int mid; bool found = false; while (first <= last && !found) { mid = (first + last) / 2; if (items[mid] == searchItem) found = true; else if (items[mid] > searchItem) last = mid - 1; else first = mid + 1; } if (found) { cout << searchItem << " 在售。" << endl; return mid; } else { cout << searchItem << " 未在售。" << endl; return -1; } }; void makeSale(vector<Item>& items) { string itemName; int buyNum; cout << "请输入要购买的商品名称:"; cin.ignore(); getline(cin, itemName); int idx = binSearch(items, itemName); if (idx == -1) return; cout << "请输入购买数量:"; cin >> buyNum; if (buyNum <= 0 || buyNum > items[idx].getStock()) { cout << "购买数量无效,当前库存为:" << items[idx].getStock() << endl; return; } items[idx].sell(buyNum); cout << "购买成功,总金额为:" << fixed << setprecision(2) << buyNum * items[idx].getPrice() << "元" << endl; } void printReport(const vector<Item>& items) { cout << "\n 友好五金店库存报表" << endl; cout << left << setw(12) << "商品ID" << setw(20) << "商品名称" << setw(10) << "订购量" << setw(8) << "库存" << setw(10) << "销量" << setw(10) << "进价" << setw(10) << "售价" << endl; cout << string(80, '-') << endl; for (const auto& p : items) { cout << p << endl; } cout << endl; }; int main() { ifstream infile("storeInventory.txt"); if (!infile.is_open()) { cout << "库存文件打开失败,请检查文件是否存在" << endl; return 1; } vector<Item> items; getData(infile, items); infile.close(); int choice; do { menu(); cin >> choice; switch (choice) { case 1: { cout << "请输入商品名称: " << endl; string search; cin.ignore(); getline(cin, search); binSearch(items, search); break; } case 2: makeSale(items); break; case 3: { cout << "请输入要查询的商品名称: " << endl; string search; cin.ignore(); getline(cin, search); int idx = binSearch(items, search); if (idx != -1) { cout << search << "的售价为:" << fixed << setprecision(2) << items[idx].getPrice() << "元" << endl; } break; } case 4: printReport(items); break; case 9: cout << "程序即将退出。" << endl; break; default: cout << "输入无效,请重新输入。" << endl; } } while(choice != 9); return 0; }
内容的提问来源于stack exchange,提问作者Kristen N
相关产品推荐
相关产品推荐

