С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Капитан Техно
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 32
#1

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

06.01.2012, 14:35. Просмотров 781. Ответов 3
Метки нет (Все метки)

Доброго времени суток форумчане! Читал книгу и наткнулся на такой пример:
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, я не очень понимаю, вот вижу что работает, что указывает в каком порядке сортировать, а вот понять механизм не могу, кто чем может - буду рад, с меня в репу +
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.01.2012, 14:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Пример из книги "Как программировать на С++" (C++):

Книги по С++ (что читать после книги Дейтела "Как программировать на С++") - C++
Добрый день господа!!! Я от можно сказать дочитываю Дейтела &quot;Как программировать на С++&quot; 5 издание, и от думаю какую следующую книгу...

Не работает программа из книги Дейтела "Как программировать на с++" - C++
Помогите, пожалуйста, решить проблему. Программа из раздела книги &quot;Отделение интерфейса от реализации&quot;. При компиляции(использую visual c++...

Непонятный пример из книги Дейтел Как программировать на C++ - C++
Вот сделал скриншот. Хотя я точно так пишу, но выскакивает ошибка при компиляции. А почему? error: expected ',' or ';' before '{' token|

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания" - C++
Создать класс Книга поля: название книги,количество страниц,год издания методы: вычислить сколько лет книге и количество дней прошедших...

Посоветуйте, что учить после Дейтелей "Как программировать на С++" - C++
Доброго времени суток, я начинающий программист(если так можно сказать), вот закончил изучать книгу Дейтелей &quot;Как программировать на С++&quot;,...

Перевод из двоичной системы в десятичную, задача 2.30 "Как программировать на С++" - C++
Здравствуйте! Не могу решить задачу из книги. Задача Введите целые данные, содержащие только нули и единицы (т.е. «двоичные»...

3
soon
2542 / 1307 / 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]);
1
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 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]);
}
Т.е. просто подставив тело соответствующего предиката в само условие обмена. А так мы просто передаём указатель на функцию, проверяющую условие обмена, в функцию сортировки. Получается, что если у нас появится гипотетический третий вариант обмена, мы должны не заново написать функцию сортировки, а просто дописать один-единственный предикат для этого случая.
1
Капитан Техно
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 32
06.01.2012, 15:05  [ТС] #4
Спасибо вам, буду вникать в ваши ответы, если что спрошу ещё что нибудь
0
06.01.2012, 15:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.01.2012, 15:05
Привет! Вот еще темы с ответами:

Прошу ссылку на книгу Дейтел "Как программировать на C" (не С++) - C++
Яндекс и другие дают много ссылок на книгу &quot;Как программировать на С&quot;, но в подавляющем большинстве случаев это ссылки на книгу с похожим...

Нужен диск, что шел с книгой "Ф. Глассборо, Р. Аллен. Как научиться программировать на языке C++" - C++
Здравствуйте! Может кто-нибудь сможет мне помочь...В общем у меня есть книга &quot;Ф. Глассборо,Р. Аллен. Как научиться программировать на...

Работа с книгой "Как программировать на C++" - C++
Решил заняться программированием на C++ с нуля по книге &quot;Как программировать на C++&quot;. Сколько можно в день тратить времени на занятие,...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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