2017-02-12 3 views
1

Я знаю, что есть способы улучшить и упростить способы сделать это, но для моего класса это единственное, что я могу использовать и просто работать с тем, что у меня есть ,Переместить остальных членов массива Struct после сортировки одного из его членов

Я работаю над проектом меню инвентаря, и мне нужно отсортировать номер «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 << "\n\t\t Manage Inventory Menu\n\n" 
      << "1. Display inventory sorted by sku\n" 
      << "2. Lookup a product by sku\n" 
      << "3. Lookup a product by name\n" 
      << "4. Quit the Program\n\n" 
      << "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; 
} 

ответ

1

Вы должны поменять всю 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; 
    } 
+0

Hii спасибо! Я пробовал это так, но это дает мне ошибку: ошибка не может преобразовать «инвентарь» в «int» в присваивании и не подходит для оператора =, поскольку типы операндов - «инвентарь» и «int ' –

+0

@MariaFernanda, какая ошибка вы получаете? Ошибка времени компиляции? Ошибка времени выполнения? –

+0

Это, вероятно, потому, что у вас все еще есть 'int temp;'. –

0

Самый простой способ сохранить массив указателей товарно-структур. Отсоедините элементы от одного и того же условия product[count]->sku > product[count + 1]->sku , но вместо того, чтобы менять значения sku, поменяйте product[count] и product[count+1]. Я надеюсь, что это помогает. You can see here how to initalize an array of pointers to struct

Источник: http://www.cplusplus.com/forum/beginner/13778/

+0

Привет Ramzah, спасибо за ответ, я попытался это, но это дает мне пару ошибок довольно много о том, что он не может сравнить «инвентаризацию» типа (который является структура} до и INT –

+0

На какой линии вы получаете ошибку? –

Смежные вопросы