在对结构数组的一个成员进行排序后,移动其成员的其余部分

Move the rest of member of an Struct Array after sorting one of its members

本文关键字:成员 排序 移动 余部 一个 数组 结构      更新时间:2023-10-16

我知道有更好、更简单的方法可以做到这一点,但对于我的类来说,这是我唯一可以使用的东西,只是使用我所拥有的东西。

正在处理一个库存菜单项目,我必须使用气泡排序对"sku"编号进行排序,现在我的问题是,我不知道如何同时移动其他成员。

每个 SKU 编号都有其产品名称、价格和数量。我拥有的代码仅对 sku 编号进行排序并且有效,唯一的问题是其余成员留在同一个地方。

我能做什么?

注意:该功能sortArray

#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstdlib>

using namespace std;
struct inventory {
  string name;
  int sku;
  int quantity;
  double price;
};
int size = 0;
void fillArray ( inventory[], int&, ifstream& );
void sortArray ( inventory[], int );
void displayIn ( inventory[], int );
int lookupSku ( inventory[], int, int );
int lookupName ( inventory[], int, string );
int main(){
  // Constants for menu choices
  const int DISPLAY_INVENTORY = 1,
            LOOKUP_SKU = 2,
            LOOKUP_NAME = 3,
            QUIT_CHOICE = 4;
  // Variables
  int choice;
  inventory products [100];
  ifstream fin;
  fin.open ("inventory.dat");
  if (!fin)
  {
    cout << endl << endl
         << " ***Program Terminated. *** " << endl << endl
         << " Input file failed to open. " << endl;
    system ( "PAUSE>NUL" );
    return 1;
  }
  fillArray ( products, size, fin );
  sortArray ( products, size );
   // Set up numeric output formatting.
   cout << fixed << showpoint << setprecision(2);
   do
   {
      // Display the menu.
      cout << "ntt Manage Inventory Menunn"
           << "1. Display inventory sorted by skun"
           << "2. Lookup a product by skun"
           << "3. Lookup a product by namen"
           << "4. Quit the Programnn"
           << "Enter your choice: ";
      cin >> choice;
      cout << endl;
      // Validate the menu selection.
      while (choice < DISPLAY_INVENTORY || choice > QUIT_CHOICE)
      {
         cout << "Please enter a valid menu choice: ";
         cin >> choice;
      }
      // Validate and process the user's choice.
      if (choice != QUIT_CHOICE)
      {
         int indexSku,
             indexName,
             skuChoice;
         string nameChoice;
         switch (choice)
         {
            case DISPLAY_INVENTORY:
                displayIn ( products, size );
            break;
            case LOOKUP_SKU:
                cout << "Enter the Sku number: ";
                cin >> skuChoice;
                indexSku = lookupSku( products, size, skuChoice );
                cout << "Product Name: " << products[indexSku].name << endl
                     << "Sku: " << products[indexSku].sku << endl
                     << "Quantity: " << products[indexSku].quantity << endl
                     << "Price: " << products[indexSku].price << endl;
            break;
            case LOOKUP_NAME:
                cout << "Enter name of product with no spaces: ";
                cin >> nameChoice;
                cout << endl;
                indexName = lookupName ( products, size, nameChoice );
                cout << "Product Name: " << products[indexName].name << endl
                     << "Sku: " << products[indexName].sku << endl
                     << "Quantity: " << products[indexName].quantity << endl
                     << "Price: " << products[indexName].price << endl;
            break;
         }
      }
   } while (choice != QUIT_CHOICE);
 fin.close ();
 return 0; 
}
void fillArray ( inventory product[], int &size, ifstream &fin )
{
  int counter = 0;
  while (fin >> product[counter].name)
  {
     fin >>  product[counter].sku>> product[counter].quantity
         >> product[counter].price;
     counter ++;
  }
  size = counter;
}
void sortArray ( inventory product[], int size )
{
   bool swap;
   int temp;
   do
   {
      swap = false;
      for (int count = 0; count < (size - 1); count++)
      {
         if ( product[count].sku > product[count + 1].sku )
         {
            temp = product[count].sku;
            product[count].sku = product[count + 1].sku;
            product[count + 1].sku = temp;
            swap = true;
         }
      }
   } while (swap);
}

void displayIn ( inventory product[], int size )
{
  for ( int i = 0; i < size; i++ )
  {
    cout << product[i].sku << "    " <<  product[i].quantity << "     "
         <<  product[i].price << "    " << setw(4) <<  product[i].name 
         <<endl;
  }
}
int lookupSku(inventory product[], int size, int value)
{
   int first = 0,
       last = size - 1,
       middle,
       position = -1;
   bool found = false;
   while (!found && first <= last)
   {
      middle = (first + last) / 2;
      if (product[middle].sku == value)
      {
         found = true;
         position = middle;
      }
      else if (product[middle].sku > value)
         last = middle - 1;
      else
         first = middle + 1;
   }
   return position;
}
int lookupName ( inventory product[], int size , string value )
{
   int first = 0,
       last = size - 1,
       middle,
       position = -1;
   bool found = false;
   while (!found && first <= last)
   {
      middle = (first + last) / 2;
      if (product[middle].name == value)
      {
         found = true;
         position = middle;
      }
      else if (product[middle].name > value)
         last = middle - 1;
      else
         first = middle + 1;
   }
   return position;
}
您需要

交换整个struct,而不仅仅是成员sku

    if ( product[count].sku > product[count + 1].sku )
     {
        inventory temp = product[count];
        product[count] = product[count + 1];
        product[count + 1] = temp;
        swap = true;
     }

最简单的方法是保留库存结构的指针数组。在相同条件下对元素进行排序product[count]->sku > product[count + 1]->sku但不是交换 SKU 值,而是交换product[count]product[count+1]。我希望它有所帮助。您可以在此处看到如何启动指向结构的指针数组

来源: http://www.cplusplus.com/forum/beginner/13778/