[ad_1]
Saat ini saya sedang mengerjakan sistem manajemen sederhana di C++ yang dapat menangani pekerja, item, dan penyimpanan. Saat ini saya memiliki metode changeItem() yang mengubah atribut suatu item (item bisa berupa roti, potongan kertas, dll.). Salah satu atributnya adalah lokasi. Lokasi adalah nama tempat penyimpanan (kotak, lemari es, dll).
Saat saya melakukan perubahan ini (memindahkan item dari penyimpanan1 ke penyimpanan2), ruang yang tersisa di penyimpanan1 akan bertambah sesuai dengan jumlah yang dipindahkan. Dan sisa ruang penyimpanan2 harus dikurangi dengan jumlah yang dipindahkan.
Masalah: Namun, jika hal ini terjadi, perubahan pada atribut tidak terjadi dan penyimpanan1 tidak mendapatkan sisa ruang.
Catatan kejelasan: Saat Anda membuat item, item tersebut akan disimpan ke dalam satu penyimpanan atau beberapa penyimpanan. Kemudian Anda dapat memindahkannya ke penyimpanan lain sesuai kebutuhan. Jika hal ini terjadi, atribut sisaSpace akan berubah sesuai dengan jumlah yang dipindahkan.
KelolaItem.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
Kelola Penyimpanan.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
Apa yang saya coba:
Saya mencoba mengacaukan metode moveItemToStorage(), tetapi masih belum berhasil. Mungkin ini sangat mudah dan saya membuatnya lebih sulit dari yang seharusnya.
Solusi 1
Cara Anda menangani sisa ruang saat mengubah lokasi item dari satu item ke item lainnya di fungsi ‘changeItem’ Anda salah.
Saat Anda mengubah lokasi item, Anda memanggil fungsi ‘moveItemToStorage’, namun Anda tidak memeriksa apakah pemindahan telah dilakukan atau belum. Jika perpindahan tidak dihitung, sisa ruang penyimpanan lama tidak akan diperbarui.
Anda harus memodifikasi fungsi ‘moveItemToStorage’ untuk mengembalikan boolean yang menunjukkan apakah pemindahan telah dilakukan atau belum. Dalam fungsi ‘changeItem’ Anda, periksa nilai kembalian sebelum memperbarui sisa ruang untuk penyimpanan lama, perbarui kode Anda dengan bagian ini –
} 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]
コメント