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

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

Войти
Регистрация
Восстановить пароль
 
Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 300
Завершенные тесты: 1
#1

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

01.06.2013, 17:45. Просмотров 265. Ответов 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
?

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


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

как сделать правильно указатель на первую функцию - C++
#include &quot;stdafx.h&quot; #include &quot;stdio.h&quot; #include &quot;conio.h&quot; int F(int n) { if(n==0) return 1; if(n==1) return 1; return...

Как правильно вписать функцию в h-файл и правильно её отразить в основной функции? - C++
Создать внешнюю библиотеку, в которой написана функция вывода символьного массива обратном порядке. Подключить данную библиотеку к ...

Как правильно вызвать функцию с указателем на другую функцию как параметр - C++
Вот вариант: double f(double x) { ... } double k(double (*f)(double), double y) { ...

Как правильно записать функцию? - C++
Подскажите, пожалста, можно ли так делать: #include &lt;math.h&gt; double F1(double x,double y) { double f1=y+1.32-sin(x); ...

Как правильно записать функцию? - C++
Очень интересует как записать корень квадратный 3 степени w=\sqrt{x^6+ln^2y}+\frac{e^{\left|x-y \right|}\, \left|x-y...

Как правильно написать функцию? - C++
Необходимо написать функцию кот вычисляет интервал времени: void DigitalTime::interval_since(const DigitalTime&amp; a_previous_time, int&amp;...

1
Xsenon_rus
8 / 8 / 0
Регистрация: 18.04.2011
Сообщений: 104
01.06.2013, 18:11 #2
Ну выше вроде написано H := true;
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.06.2013, 18:11
Привет! Вот еще темы с ответами:

Как правильно записать функцию? - C++
Ребята помогите пожалуйста учу С++, хочу разобраться с разбиением задачи на функции. Задача 2ух мерный массив меняю местами столбы массива....

Как правильно написать функцию? - C++
Привет :) Начал изучение функций в С++. Написал первую, и тут же начались проблемы. Вот код. Помогите пожалуйста #include...

Как правильно вызвать функцию? - C++
Здравствуйте,посдкажите как правильно объявить функцию в private и вызвать ее в классе. Перепишите текст в сообщение. П. 5.18 и 5.19...

Как правильно вызвать функцию? - C++
Добрый день. подскажите как исправить ошибку: TAsync * Async ; Async = new TAsync; ComPort-&gt;...


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

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

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