كيف يمكنني تغيير سمة مضاعفة الأشياء في C++؟


أعمل حاليًا على نظام إدارة بسيط بلغة C++ يمكنه التعامل مع العمال والعناصر والتخزين. لدي حاليًا طريقة ChangeItem() التي تغير إحدى سمات عنصر ما (العناصر هي أي شيء مثل الكعك أو قطع الورق وما إلى ذلك). إحدى السمات هي الموقع. الموقع هو اسم مخزن (صندوق، ثلاجة، إلخ).

عندما أقوم بإجراء هذا التغيير (نقل العنصر من التخزين 1 إلى التخزين 2)، يجب أن تزيد المساحة المتبقية في التخزين 1 بمقدار الكمية المنقولة. ويجب تقليل المساحة المتبقية للتخزين 2 بمقدار الكمية المنقولة.

مشكلة: ومع ذلك، عندما يحدث هذا، لا تحدث تغييرات في السمات ولا يحصل Storage1 على المساحة المتبقية.

ملاحظة واضحة: عندما تقوم بإنشاء عنصر، يتم تخزينه في وحدة تخزين أو مخازن متعددة. ومن ثم يمكنك نقله إلى وحدة تخزين أخرى حسب الحاجة. عندما يحدث هذا، يجب أن تتغير سمة المساحة المتبقية بمقدار المبلغ الذي تم نقله.

إدارة العناصر.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:

سي ++
<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”، تحقق من قيمة الإرجاع قبل تحديث المساحة المتبقية للتخزين القديم، وقم بتحديث الكود الخاص بك بهذا الجزء –

سي ++
} 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をコピーしました