Click here to Skip to main content
15,886,873 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I am currently working on a simple management system in C++ that can handle workers, items, and storage. I currently have a changeItem() method that changes an attribute of an item (items are anything like buns, pieces of paper, etc.). One of the attributes is location. Location is the name of a storage (box, fridge, etc.).

When I make this change (move the item from storage1 to storage2), the remaining space in storage1 should increase by the amount moved. And storage2's remaining space should be decreased by the amount moved.

Problem: However, when this happens, the changes in the attributes do not occur and storage1 does not gain remaining space.

Clarity note: When You create an item, it gets stored into a storage or multiple storages. Then you can move it to another storage as needed. When this happens, the remainingSpace attribute should change by the amount moved.

ManageItems.hpp:
#ifndef MANAGEITEMS_HPP
#define MANAGEITEMS_HPP

struct item {
    string name;
    string arrivalDate;
    string expirationDate;
    string location;
    double price;
    double quantity;
};

vector<item> itemData;

// Function to move items to storage
bool moveItemToStorage(item& newItem, const string& storageName, bool updateSpace = true) {
    bool storageFound = false;
    double remainingQuantity = newItem.quantity;

    // Check if the specified storage exists
    for (auto& storageItem : storageData) {
        if (storageItem.name == storageName) {
            storageFound = true;

            // Check if the specified storage has enough space
            if (newItem.quantity <= storageItem.remainingSpace) {
                if (updateSpace) {
                    storageItem.remainingSpace -= newItem.quantity; // Update remaining space for specified storage
                    remainingQuantity = 0;
                }    
            } else {
                remainingQuantity = newItem.quantity - storageItem.remainingSpace;
                
                if (updateSpace) {
                    storageItem.remainingSpace = 0; // Update remaining space for specified storage
                }    
            }

            break;
        }
    }

    // If specified storage doesn't exist or doesn't have enough space, try alternative storage
    if ((!storageFound || remainingQuantity > 0) && updateSpace) {
        for (auto& altStorage : storageData) {
            if (altStorage.name != storageName && altStorage.remainingSpace > 0) {
                double spaceAvailable = altStorage.remainingSpace;

                if (remainingQuantity <= spaceAvailable) {
                    cout << "Alternatively, you can store the remaining quantity of " << newItem.name << " in " << altStorage.name << endl;
                    altStorage.remainingSpace -= remainingQuantity; // Update remaining space for alternative storage
                    remainingQuantity = 0;
                    return true;
                } else {
                    cout << "Alternatively, you can store the remaining quantity of " << newItem.name << " in " << altStorage.name << " (" << spaceAvailable << " available)" << endl;
                    altStorage.remainingSpace = 0; // Update remaining space for alternative storage
                    remainingQuantity -= spaceAvailable;
                }
            }
        }
    }

    // If there are remaining items not stored, print a message
    if (remainingQuantity > 0) {
        cout << remainingQuantity << " " << newItem.name << " remain outside of storage" << endl;
        return false;
    }

    return true;
}

// Display all item names
void displayItemNames() {
    for (int i = 0; i < itemData.size(); i++) {
        cout << itemData[i].name;
    
        if (i != itemData.size() - 1) {
            cout << ", ";
        } else {
            cout << endl << endl;
        }
    }
}

