有问题的C++程序(为学校),需要7个并行矢量



实验室问题:

编写一个程序来跟踪硬件商店的库存。这家商店出售各种项目。对于商店中的每件商品,都会保留以下信息:商品ID、商品名称、订购件数、当前件数在商店中,出售的件数、制造商对该商品的价格,以及商店的售价。每个周末,商店经理都会希望看到以下形式的报告:

友好的硬件商店itemID itemName p已订购p库存p旧制造商价格销售价格4444圆锯150 150 40 45.00 125.003333炉灶50 50 20 450.00 850.00。。。总库存:$############商店中的商品总数:_____________

输入格式:

itemIDitemNamep订单制造商价格销售价格

使用七个平行矢量来存储信息。程序必须包含至少有以下功能:一个用于将数据输入到矢量中,一个用于显示菜单,一个用于销售商品,另一个用于为经理打印报告。

我的代码:

#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第8版(对我来说是新的。我相信我加载矢量的方式有问题,我似乎就是搞不清楚。

提前感谢您的指导。

分段错误是因为您正在访问不允许访问的内存(或尚未考虑访问(。考虑使用";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 )
}

通过这种方式,您可以在项目(产品(的不同属性之间建立关系。

相关内容

最新更新