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

Как правильно сделать функцию? (Из Паскаля в С++) - C++

Восстановить пароль Регистрация
 
Nullik
 Аватар для Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 297
Завершенные тесты: 1
01.06.2013, 17:45     Как правильно сделать функцию? (Из Паскаля в С++) #1
Добрый день, уважаемые программисты! Подскажите пожалуйста вот такое дело:

есть код на Турбопаскале, и надо всё это дело в С++.

Вроде бы переводила, переводила, но вот выплыл такой кусок кода и я не знаю что делать:

Pascal
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
procedure Delete (X: string; var PNode: TPtrNode; var H: boolean);
//выполняет поиск удаляемого узла и его замену
var Q: TPtrNode; // сохраняет указатель на удаляемый узел
 
procedure Del (var R: TPtrNode; var H: boolean);
begin
//выполняет поиск самого правого узла в левом поддереве
     if R^.Right < > nil then 
     begin //спуск по правому поддереву
         Del (R^.Right, H);
         if H then Balance_R (R, H); {откат по пути спуска по правому поддереву  
         и, если нужно, балансировка}
     end
     else 
     begin
{перенос содержимого самого правого узла в левом поддереве R на место подлежащего удалению узла Q. Поля узла R переписываются на место соответствующих полей "удаляемого" узла Q. В результате структура дерева не нарушается, а реальному удалению из памяти подвергается узел R, для чего переменная Q запоминает ссылку на него}
 
         Q^.Name := R^.Name;
         Q^.Count := R^.Count;
         Q := R; {запоминается ссылка Q на переносимый узел R, который подлежит реальному удалению}
         R := R^.Left; {т.к. переносимый узел R самый правый в поддереве, поэтому у него возможно только левое       
         поддерево и его корень "подтягивается" на место переносимого узла}
         H := true;
     end;
end; //Del
 
// исполняемая часть процедуры Delete
begin
      if PNode = nil then 
         Writeln ('Узла с заданным ключом в дереве нет')
      else
          if PNode^.Name > X then 
          begin
               Delete (X, PNode^.Left, H); //спуск по левому поддереву
               if H then 
               Balance_L (PNode, H) {откат по пути спуска по левому поддереву и, если нужно, балансировка}
          end
          else
               if PNode^.Name < X then 
               begin 
                       Delete (X, PNode^.Right, H); //спуск по правому поддереву
                       if H then 
                             Balance_R (PNode, H); {откат по пути спуска правому поддереву и, если нужно, балансировка}
               end
               else { исключение PNode }
                      if PNode^.Count = 1 then 
                      begin //т.е. дубликатов нет
                              //выполняется удаление узла и перемещение на
                              //его место соответствующего замещающего узла
                              Q := PNode; {переменная Q сохраняет адрес узла, подлежащего физическому удалению}
                              if PNode^.Right = nil then 
                              begin
                              {у удаляемого Q узла имеется только левое поддерево и в результате удаления высота дерева 
                              уменьшается}
                                     PNode := PNode^.Left;
                                     H := true;
                              end
                              else
                              if PNode^.Left = nil then 
                              begin
                              {у удаляемого узла Q имеется только правое поддерево и в результате удаления высота дерева 
                               уменьшается}
                                     PNode := PNode^.Right; 
                                     H := true;
                              end
                              else 
                              begin {у удаляемого узла Q имеются оба поддерева; выполняется поиск самого правого узла в 
                              левом поддереве и его перемещение на место удаляемого узла, после чего, если необходимо, 
                              левая балансировка}
                                    Del (Q^.Left, H); //переменная Q получит адрес самого
                                    //правого узла в левом поддереве
                                    if H then 
                                           Balance_L (PNode, H) 
                              end;
                              Dispose (Q);
                     end
                     else {PNode^.Count > 1}; {Имеются дубликаты}
                           PNode^.Count := PNode^.Count1;
 
end; {Delete}
В функции Del есть переменная Q, а вроде бы вход делали с R. Как тут быть? Надо и Q и R "вводить"? на С++, вроде бы, функцию в функции объявлять нельзя, я не знаю как тут сделать.


Вот, и ещё у меня вопрос по этому коду:

что значат условия:

Pascal
1
 if H then
?

Или здесь не дописали чему равна булевская переменная Н?


Вот, буду очень признательна, кто поможет решить данные вопросы
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2013, 17:45     Как правильно сделать функцию? (Из Паскаля в С++)
Посмотрите здесь:

как записать правильно функцию C++
C++ как сделать правильно указатель на первую функцию
C++ Как правильно написать функцию?
как правильно записать функцию C++
C++ Как правильно записать функцию?
Как правильно вызвать функцию с указателем на другую функцию как параметр C++
C++ Как правильно вписать функцию в h-файл и правильно её отразить в основной функции?
Как правильно вызвать функцию? C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Xsenon_rus
8 / 8 / 0
Регистрация: 18.04.2011
Сообщений: 104
01.06.2013, 18:11     Как правильно сделать функцию? (Из Паскаля в С++) #2
Ну выше вроде написано H := true;
Yandex
Объявления
01.06.2013, 18:11     Как правильно сделать функцию? (Из Паскаля в С++)
Ответ Создать тему
Опции темы

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