Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
1

Быстрая сортировка для массива обьектов пользовательского класса

14.05.2013, 20:43. Показов 1500. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Насколько я знаю в Си++ есть встроеная ф-ция быстрой сортировки. Как нею воспользоваться для сортировки массива обьектов моего класса? Хочу посортировать массив " GOODS goods[GOODS_IN_SHOP] " за полем NAME по возростанию.

Кликните здесь для просмотра всего текста
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include <iostream>
#include <string>
#include <string.h>
 
#define GOODS_IN_SHOP 255
 
using namespace std;
 
class GOODS
{
protected:
    bool ANAVALIBLE;
    string NAME;
    string COUNT_TYPE;
    int COUNT;
    int PRICE;
    int PRICE_;
public:
    void SELL(int count)
    {
        COUNT=COUNT-count;
    }
    bool ANAVALIBLE(int count, string name)
    {
        if(COUNT>count && NAME==name)
            return true;
        else
            return false;
    }
    int REST(int get_money, int count)
    {
        return get_money - (PRICE+PRICE_)*count;
    }
    void ADD_NEW_GOOD(int numb)
    {
        cout << "\n\t\tGood #" << numb << "\n\tEnter Name:\n\t";
        cin >> NAME;
        cout << "\n\tEnter count type:\n\t";
        cin >> COUNT_TYPE;
        cout << "\n\tEnter count:\n\t";
        cin >> COUNT;
        cout << "\n\tEnter price:\n\t";
        cin >> PRICE;
        cout << "\n\tEnter mark-up:\n\t";
        cin >> PRICE_;
    }
}
 
class SHOP
{
protected:
    GOODS goods[GOODS_IN_SHOP];
    int ALL_CASH;
public:
     void ADD_GOOD(int position)
     {
         goods[position-1].ADD_NEW_GOOD(position);
     }
     int SELL(string good_name, int good_count, int money)
     {
         int NUMBER=-1;
         for(int i=0; i<GOODS_IN_SHOP; i++)
         {
             bool ANAV=false;
             ANAV = goods[i].ANAVALIBLE(good_count, good_name);
             if (bool ANAV=true)
             {
                 NUMBER = i;
                 break;
             }
             else
                 continue;
         }
         if(NUMBER>=0)
         {
            goods[NUMBER].SELL(good_count);
            ALL_CASH = ALL_CASH + money - goods[NUMBER].REST(money, good_count);
            return goods[NUMBER].REST(money, good_count);
         }
     }
}shop;
 
class DIRECTOR: SHOP
{
public:
    void TAKE_CASH()
    {
    }
    void GET_CASH()
    {
    }
    void ORDER_GOODS()
    {
    }
    void ADD_GOODS()
    {
        int position;
        cout << "\n\tEnter position in list, where you want add new good: ";
        cin >> position;
        shop.ADD_GOOD(position);
    }
}
 
 
class SELLER: SHOP
{
protected:
    int get_cash;
    int take_cash;
    string good_name;
    int good_count;
public:
    void SELL()
    {
        cout << "\n\tEnter name of good which you want buy: ";
        cin >> good_name;
        cout << "\n\tEnter count of good: ";
        cin >> good_count;
        cout << "\n\tPlease, take a money: ";
        cin >> get_cash;
        if (shop.SELL(good_name, good_count, get_cash)<0)
            cout << "\n\tNot enough money.";
        else
            cout << "\n\tThank you for your purchase. Your rest: " << shop.SELL(good_name, good_count, get_cash) << " . Come more) \n";
    }
}
 
void main()
{
    
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2013, 20:43
Ответы с готовыми решениями:

Классы. Сортировка обьектов класса
нужно отсортировать страны в континенте..программа вроде работает..но где-то ошибка..помогите...

Не работает быстрая сортировка для двумерного массива
Здравствуйте, возникла проблема, не работает быстрая сортировка по возрастанию абсолютных величин...

Быстрая сортировка и объекты класса
На днях столкнулся с такой задачей. Попробую ее сформулировать. Дан класс. class A { ......

Массив указателей объектов класса и их быстрая сортировка
Приветствую! Собственно, у меня есть: Класс Worker; Динамический массив, хранящий в себе объекты...

17
244 / 245 / 38
Регистрация: 08.04.2013
Сообщений: 927
14.05.2013, 20:50 2
тут хорошо написано
1
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.05.2013, 20:52  [ТС] 3
metaluga145, с англ немного туго, но всеравно спасибо. попробую чтото разобрать.
0
244 / 245 / 38
Регистрация: 08.04.2013
Сообщений: 927
14.05.2013, 20:56 4

Не по теме:

o33ik, гугл-переводчик поможет :)



Добавлено через 2 минуты
Вообще там ничего сложно нету. надо только создать функцию, которая будет сравнивать объекты вашего класса. Обычно это стандартный оператор "<", можно его перегрузить, а можно написать свою функцию
1
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.05.2013, 21:06  [ТС] 5
metaluga145, по ссылке увидел такой пример
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* qsort example */
#include <stdio.h>      /* printf */
#include <stdlib.h>     /* qsort */
 
int values[] = { 40, 10, 100, 90, 20, 25 };
 
int compare (const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}
 
int main ()
{
  int n;
  qsort (values, 6, sizeof(int), compare);
  for (n=0; n<6; n++)
     printf ("%d ",values[n]);
  return 0;
}
в ф-ции compare есть a и b. что ето за а и b? на примере того ж массива числ можете обьяснить? и ф-ция имеет два параметра а тут qsort (values, 6, sizeof(int), compare); она без параметров.
0
244 / 245 / 38
Регистрация: 08.04.2013
Сообщений: 927
14.05.2013, 21:08 6
C++
1
qsort (values, 6, sizeof(int), compare);
здесь в функцию сортировки передается указатель на функцию сравнения, а не вызов функции. Она будет вызвана автоматически в самой сортировке и ей будет передано два параметра:а и b
1
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.05.2013, 21:09  [ТС] 7
metaluga145, то мне надо написать свою сompare, почти такую же как ета только чтоб сравнивались поля обьека?
0
244 / 245 / 38
Регистрация: 08.04.2013
Сообщений: 927
14.05.2013, 21:10 8
o33ik, да.
0
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.05.2013, 21:12  [ТС] 9
блин, чтото не очень понимаю. возможно в стандартную ф-цию сортировки отправить массив моих обьектов? или все не так просто будет?

Добавлено через 55 секунд
еще ето я не очень понимаю *(int*)a - *(int*)b . блин, я плохо понимаю указатели(
0
244 / 245 / 38
Регистрация: 08.04.2013
Сообщений: 927
14.05.2013, 21:15 10
Цитата Сообщение от o33ik Посмотреть сообщение
блин
следите за цензурностью речи!

для того,чтобы функция могла отсортировать объекты Вашего класса, ей надо знать как их сравнивать. Для этого и нужна функция сравнения
1
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.05.2013, 21:23  [ТС] 11
metaluga145, то как мне ее написать? меня ети звездочки *(int*)a - *(int*)b пугают, я не знаю как мне сделать такую ф-цию для моего класса. и при етом, если я метод сортировки напишу в классе SHOP(где массив обьектов класса GOODS есть одним из полей и будет вызов самой ф-ции сортировки) то фция будет иметь доступ к защищенным полям обьектов класса GOODS?
0
6 / 6 / 2
Регистрация: 03.10.2012
Сообщений: 54
14.05.2013, 21:25 12
У тебя есть функция
C++
1
2
3
4
int comp(const void* a, const void* b)
{
return (*(int*)a) - (*(int*)b);
}
Так как на вход идет указатель на void, то в самой функции тебе надо привести его к твоему типу. В твоем случае тебе надо привести к типу GOODS. Ну и получается, что будет..
C++
1
2
3
4
int compare_name(const void* a, const void* b)
{
return strcmp(((GOODS*)a)->NAME, ((GOODS*)b)->NAME);
}
Добавлено через 1 минуту
А функция будет типа static int, и её прямо в заголовочном файле можно разместить
1
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.05.2013, 21:27  [ТС] 13
Eagle123, и все? ого, спасибо. реально помогли, а то я совсем запутался с етими указателями.
0
244 / 245 / 38
Регистрация: 08.04.2013
Сообщений: 927
14.05.2013, 21:27 14
Цитата Сообщение от o33ik Посмотреть сообщение
metaluga145, то как мне ее написать? меня ети звездочки *(int*)a - *(int*)b пугают, я не знаю как мне сделать такую ф-цию для моего класса. и при етом, если я метод сортировки напишу в классе SHOP(где массив обьектов класса GOODS есть одним из полей и будет вызов самой ф-ции сортировки) то фция будет иметь доступ к защищенным полям обьектов класса GOODS?
Оно не будет иметь доступ к полю protected. Да и вообще ему это поле не надо,если функция сравнения написана правильно
1
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.05.2013, 21:28  [ТС] 15
metaluga145, то по сути написать ету ф-цию, и сделать ее дружественной до класса GOODS?
C++
1
2
3
4
int compare_name(const void* a, const void* b)
{
return strcmp(((GOODS*)a)->NAME, ((GOODS*)b)->NAME);
}
0
244 / 245 / 38
Регистрация: 08.04.2013
Сообщений: 927
14.05.2013, 21:32 16
o33ik, да! только в Вашем случае можно не париться с const void*,а написать просто
C++
1
2
3
4
int compare_name(const GOODS* a, const GOODS* b)
{
    return strcmp(a->NAME, b->NAME);
}
1
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.05.2013, 21:33  [ТС] 17
metaluga145, большое спасибо. очень помогли)
0
244 / 245 / 38
Регистрация: 08.04.2013
Сообщений: 927
14.05.2013, 21:35 18
o33ik, только Вам надо эту функцию написать в правильном месте, чтобы она и доступ имела, и указатель на нее можно было передать
1
14.05.2013, 21:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.05.2013, 21:35
Помогаю со студенческими работами здесь

Быстрая сортировка(сортировка Хоара). Отсортировать фрагмент массива
Мне нужно отсортировать фрагмент массива, расположенный между первым и последним отрицательным...

Написать функцию для класса, возращающую данный из вектора обьектов класса по итератору вектора
День=добрый как написать функцию для класса возращающую данный из вектора обьектов класса по...

Быстрая сортировка (сортировка Хоара) для связных списков
есть у кого готовый алгоритм? или подскажите как реализовать

Быстрая сортировка массива
Помогите, как написать быструю сортировку для одномерного массива, если для этого нужно...


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

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