返回时数组丢失值(库存/菜单程序)C ++

时间:2018-05-09 19:58:30

标签: c++ arrays function

因此,在大多数情况下,我理解我做错了什么,问题是我不知道如何解决它。

目标:这是一个商店管理系统,必须包含可以操作的菜单和库存管理功能。为此,我使用数组来添加商店的商品,描述和数量。所有数组都部分填充到第三个元素,最大值为10个元素。

问题:当程序第一次运行时,用户可以看到他们的库存,描述和数量。然而,当他们退出菜单并返回库存时,清除了第三个元素之后的所有内容。这是因为声明将数组初始化超过第三个元素为0.如何解决此问题以保证用户保存其库存并在返回时查看它?

#include <iostream>       
#include <vector>
#include <fstream>
#include <string>
#include <cmath>
#include <cstdlib>


using namespace std;

//declarations
int mainMenu(); //done
void inventoryMgmt();
void addInv(); //working on
void invView(string x[], int sizeofArray, string y[], int secondArray, int z[], int thirdArray);
void editor(string x[], int sizeofArray, string y[], int secondArray, int z[], int thirdArray);
void customerReciept();  //done
void calculatePrice(); //done
void exit(); //done

const double massTax = 0.0625;

//main
int main() {
    int choice;
    bool repeat = true;

    while (repeat = true) {
        choice = mainMenu();

        switch (choice) {
        case 1:
            customerReciept();
            break;
        case 2:
            inventoryMgmt();
            break;
            //case 3:
            //itemSearcher();
            //break;
        case 4:
            exit();
            repeat = false;
            break;
        }
    }

    return 0;
}

//main menu function ***done
int mainMenu() {
    cout << "\n\n\t\t\t\t Welcome to the Massasoit Store Management System " << endl;
    cout << "\t\t\t\t ________________________________________________ \n\n";
    cout << "\t\t\t\t\t Main Menu: " << endl;
    cout << "\t\t\t\t\t\t 1. Customer Reciept" << endl;
    cout << "\t\t\t\t\t\t 2. Inventory Management" << endl;
    cout << "\t\t\t\t\t\t 3. Item Search" << endl;
    cout << "\t\t\t\t\t\t 4. Exit" << endl << endl;
    int choice;
    cout << "\t\t\t\t\t\t Where do you need to go?: ";
    cin >> choice;

    while (choice < 1 || choice > 4) {
        cout << "\t\t\t\t\t Incorrect Selection Please Select Again: ";
        cin >> choice;
    }
    return choice;
}

//customer reciept function  **done
void customerReciept() {
    cout << "\n\n\t\t\t\t Welcome to the Massasoit Store: Customer Reciept " << endl;
    cout << "\t\t\t\t ________________________________________________ \n\n";
    cout << "\t\t\t\t\t Receipt Menu: " << endl;
    cout << "\t\t\t\t\t\t 1. Calculate Receipt" << endl;
    cout << "\t\t\t\t\t\t 2. Return to Main" << endl;
    int recieptChoice;
    cout << "\t\t\t\t\t\t Where do you need to go?: ";
    cin >> recieptChoice;
    while (recieptChoice < 1 || recieptChoice > 2) {
        cout << "Invalid Selection Please Choose Again: ";
        cin >> recieptChoice;
    }
    if (recieptChoice == 1) {
        calculatePrice();
    }
}

void calculatePrice() {
    double cost;
    double taxAmount;
    int numOfItems;
    double finalCost = 0;
    char tax;
    int i;
    cout << "\n\n\t\t\t\t Welcome to the Massasoit Store: Customer Reciept " << endl;
    cout << "\t\t\t\t ________________________________________________ \n\n";
    cout << "How many items were purchased?: ";
    cin >> numOfItems;
    for (i = 0; i < numOfItems; i++) {
        cout << "What did item " << i + 1 << " cost? $";
        cin >> cost;
        cout << "Is this item taxable? (y/n):";
        cin >> tax;
        if (tax == 'y' || tax == 'Y') {

            taxAmount = (cost * massTax);
            cost = taxAmount + cost;
            finalCost = cost + finalCost;
        }
        else {
            finalCost = cost + finalCost;
        }
    }
    cout.setf(ios::fixed);
    cout.setf(ios::showpoint);
    cout.precision(2);
    cout << "This customer's total is $" << finalCost << endl;
}

