Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/146: Рейтинг темы: голосов - 146, средняя оценка - 4.66
0 / 0 / 1
Регистрация: 03.12.2011
Сообщений: 43
1

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

17.12.2011, 14:09. Показов 26626. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В общем есть структура

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
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.12.2011, 14:09
Ответы с готовыми решениями:

функция qsort при сортировке массива структур
Заголовочный файл: #include &lt;stdio.h&gt; #include &lt;ctype.h&gt; #include &lt;string.h&gt; #include...

Qsort для массива структур
Да, знаю, что таких тем на форуме уже полно, как и кода, но смысл мне всё равно непонятен. Есть...

Qsort() для сортировки структур по дате (struct tm)
Здравствуйте. Стоит задача отсортировать массив структур timetable, одно из поле которой -...

std::sort/qSort. Реализация сортировки с заданной функцией сортировки в классе. must use '.*' or '->*' to call
Доброго времени суток. Столкнулся с проблемой. Необходимо отсортировать элементы в списке Qt (то...

16
программист С++
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
17.12.2011, 14:20 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;
}
3
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.12.2011, 14:22 3
https://www.cyberforum.ru/cpp-... ost2194577

Не по теме:

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

1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
17.12.2011, 14:27 4
Dark2012, Сортировка массива структур по одному полю на Си
И с языком программирования всё-таки определитесь, на С++ как-то правильнее sort() использовать...
1
0 / 0 / 1
Регистрация: 03.12.2011
Сообщений: 43
17.12.2011, 14:30  [ТС] 5
Спасибо, народ начал заниматься программированием меньше месяца назад, не бейте)...Пока что еще даже к синтаксису не привык не то что б знать что лучше использовать)
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
17.12.2011, 14:37 6
Dark2012, важно понять - С и С++ разные языки программирования. При этом С считается подмножеством С++ (то есть в большинстве случаев программа на С будет и программной на С++, обратное не верно). Но если всётаки пишете на С++ то и использовать нужно средства этого языка, а не унаследованные из С.
1
0 / 0 / 1
Регистрация: 03.12.2011
Сообщений: 43
17.12.2011, 16:05  [ТС] 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 минуты
не не разобрался....все равно ошибки выдает....
0
программист С++
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
17.12.2011, 16:13 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
1
0 / 0 / 1
Регистрация: 03.12.2011
Сообщений: 43
17.12.2011, 17:06  [ТС] 9
Блин, вот я нуб...Спасибо)!

Добавлено через 52 минуты
блин программа запускается но не фига не сортируется..., в чем может быть дело?
0
программист С++
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
17.12.2011, 17:15 10
Dark2012, при вызове надо указывать sizeof(User) - то есть структуры, а не массива
1
0 / 0 / 1
Регистрация: 03.12.2011
Сообщений: 43
17.12.2011, 17:19  [ТС] 11
Да, все заработало! Спасибо!
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
04.01.2012, 15:04 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/... 92a3d1a0d9
http://liveworkspace.org/code/... 2f1fa21458
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
04.01.2012, 15:24 13
go, но программа-то с одинаковым успехом компилируется и С и С++ компилятором. Вот выполняется действительно по-разному. И этот случай далеко не единственный. Тут на форуме ещё с десяток похожих различий найдёте. С и С++ разные языки, а про подмножество, если не ошибаюсь, у Дейтлов прочитал, и честно говоря не вижу причины не согласиться...
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
04.01.2012, 15:55 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); 
}
И их масса.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
04.01.2012, 16:05 15
go, и что это доказывает? Все эти куски можно переписать так, что они будут компилироваться и как С код, и как С++ (ну или не будут, как должно бы быть в последнем случае)
C
1
int * arr = (int*)malloc(sizeof(int) * 10);
C
1
static int i;
C
1
void foo(void){}
0
Jupiter
04.01.2012, 16:14
  #16

Не по теме:

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

0
Just Do It!
3841 / 2288 / 636
Регистрация: 23.09.2014
Сообщений: 7,073
Записей в блоге: 2
23.12.2017, 10:55 17
а вот я не сильно думая определил компаратор в теле класса, поэтому и зашел сюда

Добавлено через 18 минут
а всего то надо было добавить static
C++
1
2
3
static int compare (const void* a, const void* b)
    {   return ((sStat_dic*)a)->prioritet - ((sStat_dic*)b)->prioritet;
    }
0
23.12.2017, 10:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2017, 10:55
Помогаю со студенческими работами здесь

Напишите функцию сортировки, похожую на функцию которая использовалась для сортировки массивов, с той разницей, что ее а
Напишите функцию сортировки, похожую на функцию которая использовалась для сортировки массивов, с...

Сортировка массива структур с использованием qsort
Народ прошу помощи, нужно отсортировать массив структур с помощью функции qsort() typedef...

Процедура сортировки для структур
Пытаясь написать функцию сортировки процедур столкнулся с проблемой. Вод вид функции для обмена...

Сортировка массива структур без использования Qsort
Здравствуйте! Для сортировки массива структур я использовал стандартную функцию qsort(), но как...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru