[ad_1]
私は現在、ワーカー、アイテム、ストレージを処理できる単純な管理システムを 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:
<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; } }
[ad_2]
コメント