ПОМОГИТЕ с комментариями - Pascal
Формулировка задачи:
прокомментируйте плиз прогу, я прост в паскале не силен......желательно подробно.....спс.... вот код type
TreeLink = ^Tree;
Tree = record
Data: string;
Left, Right: TreeLink;
end;
procedure InsTree(var t:TreeLink; Num, NumNode : integer; S:String);
var PNum, LNum, k : integer;
begin
if t = nil then begin
new(t);
with t^ do begin
Left := nil;
Right := nil;
Data := S;
end;
end else begin
{ По текущему номеру узла можно определить номер
узлов, которые справа и слева от него }
k := 1; PNum := NumNode;
While PNum > k do begin
PNum := PNum - k;
k := k * 2;
end;
{ PNum - номер узла внутри уровня от 1 }
{ LNum - номер левого узла от текущего }
LNum := (PNum-1)*2 + NumNode - PNum + 1 + k;
if (LNum = Num) or (t^.Left <> nil)
then InsTree(t^.left , Num, LNum, S);
if (LNum+1 = Num) or (t^.Right <> nil)
then InsTree(t^.Right, Num, LNum+1, S)
end;
end;
Procedure PrintTree(var S:String; t:TreeLink);
begin
if t <> nil then begin
PrintTree(S, t^.left);
PrintTree(S, t^.right);
S := S + t^.data + ',';
end;
end;
var txtfile : text;
S, S1 : String;
kd: TreeLink;
N, i:integer;
begin
kd := nil;
Assign(txtfile, 'out.txt');
Reset(txtfile);
s := '';
while not eof(txtfile) do begin
Readln(txtfile, S1);
if S1[length(s1)] <> ',' then s1 := s1 + ',';
s := s + s1;
end;
Close(txtfile);
N := 1; // Номер узла
for i := 1 to length(s) do begin
while (Pos(',', s) > 0) do begin
S1 := copy(s, 1, Pos(',', S) - 1);
delete(s, 1, Pos(',', S));
insTree(kd, N, 1, S1);
inc(N);
end;
end;
s := '';
PrintTree(s, kd);
Assign(txtfile, 'in.txt');
Rewrite(txtfile);
writeln(txtfile, s);
Close(txtfile);
readln;
end.
Решение задачи: «ПОМОГИТЕ с комментариями»
textual
Листинг программы
type TreeLink = ^Tree; Tree = record Data: string; Left, Right: TreeLink; end; procedure InsTree(var t:TreeLink; Num,NumNode:integer; S:String); var PNum, LNum, k :integer; begin if t = nil then begin new(t); with t^ do begin Left := nil; Right := nil; Data := S; end; end else begin { По текущему номеру узла можно определить номер узлов, которые справа и слева от него } k := 1; PNum := NumNode; While PNum > k do begin PNum := PNum - k; k := k * 2; end; { PNum - номер узла внутри уровня от 1 } { LNum - номер левого узла от текущего } LNum := (PNum-1)*2 + NumNode - PNum + 1 + k; if (LNum = Num) or (t^.Left <> nil) then InsTree(t^.left , Num, LNum, S); if (LNum+1 = Num) or (t^.Right <> nil) then InsTree(t^.Right, Num, LNum+1, S) end; end; Procedure PrintTree(var S:String; t:TreeLink); begin if t <> nil then begin PrintTree(S, t^.left); PrintTree(S, t^.right); S := S + t^.data + ','; end; end; var txtfile : text; S, S1 : String; kd: TreeLink; N, i:integer; begin kd := nil; Assign(txtfile, 'out.txt'); Reset(txtfile); { открываем файл для чтения } s := ''; while not eof(txtfile) do begin { считываем из него все строки } Readln(txtfile, S1); if S1[length(s1)] <> ',' then s1 := s1 + ','; { добавляем "," в конец строки } s := s + s1; { объелиняем все строки в одну, разделенную "," } end; Close(txtfile); { закрываем файл } N := 1; // Номер узла for i := 1 to length(s) do begin { перебираем всю строку } while (Pos(',', s) > 0) do begin { ищем "," } S1 := copy(s, 1, Pos(',', S) - 1); { копируем все до "," } delete(s, 1, Pos(',', S)); { удаляем из исходной строки все вместе с "," } insTree(kd, N, 1, S1); { добавляем ветвь дерева } inc(N); end; end; s := ''; PrintTree(s, kd); { записываем содержимое дерева в s } Assign(txtfile, 'in.txt'); Rewrite(txtfile); { открываем файл для записи } writeln(txtfile, s); { записываем содержимое дерева } Close(txtfile); { и закрываем файл } readln; end.
Объяснение кода листинга программы
- В первой части кода определяется структура данных
дерево
с помощью типа данных TreeLink и записи Tree. - Затем определена процедура InsTree, которая добавляет новый узел в дерево. Если текущий узел является листовым (т.е. не имеет дочерних узлов), то создается новый узел и добавляется в дерево. Если узел имеет дочерние узлы, то рекурсивно вызывается процедура InsTree для каждого дочернего узла.
- Во второй части кода определена процедура PrintTree, которая рекурсивно выводит содержимое дерева на экран.
- Затем определены переменные txtfile, S, S1, kd, N и i. Переменная kd используется как корневой узел дерева, а переменные S и S1 используются для хранения строковых значений.
- Далее, из файла 'out.txt' считываются все строки, которые затем объединяются в одну строку S с разделителем
,
. - Затем, каждая часть строки S1, разделенной запятыми, преобразуется в отдельное дерево, которое затем добавляется в дерево.
- После того, как все строки из файла 'out.txt' были преобразованы в дерево, содержимое дерева выводится на экран с помощью процедуры PrintTree.
- Наконец, содержимое дерева записывается в файл 'in.txt'.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д