[ad_1]
我目前正在使用 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; } }
[ad_2]
コメント