Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2012, 13:30   #1
Arrioh
Пользователь
 
Регистрация: 25.03.2012
Сообщений: 60
Печаль упорядочить массив С++

Каким образом можно упорядочить массив User users /*см.код*/по его параметрам karma /*см.код*/ от меньшего к большему? Параметры карма упорядочить я смог. А вот как теперь исходя из них упорядочить "users" не знаю... SOS
Цитата:
#include <iostream>
#include <stdlib.h>
using namespace std;
int karmaCmp( const void *pa, const void *pb );

struct User
{
int id;
char nickname[51];
int karma;
};


void addKarma(User& user, int amount = 1)
{
user.karma += amount;
}

int main()
{

User user1 = {15, "picknick", 0};
User user2 = {18, "nickpick", 0};
User user3 = {19, "nickpuck", 0};

addKarma(user1);
addKarma(user2);
addKarma(user1);
addKarma(user3);
addKarma(user2, 2);

User users[]={user1,user2,user3};

int arrKarma[]= {user1.karma,user2.karma,user3.karm a};

qsort ( arrKarma, 3,sizeof(int),karmaCmp);

for(int i=0;i<=2;i++)
cout << arrKarma << endl;
}

int karmaCmp( const void *pa, const void *pb )
{
const int* a = reinterpret_cast<const int*>(pa);
const int* b = reinterpret_cast<const int*>(pb);

return*a -*b;

}
Arrioh вне форума Ответить с цитированием
Старый 04.04.2012, 16:06   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,292
По умолчанию

Просто ваша сортировка в корне неправильна.
Нужно сортировать не значения карм ( по сути, просто числа), а структуры по значению кармы.
Попробуйте так:
Код:
qsort(users, 3, sizeof(User), karmaCmp);
...
 int karmaCmp(const void* pa, const void* pb)
 {
     User *a = pa;
     User *b = pb;
     return a->karma - b->karma;
 }
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 04.04.2012, 17:17   #3
Arrioh
Пользователь
 
Регистрация: 25.03.2012
Сообщений: 60
По умолчанию

Выбивает ошибку: const void* can not be used to initialize an entity of type User*
int karmaCmp(const void* pa, const void* pb)
{
User *a = pa;
User *b = pb;
return a->karma - b->karma;
}
Arrioh вне форума Ответить с цитированием
Старый 04.04.2012, 17:40   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,292
По умолчанию

Код:
#include <iostream>
#include <stdlib.h>
using namespace std;
int karmaCmp( const void *pa, const void *pb );

struct User
{
    int id;
    char nickname[51];
    int karma;
};


void addKarma(User& user, int amount = 1)
{
    user.karma += amount;
}

int main()
{

    User user1 = {15, "num1", 0};
    User user2 = {18, "num2", 0};
    User user3 = {19, "num3", 0};

    addKarma(user1);
    addKarma(user2);
    addKarma(user1);
    addKarma(user3);
    addKarma(user2, 2);

    User users[]= {user1,user2,user3};

    qsort(users, 3, sizeof(User), karmaCmp);

    for(int i=0; i<=2; i++)
        cout << users[i].nickname <<' '<< users[i].karma << endl;
}

int karmaCmp(const void* pa, const void* pb)
{
    User *a = (User *)pa;
    User *b = (User *)pb;
    return a->karma - b->karma;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 04.04.2012, 19:23   #5
Arrioh
Пользователь
 
Регистрация: 25.03.2012
Сообщений: 60
По умолчанию

Все работает. Спасибо. Чудесно. Но не совсем понимаю как работает последняя функция... Простите за неграмотность. Если не сложно - попрошу ее детально прокомментировать. Заранее спасибо.
Arrioh вне форума Ответить с цитированием
Старый 04.04.2012, 19:53   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,292
По умолчанию

Честно говоря, когда я столкнулся с данной проблемой сам (с сортировкой кусортом), то я не сам дошел до правильного описания.
Постараюсь объяснить, как понимаю.
В функцию передаются два параметра типа указатель на неизвестный тип.
Создаем временные указатели в теле самой функции.
Для присвоения созданным указателям значений указываем, что переменные pa и pb типа указатель на структуру User (т.к. qsort передает указатели на значения массива, который сортирует).
Дальше все просто - обращаемся к полям стурктур, используя вместо конструкции *(a).karma конструкцию a->karma, и возвращаем разность, которая показывает, какой элемент считать большим.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
F1, как упорядочить массив marinasava Паскаль, Turbo Pascal, PascalABC.NET 0 22.12.2011 23:16
нужно упорядочить массив яна11 C++ Builder 0 24.04.2011 15:45
Упорядочить массив по невозрастанию! Cyber Помощь студентам 2 23.09.2010 09:31
одномерный массив. упорядочить serj-07 Помощь студентам 11 18.01.2010 01:28
Упорядочить массив в порядке возрастания и напечатать входной и исходный массив. TheVenny Помощь студентам 3 26.11.2008 15:06