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

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

Восстановить пароль Регистрация
 
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.05.2013, 20:43     Быстрая сортировка для массива обьектов пользовательского класса #1
Насколько я знаю в Си++ есть встроеная ф-ция быстрой сортировки. Как нею воспользоваться для сортировки массива обьектов моего класса? Хочу посортировать массив " 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++ Не работает быстрая сортировка для двумерного массива
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);
}
metaluga145
243 / 244 / 20
Регистрация: 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);
}
o33ik
138 / 5 / 1
Регистрация: 25.03.2013
Сообщений: 228
14.05.2013, 21:33  [ТС]     Быстрая сортировка для массива обьектов пользовательского класса #17
metaluga145, большое спасибо. очень помогли)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2013, 21:35     Быстрая сортировка для массива обьектов пользовательского класса
Еще ссылки по теме:

Быстрая сортировка двумерного массива C++
C++ Быстрая сортировка массива
C++ Быстрая сортировка двумерного массива

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

Или воспользуйтесь поиском по форуму:
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
14.05.2013, 21:35     Быстрая сортировка для массива обьектов пользовательского класса #18
o33ik, только Вам надо эту функцию написать в правильном месте, чтобы она и доступ имела, и указатель на нее можно было передать
Yandex
Объявления
14.05.2013, 21:35     Быстрая сортировка для массива обьектов пользовательского класса
Ответ Создать тему
Опции темы

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