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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
#1

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

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

Насколько я знаю в Си++ есть встроеная ф-ция быстрой сортировки. Как нею воспользоваться для сортировки массива обьектов моего класса? Хочу посортировать массив " 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()
{
    
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2013, 20:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Быстрая сортировка для массива обьектов пользовательского класса (C++):

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

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

Быстрая сортировка и объекты класса - C++
На днях столкнулся с такой задачей. Попробую ее сформулировать. Дан класс. class A { ... vector&lt;double&gt; x; vector&lt;double&gt; y; ...

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

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

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

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

Не по теме:

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



Добавлено через 2 минуты
Вообще там ничего сложно нету. надо только создать функцию, которая будет сравнивать объекты вашего класса. Обычно это стандартный оператор "<", можно его перегрузить, а можно написать свою функцию
o33ik
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); она без параметров.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
14.05.2013, 21:08 #6
C++
1
qsort (values, 6, sizeof(int), compare);
здесь в функцию сортировки передается указатель на функцию сравнения, а не вызов функции. Она будет вызвана автоматически в самой сортировке и ей будет передано два параметра:а и b
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.05.2013, 21:09  [ТС] #7
metaluga145, то мне надо написать свою сompare, почти такую же как ета только чтоб сравнивались поля обьека?
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
14.05.2013, 21:10 #8
o33ik, да.
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.05.2013, 21:12  [ТС] #9
блин, чтото не очень понимаю. возможно в стандартную ф-цию сортировки отправить массив моих обьектов? или все не так просто будет?

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

для того,чтобы функция могла отсортировать объекты Вашего класса, ей надо знать как их сравнивать. Для этого и нужна функция сравнения
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.05.2013, 21:23  [ТС] #11
metaluga145, то как мне ее написать? меня ети звездочки *(int*)a - *(int*)b пугают, я не знаю как мне сделать такую ф-цию для моего класса. и при етом, если я метод сортировки напишу в классе SHOP(где массив обьектов класса GOODS есть одним из полей и будет вызов самой ф-ции сортировки) то фция будет иметь доступ к защищенным полям обьектов класса GOODS?
Eagle123
6 / 6 / 0
Регистрация: 03.10.2012
Сообщений: 51
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, и её прямо в заголовочном файле можно разместить
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.05.2013, 21:27  [ТС] #13
Eagle123, и все? ого, спасибо. реально помогли, а то я совсем запутался с етими указателями.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
14.05.2013, 21:27 #14
Цитата Сообщение от o33ik Посмотреть сообщение
metaluga145, то как мне ее написать? меня ети звездочки *(int*)a - *(int*)b пугают, я не знаю как мне сделать такую ф-цию для моего класса. и при етом, если я метод сортировки напишу в классе SHOP(где массив обьектов класса GOODS есть одним из полей и будет вызов самой ф-ции сортировки) то фция будет иметь доступ к защищенным полям обьектов класса GOODS?
Оно не будет иметь доступ к полю protected. Да и вообще ему это поле не надо,если функция сравнения написана правильно
o33ik
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);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2013, 21:28
Привет! Вот еще темы с ответами:

Быстрая сортировка массива - C++
Программа сортирует числа в valarray с помощью быстрой сортировки, но не все элементы. Помогите исправить код так, чтоб сортировались все...

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

Быстрая сортировка двумерного массива - C++
Возникла проблема с програмой в которой применяется быстрая сортировка двумерного массива. При попытке скомпилировать выдает ошибку: ...

Быстрая сортировка двумерного массива - C++
Нужно отсортировать двумерный массив по убыванию быстрой сортировкой. Вроде всё работает, но не сортирует. В чём может быть дело? ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.05.2013, 21:28
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru