Форум программистов, компьютерный форум CyberForum.ru

Функция qsort для сортировки массивов структур - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 77, средняя оценка - 4.99
Dark2012
0 / 0 / 0
Регистрация: 03.12.2011
Сообщений: 43
17.12.2011, 14:09     Функция qsort для сортировки массивов структур #1
В общем есть структура

C++
1
2
3
4
5
6
struct User
{
    int id;
    char nickname[51];
    int karma;
};
далее я создаю массив структур, ну допустим из 10 элементов

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main()
{
  User user[10];
    
  for (int i = 0; i < 10; i++)
  {
    cout << "id  ";
    cin >> user[i].id;
    cout << "nickname  ";
    cin >> user[i].nickname;
    cout << "karma  ";
    cin >> user[i].karma;
    cout << endl << endl;
  }
  cout << endl;
  for (int i = 0; i < 10; i++)
  {
    cout << user[i].id << "  ";
    cout << user[i].nickname << "  ";
    cout << user[i].karma << endl << "  ";
    cout << endl << endl;
  }

Далее мне нужно отсортировать этот массив из структур по полю karma НО c помощью функции qsort
qsort(user, 10, sizeof(user), intCmp)

сложность в том что qsort вызывает внутри себя функцию (я назвал ее intCmp) которая принимает параметры const void*
эта функция и выполняет сравнение, ну допустим по увеличению (это неважно)
в Общем я не понимаю как можно вытащить именно поле user.karma

Как отсортировать данный массив без этой функции я знаю, интересует именно с помощью qsort
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2011, 14:09     Функция qsort для сортировки массивов структур
Посмотрите здесь:

Возникли трудности с функцией быстрой сортировки qsort C++
функция qsort при сортировке массива структур C++
Выполнить сортировку массива с помощью стандартной функции быстрой сортировки qsort C++
Выполнить сортировку массива с помощью стандартной функции быстрой сортировки qsort C++
C++ Напишите функцию сортировки, похожую на функцию которая использовалась для сортировки массивов, с той разницей, что ее а
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
17.12.2011, 14:20     Функция qsort для сортировки массивов структур #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Dark2012, просто приведи const void* к типу User* и вытащи свою карму)
типо того
C
1
2
3
4
int comparator(const void* v1, const void* v2)
{
 return (User*(v1))->karma < (User*(v2))->karma;
}
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.12.2011, 14:22     Функция qsort для сортировки массивов структур #3
http://www.cyberforum.ru/cpp-beginne...ml#post2194577

Не по теме:

Дата рождения
25.08.1986 (25)
в таком возрасте уже пора бы знать что поиск рулит

easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
17.12.2011, 14:27     Функция qsort для сортировки массивов структур #4
Dark2012, Сортировка массива структур по одному полю на Си
И с языком программирования всё-таки определитесь, на С++ как-то правильнее sort() использовать...
Dark2012
0 / 0 / 0
Регистрация: 03.12.2011
Сообщений: 43
17.12.2011, 14:30  [ТС]     Функция qsort для сортировки массивов структур #5
Спасибо, народ начал заниматься программированием меньше месяца назад, не бейте)...Пока что еще даже к синтаксису не привык не то что б знать что лучше использовать)
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
17.12.2011, 14:37     Функция qsort для сортировки массивов структур #6
Dark2012, важно понять - С и С++ разные языки программирования. При этом С считается подмножеством С++ (то есть в большинстве случаев программа на С будет и программной на С++, обратное не верно). Но если всётаки пишете на С++ то и использовать нужно средства этого языка, а не унаследованные из С.
Dark2012
0 / 0 / 0
Регистрация: 03.12.2011
Сообщений: 43
17.12.2011, 16:05  [ТС]     Функция qsort для сортировки массивов структур #7
в общем вроде бы все просто но блин не могу разобраться в чем ошибка....
подскажите плиз...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
using namespace std;
 
struct User 
{
    int id;
    char nickname[51];
    int karma;
}
 
int comp (const void* a, const void* b);
 
int main()
{
  User user[10];
    
  for (int i = 0; i < 10; i++)
  {
    cout << "id  ";
    cin >> user[i].id;
    cout << "nickname  ";
    cin >> user[i].nickname;
    cout << "karma  ";
    cin >> user[i].karma;
    cout << endl << endl;
  }
  cout << endl;
  for (int i = 0; i < 10; i++)
  {
    cout << user[i].id << "  ";
    cout << user[i].nickname << "  ";
    cout << user[i].karma << endl << "  ";
    cout << endl << endl;
  }
 
    qsort(user, 10, sizeof(user), comp);
    
    for (int i = 0; i < 10; ++i)
        {
          cout << user[i].id << endl;
          cout << user[i].nickname << endl;
          cout << user[i].karma << endl;
            }
       cout << endl;
 
cin.get();
cin.get();
return 0;
}
 
