【解決方法】C++ で乗算の属性を変更するにはどうすればよいですか?


私は現在、ワーカー、アイテム、ストレージを処理できる単純な管理システムを C++ で作成しています。 現在、アイテムの属性を変更するchangeItem()メソッドがあります(アイテムとは、パンや紙などのあらゆるものです)。 属性の 1 つは場所です。 場所は保管場所 (ボックス、冷蔵庫など) の名前です。

この変更を行うと (項目を storage1 から storage2 に移動します)、storage1 の残りのスペースは、移動した分だけ増加するはずです。 そして、storage2 の残りのスペースは、移動した分だけ減少するはずです。

問題: ただし、これが発生すると、属性の変更は発生せず、storage1 には残りのスペースが獲得されません。

明確にするためのメモ: アイテムを作成すると、そのアイテムは 1 つまたは複数のストレージに保存されます。 その後、必要に応じて別のストレージに移動できます。 これが発生した場合、remainingSpace 属性は移動した量だけ変化するはずです。

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

ストレージの管理.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をコピーしました