Массивы теряют значение при возврате (инвентарь / программа меню) C ++ - PullRequest
0 голосов
/ 09 мая 2018

Так что по большей части я понимаю, что я сделал неправильно, проблема в том, что я не знаю, как это исправить.

Цель: это система управления магазином, которая должна включать меню и функции управления запасами, которыми можно манипулировать. Для этого я использовал массивы для добавления товаров магазина, их описания и количества. Все массивы частично заполнены третьим элементом и имеют максимальное значение из десяти элементов.

Проблема: Когда программа запускается в первый раз, она работает, и пользователь может видеть их инвентарь, описание и количество. Однако, когда они выходят в меню и возвращаются в инвентарь, все, что находится за третьим элементом, очищается. Это происходит из-за объявлений, инициализирующих массивы после третьего элемента равными 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 голосов
/ 10 мая 2018

В addInv() все массивы локальные. По завершении выполнения этой функции все локальные переменные освобождаются, что приводит к удалению. Попробуйте разместить их вне вашей addInv() функции:

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

    void addInv() {...}
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...