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

Непонятная автору функция - C++

Восстановить пароль Регистрация
 
LEQADA
Мастер кустарных методов
 Аватар для LEQADA
227 / 222 / 9
Регистрация: 09.11.2010
Сообщений: 680
16.11.2010, 14:56     Непонятная автору функция #1
Никак не пойму, что делает эта функция. Переведите пожалуйста на русский язык. Очень буду благодарен.

C++
1
2
3
4
5
6
7
8
Tree_node * & find_node( T find_value ) { 
    Tree_node *tn = root; 
    while ( (tn != 0) && (tn->val != find_value) ) { 
        if ( find_value < tn->val ) 
            tn = tn->left_child; 
        else 
            tn = tn->right_child; 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2010, 14:56     Непонятная автору функция
Посмотрите здесь:

C++ Метод половинного деления...(непонятная функция)
непонятная ошибка C++
Непонятная ошибка C++
C++ непонятная ошибка
C++ По дате и автору найти книгу. Исправить код
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BreatheInMyVoid
19 / 15 / 1
Регистрация: 05.03.2010
Сообщений: 59
16.11.2010, 15:47     Непонятная автору функция #2
Помойму проходит по дереву в поисках нужного значения
LEQADA
Мастер кустарных методов
 Аватар для LEQADA
227 / 222 / 9
Регистрация: 09.11.2010
Сообщений: 680
16.11.2010, 16:02  [ТС]     Непонятная автору функция #3
Цитата Сообщение от BreatheInMyVoid Посмотреть сообщение
Помойму проходит по дереву в поисках нужного значения
А можно построчно, но по русски?

Добавлено через 11 минут
Вот вся функция :

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
Tree_node * & find_node( T find_value ) { 
    Tree_node *tn = root; 
    while ( (tn != 0) && (tn->val != find_value) ) { 
        if ( find_value < tn->val ) 
            tn = tn->left_child; 
        else 
            tn = tn->right_child; 
    }
        
    // Вместо того, чтобы просто возвратить tn, мы несколько 
    // усложняем процедуру, гарантируя, что возвращаем *ссылку* 
    // в пределах дерева на узел, который ищем. 
        
    if ( tn == 0 ) 
        // Find_value нет в дереве. 
        return zero_node; 
    else if ( tn->isa_left_child( ) ) 
        // Tn - левый потомок своего родителя. 
        return tn->parent->left_child; 
    else if ( tn->isa_right_child( ) ) 
        // Tn - правый потомок своего родителя. 
        return tn->parent->right_child; 
    else if ( tn == root ) 
        // Специальный случай - родитель отсутствует. 
        return root; 
 
    // Управление не достигает этой точки. Возвратить фиктивное 
    // значение, чтобы предотвратить предупреждение компилятора, 
    assert(false); 
    return zero_node; 
}
BreatheInMyVoid
19 / 15 / 1
Регистрация: 05.03.2010
Сообщений: 59
16.11.2010, 17:14     Непонятная автору функция #4
Там где-то должен быть класс или структура самого дерева Tree_node, что-то вроде:
C++
1
2
3
4
5
struct Tree_node {
    int val;
    struct Tree_node *left_child;
    struct Tree_node *right_child;
}
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
Tree_node * & find_node( T find_value ) {
        //создаем главный узел 
        Tree_node *tn = root; 
        //пока не достигнем конца дерева или не найдем нужное значение
        while ( (tn != 0) && (tn->val != find_value) ) { 
                //если искомое значение меньше чем значение в узле
                if ( find_value < tn->val ) 
                        //идем влево
                        tn = tn->left_child; 
                else 
                        //или вправо
                        tn = tn->right_child; 
        }
                
        // Вместо того, чтобы просто возвратить tn, мы несколько 
        // усложняем процедуру, гарантируя, что возвращаем *ссылку* 
        // в пределах дерева на узел, который ищем. 
                
        if ( tn == 0 ) 
                // Find_value нет в дереве. 
                return zero_node; 
        else if ( tn->isa_left_child( ) ) 
                // Tn - левый потомок своего родителя. 
                return tn->parent->left_child; 
        else if ( tn->isa_right_child( ) ) 
                // Tn - правый потомок своего родителя. 
                return tn->parent->right_child; 
        else if ( tn == root ) 
                // Специальный случай - родитель отсутствует. 
                return root; 
 
        // Управление не достигает этой точки. Возвратить фиктивное 
        // значение, чтобы предотвратить предупреждение компилятора, 
        assert(false); 
        return zero_node; 
}
Могу ошибаться...
LEQADA
Мастер кустарных методов
 Аватар для LEQADA
227 / 222 / 9
Регистрация: 09.11.2010
Сообщений: 680
17.11.2010, 17:29  [ТС]     Непонятная автору функция #5
Да,да вы правы. Там в начале есть
C++
1
2
3
4
5
6
7
8
9
template <class T> 
class Avl_tree { 
private: 
struct Tree_node { 
T val; 
Tree_node *left_child; 
Tree_node *right_child; 
...
}
Ещё непонятна первая строчка...
C++
1
2
 
Tree_node * & find_node( T find_value ) {
Добавлено через 23 часа 46 минут
Можете ещё объяснить: что здесь делают строка 8 и 9?
C++
1
2
3
4
5
6
7
8
9
10
11
template <class T> 
class Avl_tree { 
 
private: 
 
    struct Tree_node { 
        T val;
        Tree_node ( ) ; 
        Tree_node( const T node_val ) : val(node_val) { }
...
...
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
17.11.2010, 18:28     Непонятная автору функция #6
Ещё непонятна первая строчка...
C++
1
2
 
Tree_node * & find_node( T find_value ) {
Метод, возвращающий ссылку на указатель.
Добавлено через 23 часа 46 минут
Можете ещё объяснить: что здесь делают строка 8 и 9?
C++
1
2
3
4
5
6
7
8
9
10
11
template <class T> 
class Avl_tree { 
 
private: 
 
    struct Tree_node { 
        T val;
        Tree_node ( ) ; 
        Tree_node( const T node_val ) : val(node_val) { }
...
...
8-определение дефолтного конструктора,
9-inline конструктор копирования, присваивание через список инициализаторов(: val(node_val)), поэтому тело пустое
LEQADA
Мастер кустарных методов
 Аватар для LEQADA
227 / 222 / 9
Регистрация: 09.11.2010
Сообщений: 680
17.11.2010, 18:30  [ТС]     Непонятная автору функция #7
Цитата Сообщение от st_dent Посмотреть сообщение
9-inline конструктор копирования, присваивание через список инициализаторов(: val(node_val)), поэтому тело пустое
Пожалуйста... Поподробнее...
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
17.11.2010, 18:36     Непонятная автору функция #8
LEQADA, а какой у вас компилятор и не выдает ли он ошибку на 9 строке?
LEQADA
Мастер кустарных методов
 Аватар для LEQADA
227 / 222 / 9
Регистрация: 09.11.2010
Сообщений: 680
17.11.2010, 18:44  [ТС]     Непонятная автору функция #9
У меня GCC для Windows. Ошибки там нету.

Добавлено через 5 минут
Можете поподробнее расписать про 9-ую строку?
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
17.11.2010, 18:56     Непонятная автору функция #10
Цитата Сообщение от LEQADA Посмотреть сообщение
Пожалуйста... Поподробнее...
Основное назначение конструктора копир. - создавать новый экземпляр того же класса таким образом, чтобы он стал копией существующего объекта.
Правда, обычно в качестве параметра передается ссылка на объект
C++
1
Tree_node( const T& node_val ){...}
inline- встроенный метод, удобно делать очень короткие и часто вызываемые методы.Для этого достаточно, совместить определение с реализацией.
Про список инициализаторов:
Такая запись будет эквивалентна (с точки зрения результата)
C++
1
Tree_node( const T node_val ) : val(node_val) { }
такой:
C++
1
 Tree_node( const T node_val )  {val=node_val;}
LEQADA
Мастер кустарных методов
 Аватар для LEQADA
227 / 222 / 9
Регистрация: 09.11.2010
Сообщений: 680
17.11.2010, 19:08  [ТС]     Непонятная автору функция #11
Цитата Сообщение от st_dent Посмотреть сообщение
Такая запись будет эквивалентна (с точки зрения результата)
Код C++1 Tree_node( const T node_val ) : val(node_val) { }
такой:
Код C++1 Tree_node( const T node_val ) {val=node_val;}
Вот компилятор мой с вами не соглашается... На ваш альтернативный метод он ругается...
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
17.11.2010, 19:29     Непонятная автору функция #12
Цитата Сообщение от LEQADA Посмотреть сообщение
Вот компилятор мой с вами не соглашается... На ваш альтернативный метод он ругается...
какую ошибку выдает?
LEQADA
Мастер кустарных методов
 Аватар для LEQADA
227 / 222 / 9
Регистрация: 09.11.2010
Сообщений: 680
17.11.2010, 19:44  [ТС]     Непонятная автору функция #13
Сделал скриншот...
Миниатюры
Непонятная автору функция  
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
17.11.2010, 20:00     Непонятная автору функция #14
Не могу сказать, с чем связана ошибка.
Возможно, кто-то более компетентный ответит.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2010, 20:03     Непонятная автору функция
Еще ссылки по теме:

C++ Непонятная функция в коде
Cортировка каталога книг по автору C++
Поиск книг по автору C++

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

Или воспользуйтесь поиском по форуму:
LEQADA
Мастер кустарных методов
 Аватар для LEQADA
227 / 222 / 9
Регистрация: 09.11.2010
Сообщений: 680
17.11.2010, 20:03  [ТС]     Непонятная автору функция #15
Спасибо большое.=)
Я повторю вопрос...

Можете ещё объяснить: что здесь делает строка 9?
C++
1
2
3
4
5
6
7
8
9
10
11
template <class T> 
class Avl_tree { 
 
private: 
 
        struct Tree_node { 
                T val;
                Tree_node ( ) ; 
                Tree_node( const T node_val ) : val(node_val) { }
...
...
Yandex
Объявления
17.11.2010, 20:03     Непонятная автору функция
Ответ Создать тему
Опции темы

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