[ad_1]
Tôi hiện đang làm việc trên một hệ thống quản lý đơn giản bằng C++ có thể xử lý nhân viên, vật phẩm và bộ nhớ. Tôi hiện có một phương thức ChangeItem() để thay đổi thuộc tính của một mặt hàng (các mặt hàng là bất cứ thứ gì như bánh mì, mảnh giấy, v.v.). Một trong những thuộc tính là vị trí. Vị trí là tên của nơi lưu trữ (hộp, tủ lạnh, v.v.).
Khi tôi thực hiện thay đổi này (di chuyển mục từ kho 1 sang kho 2), dung lượng còn lại trong kho 1 sẽ tăng theo số lượng đã di chuyển. Và dung lượng còn lại của storage2 sẽ giảm đi theo số lượng được di chuyển.
Vấn đề: Tuy nhiên, khi điều này xảy ra, những thay đổi về thuộc tính sẽ không xảy ra và storage1 không chiếm được dung lượng còn lại.
Lưu ý rõ ràng: Khi bạn tạo một mục, mục đó sẽ được lưu trữ vào một hoặc nhiều kho lưu trữ. Sau đó, bạn có thể di chuyển nó sang bộ lưu trữ khác nếu cần. Khi điều này xảy ra, thuộc tính không gian còn lại sẽ thay đổi theo số lượng được di chuyển.
Quản lýItems.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
Quản lýStorage.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
Những gì tôi đã thử:
Tôi đã thử sử dụng phương thức moveItemToStorage() nhưng vẫn không hoạt động. Có lẽ nó cực kỳ dễ dàng và tôi đang làm cho nó khó hơn mức cần thiết.
Giải pháp 1
Cách bạn xử lý khoảng trống còn lại khi thay đổi vị trí của một mục từ mục này sang mục khác trong chức năng ‘changeItem’ của bạn là không chính xác.
Khi bạn thay đổi vị trí của mục, bạn gọi hàm ‘moveItemToStorage’ nhưng bạn không kiểm tra xem việc di chuyển đã được thực hiện hay chưa. Nếu lượt di chuyển không được tính, dung lượng còn lại cho bộ nhớ cũ sẽ không được cập nhật.
Bạn nên sửa đổi hàm ‘moveItemToStorage’ để trả về một boolean cho biết việc di chuyển đã được thực hiện hay chưa. Trong hàm ‘changeItem’ của bạn, hãy kiểm tra giá trị trả về trước khi cập nhật dung lượng còn lại cho bộ nhớ cũ, hãy cập nhật mã của bạn với phần này –
} 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]
コメント