void inventoryMgmt() {

    int invChoice;
    cout << "\n\n\t\t\t\t\t Welcome to Inventory Management " << endl;
    cout << "\t\t\t\t ______________________________________________ \n\n";
    cout << "\t\t\t\t\t Inventory Settings: " << endl;
    cout << "\t\t\t\t\t\t 1. Add/View & Edit/Delete Inventory" << endl;
    cout << "\t\t\t\t\t\t 2. Return to Main" << endl;
    cout << "\t\t\t\t\t\t Where do you need to go?: ";
    cin >> invChoice;
    cout << endl << endl;
    while (invChoice < 1 || invChoice > 2) {
        cout << "Invalid Selection Please Choose Again: ";
        cin >> invChoice;
    }
    if (invChoice == 1) {

        addInv();
    }
    if (invChoice == 2) {
        //edit/delete();
    }
}

void addInv() {
    //so when this is called, everything is initialized to 0 which makes it wipe the memory
    //when the user comes back to it from the menu.

    const int description = 20; //this allows a short description for each item
    const int counter = 10; //slots of inventory allowed
    int quantity[10] = {10, 15, 45};
    string itemArray[counter] = { "Hot Drinks", "Cold Drinks", "Books"};
    string descriptionArray[description] = { "Coffee, Tea etc", "Water, juice, etc", "Texts, notebook, etc"};
    char addChoice;
    int destination;
    cout << "\t\t\t\t\t\t 1. Add/View" << endl;
    cout << "\t\t\t\t\t\t 2. Edit/Delete" << endl;
    cout << "\t\t\t\t\t\t 3. Exit to Main" << endl;
    cout << "\t\t\t\t\t\t Where would you like to go?: " << endl;
    cin >> destination;

    while (destination < 1 || destination > 3) {
        cout << "Invalid Selection, Please Select Again: ";
        cin >> destination;
    }

    if (destination == 1) {
        cout << "Would you like to add an item? (y/n): ";
        cin >> addChoice;
        int i = 3;      //these two are initialized to three to ensure that the store 
        int ii = 3;     //will always have hot drinks, cold drinks and books as options 
        while (addChoice == 'y' && i < counter) {

            cout << "What would you like to add?: ";
            cin >> itemArray[i];
            cout << "You have added \"" << itemArray[i] << "\" to the inventory\n";
            cout << "Please Provide a Brief Description: ";
            cin.ignore();
            getline(cin, descriptionArray[ii]);
            cout << "You've described \"" << itemArray[i] << "\" as  \"" << descriptionArray[i] << "\"" << endl;
            cout << "What is the quantity of " << itemArray[i] << " in stock?";
            cin >> quantity[i];
            cout << "Would you like to add another item?";
            cin >> addChoice;
            i++;
            ii++;
            if (i > counter) {
                cout << "**INVENTORY LIMIT REACHED*** ";
            }
        }
        invView(itemArray, 10, descriptionArray, 10, quantity, 10); //working on this. //so use this for view, edit, and delete.
    }
}

void invView(string x[], int sizeofArray, string y[], int secondArray, int z[], int thirdArray) {   //add quantity

    int i = 0;
    int ii = 0;
    int iii = 0;
    cout << "Your inventory consists of: ";
    while (i < sizeofArray && x[i] != "" && ii < secondArray && y[i] != "" && iii < thirdArray) {
        cout << x[i] << " - " << y[i] << " | Quantity: " << z[i] << endl;
        i++;
        ii++;
    }
}

void editor(string x[], int sizeofArray, string y[], int secondArray, int z[], int thirdArray) {
    cout << "Which item would you like to edit?";
}

void exit() {
    cout << "\n\n\t\t\t\t Welcome to the Massasoit Store Management System " << endl;
    cout << "\t\t\t\t ________________________________________________ \n\n";
    cout << "\t\t\t\t Thank you for using the Massasoit Store Management System" << endl;
    exit(1);
}

我在需要的时候包含了整个代码。问题集中在inventoryMgmt()和addInv()函数。 在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

addInv()中,所有数组都是本地的。一旦该函数执行完毕,所有局部变量都会被释放,从而导致您的删除。请尝试将它们放在addInv()函数之外:

    int main(){
        int quantity[10] = {10, 15, 45};
        string itemArray[counter] = { "..."};
        string descriptionArray[description] = { "..."};

    void addInv() {...}
    }