You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 01:36:00