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

Пример из книги "Как программировать на С++" - C++

Восстановить пароль Регистрация
 
Капитан Техно
 Аватар для Капитан Техно
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 32
06.01.2012, 14:35     Пример из книги "Как программировать на С++" #1
Доброго времени суток форумчане! Читал книгу и наткнулся на такой пример:
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
#include <iostream>
#include <iomanip>
 
using namespace std;
 
void  bubble(int *, const int, int(*)(int, int));
int ascending(const int, const int);
int descending(const int, const int);
 
int main()
{
    const int arraySize = 10;
    int order, trunk[arraySize] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37};
 
    cout << "Введите 1 для сортировки в возрастающем порядке," << endl
           << "Введите 2 для сортировки в убывающеееем порядке: ";
    cin  >> order;
    cout << endl << "Элементы данных в исходном порядке" << endl;
 
    for(int counter = 0; counter < arraySize; counter++)
           cout << setw(4) << trunk[counter];
 
    if(order == 1) {
        bubble(trunk, arraySize, ascending);
        cout << endl << "Элементы данных в возрастающем порядке"
             << endl;
    }else{
        bubble(trunk, arraySize, descending);
        cout << endl << "Элементы данных в убывающеееем порядке"
             << endl;
    }
    for(int counter = 0; counter < arraySize; counter++)
        cout << setw(4) << trunk[counter];
 
    cout << endl;
 
return 0;
}
 
void bubble(int *work, const int size, int (*compare)(int, int))
{
    void swap(int *, int *)
 
    for(int pass = 1, pass < size; pass++)
        for(int count = 0; count < size - 1; count++)
            if((*compare)(work[count], work[count + 1]))
                swap(&work[count], &work[count + 1]);
}
 
void swap(int *element1Ptr, int *element2Ptr)
{
    int temp;
 
    temp = *element1Ptr;
    *element1Ptr = *element2Ptr;
    *element2Ptr = temp;
}
 
int ascending(const int aInt, const int bInt)
{
    return bInt < aInt;
}
 
int descending(const int aInt, const int bInt)
{
    return bInt > aInt;
}
не могу понять как используются и работают вот эти две функции:
C++
1
2
3
4
5
6
7
8
9
int ascending(const int aInt, const int bInt)
{
    return bInt < aInt;
}
 
int descending(const int aInt, const int bInt)
{
    return bInt > aInt;
}
что они делают я понял - возвращают выражение/значение(кому как угодно) а вот как это выражение/значение(де-жа-вю) использует bubble, я не очень понимаю, вот вижу что работает, что указывает в каком порядке сортировать, а вот понять механизм не могу, кто чем может - буду рад, с меня в репу +
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.01.2012, 14:35     Пример из книги "Как программировать на С++"
Посмотрите здесь:

Не работает программа из книги Дейтела "Как программировать на с++" C++
Прошу ссылку на книгу Дейтел "Как программировать на C" (не С++) C++
C++ Непонятный пример из книги Дейтел Как программировать на C++
Нужен диск, что шел с книгой "Ф. Глассборо, Р. Аллен. Как научиться программировать на языке C++" C++
C++ Книги по С++ (что читать после книги Дейтела "Как программировать на С++")
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
06.01.2012, 14:42     Пример из книги "Как программировать на С++" #2
C++
1
2
3
4
for(int pass = 1, pass < size; pass++)
    for(int count = 0; count < size - 1; count++)
        if((*compare)(work[count], work[count + 1]))
            swap(&work[count], &work[count + 1]);
Если передать туда descending, то работа данной функции будет аналогична этой
C++
1
2
3
4
for(int pass = 1, pass < size; pass++)
    for(int count = 0; count < size - 1; count++)
        if(work[count] < work[count + 1])
            swap(&work[count], &work[count + 1]);
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
06.01.2012, 14:49     Пример из книги "Как программировать на С++" #3
Капитан Техно, по сути эти две функции - это предикаты, т.е. функции, определяющие истинность/ложность некоего утверждения. В данном случае функция ascending проверяет, не больше ли первый её параметр второго. В случае, если это так, она возвращает истину, иначе ложь. Вторая функция проверяет, меньше ли первый её параметр второго. Таким образом, сортировка происходит не по явному условию, а по значению функции-предиката. Т.е. в программу вносится гибкость. Не будь этих функций-предикатов, нам пришлось бы писать две функции сортировки:
C++
1
2
3
4
5
6
7
8
9
void ascending_bubble(int *work, const int size)
{
    void swap(int *, int *)
 
    for(int pass = 1, pass < size; pass++)
        for(int count = 0; count < size - 1; count++)
            if(work[count + 1] < work[count]))
                swap(&work[count], &work[count + 1]);
}
и
C++
1
2
3
4
5
6
7
8
9
void descending_bubble(int *work, const int size)
{
    void swap(int *, int *)
 
    for(int pass = 1, pass < size; pass++)
        for(int count = 0; count < size - 1; count++)
            if(work[count + 1] > work[count]))
                swap(&work[count], &work[count + 1]);
}
Т.е. просто подставив тело соответствующего предиката в само условие обмена. А так мы просто передаём указатель на функцию, проверяющую условие обмена, в функцию сортировки. Получается, что если у нас появится гипотетический третий вариант обмена, мы должны не заново написать функцию сортировки, а просто дописать один-единственный предикат для этого случая.
Капитан Техно
 Аватар для Капитан Техно
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 32
06.01.2012, 15:05  [ТС]     Пример из книги "Как программировать на С++" #4
Спасибо вам, буду вникать в ваши ответы, если что спрошу ещё что нибудь
Yandex
Объявления
06.01.2012, 15:05     Пример из книги "Как программировать на С++"
Ответ Создать тему
Опции темы

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