如何更改 C++ 中乘法事物的属性?

编程


我目前正在使用 C++ 开发一个简单的管理系统,可以处理工人、项目和存储。 我目前有一个changeItem() 方法,可以更改项目的属性(项目可以是小圆面包、纸片等)。 属性之一是位置。 位置是存储的名称(箱子、冰箱等)。

当我进行此更改(将项目从 storage1 移动到 storage2)时,storage1 中的剩余空间应增加移动量。 storage2 的剩余空间应减少移动量。

问题: 但是,当发生这种情况时,属性不会发生变化,并且 storage1 不会获得剩余空间。

澄清说明:当您创建一个项目时,它会存储到一个或多个存储中。 然后您可以根据需要将其移动到另一个存储。 发生这种情况时,remainingSpace 属性应根据移动的量进行更改。

管理项目.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

管理存储.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

我尝试过的:

我尝试搞乱 moveItemToStorage() 方法,但我仍然没有让它工作。 也许这非常简单,但我让它变得比需要的更难。

解决方案1

在“changeItem”函数中将项目的位置从一个更改为另一个时,处理剩余空间的方式不正确。

当您更改项目的位置时,您会调用“moveItemToStorage”函数,但不会检查移动是否完成。 如果不计算移动,则不会更新旧存储的剩余空间。

您应该修改“moveItemToStorage”函数以返回一个布尔值,显示移动是否完成。 在您的“changeItem”函数中,在更新旧存储的剩余空间之前检查返回值,用这部分更新您的代码 –

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;
    }
}

コメント

タイトルとURLをコピーしました