ПОМОГИТЕ с комментариями - 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.

Объяснение кода листинга программы

  1. В первой части кода определяется структура данных дерево с помощью типа данных TreeLink и записи Tree.
  2. Затем определена процедура InsTree, которая добавляет новый узел в дерево. Если текущий узел является листовым (т.е. не имеет дочерних узлов), то создается новый узел и добавляется в дерево. Если узел имеет дочерние узлы, то рекурсивно вызывается процедура InsTree для каждого дочернего узла.
  3. Во второй части кода определена процедура PrintTree, которая рекурсивно выводит содержимое дерева на экран.
  4. Затем определены переменные txtfile, S, S1, kd, N и i. Переменная kd используется как корневой узел дерева, а переменные S и S1 используются для хранения строковых значений.
  5. Далее, из файла 'out.txt' считываются все строки, которые затем объединяются в одну строку S с разделителем ,.
  6. Затем, каждая часть строки S1, разделенной запятыми, преобразуется в отдельное дерево, которое затем добавляется в дерево.
  7. После того, как все строки из файла 'out.txt' были преобразованы в дерево, содержимое дерева выводится на экран с помощью процедуры PrintTree.
  8. Наконец, содержимое дерева записывается в файл 'in.txt'.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5
Похожие ответы