void createItem() {
    item newItem;
    cout << "Enter the name of the item: ";
    cin >> newItem.name;

    //Check if the item name exists
    for (const auto& itemEntry : itemData) {
        if (itemEntry.name == newItem.name) {
            cout << "Error: Item name already exists" << endl;
            return;
        }
    }

    cout << "Enter the day of arrival (Month dd, yyyy): ";
    cin.ignore();
    getline(cin, newItem.arrivalDate);
    
    if (!isDateValid(newItem.arrivalDate)) {
        cout << "Error: Invalid arrival date format" << endl << endl;
        return;
    }

    cout << "Enter the expiration date (Month dd, yyyy): ";
    getline(cin, newItem.expirationDate);
    
    if (!isDateValid(newItem.expirationDate)) {
        cout << "Error: Invalid expiration date format" << endl << endl;
        return;
    }

    if (!isDateBefore(newItem.arrivalDate, newItem.expirationDate)) {
        cout << "Error: Arrival date must be before expiration date" << endl << endl;
        return;
    }

    string storageName;
    cout << "Enter the storage where the item shall be stored: ";
    cin >> storageName;
    newItem.location = storageName;
    
    // Check if the storage exists
    bool storageFound = false;
    
    for (auto& storageItem : storageData) {
        //If the storage name input is found
        if (storageItem.name == storageName) {
            storageFound = true;
            cout << "Enter the quantity of items received: ";
            cin >> newItem.quantity;

            // Move the item to the specified storage
            moveItemToStorage(newItem, storageName);
            break;
        }
    }
    
    //Storage name input is not found
    if (!storageFound) {
        cout << "Storage does not exist" << endl << endl;
        newItem.location = "No Storage Location";
        
        cout << "Enter the quantity of the item incoming: ";
        cin >> newItem.quantity;
        cout << endl << "Enter the price of the items: ";
        cin >> newItem.price;
        cout << endl;
    }

    cout << newItem.name << " successfully added to items array" << endl << endl;
    itemData.push_back(newItem);
}

// Function to modify attributes of an item
void changeItem() {
    if (itemData.empty()) {
        cout << "No items found" << endl << endl;
        return;
    }

    cout << "Current items: ";
    displayItemNames();

    string itemName;
    cout << "Enter the name of the item you want to edit: ";
    cin >> itemName;

    // Find the item with the given name
    auto it = find_if(itemData.begin(), itemData.end(), [&](const item& i) {
        return i.name == itemName;
    });

    if (it == itemData.end()) {
        cout << "Item not found" << endl << endl;
        return;
    }
    
    //Choose what they wish to change
    while (true) {
        cout << "Choose the attribute to change:" << endl;
        cout << "1. Arrival Date" << endl;
        cout << "2. Expiration Date" << endl;
        cout << "3. Location" << endl;
        cout << "4. Price" << endl;
        cout << "5. Quantity" << endl;
        cout << "6. End editing" << endl;
    
        int choice;
        cin >> choice;
    
        if (choice == 1) {
            // Change arrival date
            cout << "Old Arrival Date: " << it->arrivalDate << endl;
            cout << "Enter new Arrival Date (Month Day, Year): ";
            cin.ignore();
            getline(cin, it->arrivalDate);
            cout << endl << "You must also change the expiration date" << endl;
            
            // Change expiration date
            cout << "Old Expiration Date: " << it->expirationDate << endl;
            cout << "Enter new Expiration Date (Month Day, Year): ";
            getline(cin, it->expirationDate);
        } else if (choice == 2) {
            // Change expiration date
            cout << "Old Expiration Date: " << it->expirationDate << endl;
            cout << "Enter new Expiration Date (Month Day, Year): ";
            cin.ignore();
            getline(cin, it->expirationDate);
        } else if (choice == 3) {
            // Change location of item
            cout << "Old Location: " << it->location << endl;
            string newLocation;
            cout << "Enter new Location: ";
            cin >> newLocation;

            // Move the item to the new location
            moveItemToStorage(*it, newLocation);
        } else if (choice == 4) {
            // Change the price
            cout << "Old Price: $" << it->price << endl;
            cout << "Enter new Price: ";
            cin >> it->price;
        } else if (choice == 5) {
            // Change the quantity of the item
            cout << "Old Quantity: " << it->quantity << endl;
            cout << "Enter new Quantity: ";
            double oldQuantity = it->quantity;
            cin >> it->quantity;

            // Update remaining space for the storage
            double quantityDifference = it->quantity - oldQuantity;
            
            if (quantityDifference != 0) {
                // If quantity is increased, reduce remaining space; if decreased, increase remaining space
                for (auto& storage : storageData) {
                    if (storage.name == it->location) {
                        if (quantityDifference > 0) {
                            // Decrease remaining space
                            storage.remainingSpace -= quantityDifference;
                        } else {
                            // Increase remaining space
                            storage.remainingSpace += (-quantityDifference);
                        }
                        
                        break;
                    }
                }
            }
        } else if (choice == 6) {
            // Stop editing the attributes
            break;
        } else {
            cout << "Invalid option" << endl << endl;
            return;
        }
    }    

    cout << "Attribute(s) changed successfully" << endl << endl;
}

#endif



ManageStorage.hpp:
C++
<pre>#ifndef MANAGESTORAGE_HPP
#define MANAGESTORAGE_HPP

struct storage {
    string name;
    double temperature;
    int maxCapacity;
    int remainingSpace;
};

vector<storage> storageData;

void displayStorageNames() {
    // Display all storage names
    for (int i = 0; i < storageData.size(); i++) {
        cout << storageData[i].name;
    
        if (i != storageData.size() - 1) {
            cout << ", ";
        } else {
            cout << endl << endl;
        }
    }
}

void createStorage() {
    storage newStorage;
    cout << "Enter the name of the new storage container: ";
    cin >> newStorage.name;
    
    //Check if the storage name already exists
    for (const auto& storageItem : storageData) {
        if (storageItem.name == newStorage.name) {
            cout << "Error: Storage name already exists" << endl << endl;
            return;
        }
    }

    cout << "Enter the average temperature of the storage in fahrenheit: ";
    cin >> newStorage.temperature;
    cout << "Enter the maximum amount items the storage can handle: ";
    cin >> newStorage.maxCapacity;
    newStorage.remainingSpace = newStorage.maxCapacity; // Initialize remaining space
    storageData.push_back(newStorage);
    cout << newStorage.name << " successfully added to storages array" << endl << endl;
}
#endif



What I have tried:

I tried messing with the moveItemToStorage() method, but I still haven't gotten it to work. Maybe it's super easy and I am making it harder than it needs to be.
Posted
Comments
jeron1 6-Mar-24 12:49pm    
Stepping through the code using a debugger yields no clues?
That New Coder 6-Mar-24 12:51pm    
@jeron1 Nope, the code compiles and throws no errors. It's just the act of changing some values that fails (it still compiles, the values just don't change as needed).
Richard MacCutchan 6-Mar-24 12:55pm    
Just because it compiles does not mean that the code does what you expect. Use the debugger to step through it so you can actually see where it is not updating values correctly.
That New Coder 6-Mar-24 12:58pm    
Sorry for the confusion. However, my "debugger" is less of a debugger and more of a terminal. It is very minimalistic and does not do much other than give me error codes (when it doesn't compile) and allow me to view output and do inputs. It does not give me anything else to work with or do. So I have no clue where my code fails. I just have to guesstimate based on what I have made so far.
Richard MacCutchan 6-Mar-24 13:33pm    
OK, then you need to put some logging messages into your code to get the information.

1 solution

The way you handle the remaining space when changing the location of an item from one to the other in your 'changeItem' function is incorrect.

When you change the location of the item, you call the 'moveItemToStorage' function, but you're not checking whether the move was done or not. If the move is not counted, the remaining space for the old storage won't be updated.

You should modify the 'moveItemToStorage' function to return a boolean showing whether the move was done or not. In your 'changeItem' function, check the return value before updating the remaining space for the old storage, update your code with this part -

C++
} else if (choice == 3) {
    cout << "Old Location: " << it->location << endl;
    string newLocation;
    cout << "Enter new Location: ";
    cin >> newLocation;

    //Move your item to the new location...
    bool moveSuccess = moveItemToStorage(*it, newLocation);

    if (moveSuccess) {
        //If moved, update remaining space for the old storage...
        for (auto& storage : storageData) {
            if (storage.name == it->location) {
                storage.remainingSpace += it->quantity; 
                //Increase the remaining space...
                break;
            }
        }
    } else {
        cout << "Move to new location failed. Remaining space not updated." << endl;
    }
}
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900