переключать структуры со структурами и массивами? - PullRequest
0 голосов
/ 18 мая 2009

У меня был предыдущий вопрос об организации некоторых входов по имени, идентификатору, а затем сумме. Теперь, когда я понял, как их организовать, мне нужно иметь 3 выхода; первый по имени, второй по идентификатору, а последний по сумме. Могу ли я использовать регистр и переключение операторов? Каждый раз, когда я пытался, все три выхода были по имени.

вот что у меня есть:

void GeneralSort(const int SortItem, const int count, CustomerProfile c[])
{   
string tempname;
string tempid;
float tempamount;

for(int iteration = 1; iteration < count; iteration ++)
{
    for(int n = 0; n < (count-iteration); n++)
    {
        if(c[n].CustomerName > c[n+1].CustomerName)
        {
            tempname = c[n].CustomerName;
            c[n].CustomerName = c[n+1].CustomerName;
            c[n+1].CustomerName = tempname;
        }

        if(c[n].CustomerId > c[n+1].CustomerId)
        {
            tempid = c[n].CustomerId;
            c[n].CustomerId = c[n+1].CustomerId;
            c[n+1].CustomerId = tempid;
        }

         if(c[n].AmountDue > c[n+1].AmountDue)
        {
            tempamount = c[n].AmountDue;
            c[n].AmountDue = c[n+1].AmountDue;
            c[n+1].AmountDue = tempamount
        }

как мне получить остальные данные, чтобы они имели 2-й выход по идентификатору и 3-й вывод по сумме. Я думаю, что вы можете добавить операторы переключения, но когда я устал, все три выхода были по первому набору, который по имени. любая помощь приветствуется. я не ожидаю, что кто-нибудь решит все это за меня, просто совет, чтобы указать мне правильное направление.

пример вывода:

//by name

name    id    amount
able       b2     24
bob     g3     68 
carry   a4     12

//by id
name    id    amount
carry   a4      12
able    b2      24
bob     g3      68

//by amount

name    id     amount 
carry   a4      12
able    b2      24  
bob     g3      68

Ответы [ 3 ]

3 голосов
/ 18 мая 2009

То, что вы сейчас делаете со своей функцией, это смешивание атрибутов ваших данных вместо их сортировки. Вы должны либо использовать флаг для различия столбца для сортировки, либо 3 функции sortByName, sortByID и sortByAmout. И ваши если не правы. Вместо

if(c[n].CustomerName > c[n+1].CustomerName)
{
   tempname = c[n].CustomerName;
   c[n].CustomerName = c[n+1].CustomerName;
   c[n+1].CustomerName = tempname;
}

это должно сказать что-то вроде

CustomerProfile tempItem;

if(c[n].CustomerName > c[n+1].CustomerName)
{
    tempItem = c[n];
    c[n] = c[n+1];
    c[n+1] = tempItem;
}
0 голосов
/ 18 мая 2009

Вы должны использовать для этого std :: sort вместо написания собственного кода сортировки, если только у вас нет исключительно веской причины написать свой собственный.

Написание собственного текста менее понятно, менее эффективно и в этом случае содержит дублированный код.

Редактировать: Хорошо, недопустимость использования сортировки - веская причина.

В этом случае мой совет - попытаться преобразовать ваш код в функции и попытаться сделать так, чтобы каждая функция выполняла только одно. Таким образом, дублирование должно стать очевидным и может быть устранено.

Код, который вы опубликовали, пытается сделать как минимум четыре вещи в одном большом фрагменте. Попробуйте отделить ваш код сортировки от того, что вы сортируете. Тогда вы сможете выделить каждый из трех способов сортировки.

0 голосов
/ 18 мая 2009

Ваш предыдущий вопрос принятым ответом было использование функции std :: sort.

Чтобы сделать то, что вы хотите, у вас должно быть 3 разные функции сортировки

  1. sortByName
  2. sortById
  3. sortByAmount

Затем вы просто вызываете std :: sort с соответствующей функцией

std::sort(customers.begin(), customers.end(), &sortByName);
//print your collection here
std::sort(customers.begin(), customers.end(), &sortById);
//print your collection here
std::sort(customers.begin(), customers.end(), &sortByAmount);
//print your collection here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...