int comp(const void* a, const void* b)
{
    const User* k = (const User*)a;
    const User* m = (const User*)b;
    int s = ((k -> karma) - (m -> karma));
    
    return s;
}
Добавлено через 4 минуты
не не разобрался....все равно ошибки выдает....
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
17.12.2011, 16:13     Функция qsort для сортировки массивов структур #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
#include <cstdlib>
 
using namespace std;
 
struct User
{
        int id;
        char nickname[51];
        int karma;
};
 
int comp (const void* a, const void* b);
 
int main()
{
  User user[10];
 
  for (int i = 0; i < 10; i++)
  {
        cout << "id  ";
        cin >> user[i].id;
        cout << "nickname  ";
        cin >> user[i].nickname;
        cout << "karma  ";
        cin >> user[i].karma;
        cout << endl << endl;
  }
  cout << endl;
  for (int i = 0; i < 10; i++)
  {
        cout << user[i].id << "  ";
        cout << user[i].nickname << "  ";
        cout << user[i].karma << endl << "  ";
        cout << endl << endl;
  }
 
    qsort(user, 10, sizeof(user), comp);
 
        for (int i = 0; i < 10; ++i)
                {
                  cout << user[i].id << endl;
                  cout << user[i].nickname << endl;
                  cout << user[i].karma << endl;
                }
       cout << endl;
 
cin.get();
cin.get();
return 0;
}
 
int comp(const void* a, const void* b)
{
        const User* k = (const User*)a;
        const User* m = (const User*)b;
        int s = ((k -> karma) - (m -> karma));
 
        return s;
}
не забывайте ; после определения struct и class
Dark2012
0 / 0 / 0
Регистрация: 03.12.2011
Сообщений: 43
17.12.2011, 17:06  [ТС]     Функция qsort для сортировки массивов структур #9
Блин, вот я нуб...Спасибо)!

Добавлено через 52 минуты
блин программа запускается но не фига не сортируется..., в чем может быть дело?
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
17.12.2011, 17:15     Функция qsort для сортировки массивов структур #10
Dark2012, при вызове надо указывать sizeof(User) - то есть структуры, а не массива
Dark2012
0 / 0 / 0
Регистрация: 03.12.2011
Сообщений: 43
17.12.2011, 17:19  [ТС]     Функция qsort для сортировки массивов структур #11
Да, все заработало! Спасибо!
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
04.01.2012, 15:04     Функция qsort для сортировки массивов структур #12
Цитата Сообщение от easybudda Посмотреть сообщение
При этом С считается подмножеством С++ (то есть в большинстве случаев программа на С будет и программной на С++, обратное не верно).
Несмотря на то, что большая часть кода C будет справедлива и для C++, C++ не является надмножеством C и не включает его в себя.
Скомпилируйте этот код на С
C
1
2
3
4
5
6
7
#include <stdio.h>
 
int main()
{
    printf("%s\n", (sizeof('a') == sizeof(char)) ? "C++" : "C");
    return 0;
}
А теперь его же на С++
Сделаю за Вас
http://liveworkspace.org/code/543d47...380492a3d1a0d9
http://liveworkspace.org/code/9a58d9...50b92f1fa21458
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
04.01.2012, 15:24     Функция qsort для сортировки массивов структур #13
go, но программа-то с одинаковым успехом компилируется и С и С++ компилятором. Вот выполняется действительно по-разному. И этот случай далеко не единственный. Тут на форуме ещё с десяток похожих различий найдёте. С и С++ разные языки, а про подмножество, если не ошибаюсь, у Дейтлов прочитал, и честно говоря не вижу причины не согласиться...
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
04.01.2012, 15:55     Функция qsort для сортировки массивов структур #14
Цитата Сообщение от easybudda Посмотреть сообщение
но программа-то с одинаковым успехом компилируется и С и С++ компилятором.
Хорошо, а такой код
C
1
2
3
4
5
6
#include <stdlib.h>
 
int main ()
{ 
   int *arr = malloc ( sizeof (int) * 10 );
}
С++ его не "проглотит", так как там необходимо явно привести тип.
А вот такой
C
1
2
3
4
int main ()
{ 
   static i;
}
А такой
C
1
2
3
4
5
6
7
8
void foo ()
{
}
 
int main ()
{ 
   foo (1); 
}
И их масса.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
04.01.2012, 16:05     Функция qsort для сортировки массивов структур #15
go, и что это доказывает? Все эти куски можно переписать так, что они будут компилироваться и как С код, и как С++ (ну или не будут, как должно бы быть в последнем случае)
C
1
int * arr = (int*)malloc(sizeof(int) * 10);
C
1
static int i;
C
1
void foo(void){}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2012, 16:14     Функция qsort для сортировки массивов структур
Еще ссылки по теме:

C++ Написать функцию sort() для сортировки массива структур
C++ Отсортировать вектор структур по одной переменной через qsort
Qsort для массива структур C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Jupiter
04.01.2012, 16:14     Функция qsort для сортировки массивов структур
  #16

Не по теме:

к чему этот спор и некропостинг?

Yandex
Объявления
04.01.2012, 16:14     Функция qsort для сортировки массивов структур
Ответ Создать тему
Опции темы

Текущее время: 08:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru