Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2008, 22:40   #11
Astor
Пользователь
 
Регистрация: 23.04.2008
Сообщений: 27
По умолчанию

Ребята,на вас вся надежда! Главное это обход этого дерева правильно сделать
Astor вне форума Ответить с цитированием
Старый 24.04.2008, 22:55   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Alex, а мне кажется, что тут проблема в логике!
1) я так и не понял зачем последовательность слов записывать в дерево таким странным образом...
2) ни мы, ни, похоже, топикстартер, не представляем, что же должно получится в файле out.txt $-(((
я бы предполагал, что само это чудное дерево... ан нет.
все элементы дерева по обходу кидаются в outmasiv и оттуда выводятся построчно в выходной файл...

ладно.

вот полностью код. (с) alexBlack на процедуру PrintTree

Код:
{Программа загружает строку из файла в которой содержаться
слова, разделенные запятыми, затем отделяет эти слова, строит
из них дерево, делает обход и сохраняет в другой файл}
program DEREVO;
uses Crt; {Подключаем библиотеки}

type
  TreeLink = ^Tree;
  Tree = record
    Number: Integer;
    Data: string;
    Left, Right: TreeLink;
  end;



const n = 100; {Максимально допустимое кол-во слов в массиве}
var
  txtfile: text; {текстовый файл}
  st, st1: string; {Строковые переменные}
  i, count: Integer;
  inmas, outmas: array[1..n] of string; {Входные и выходные данные/массивы}
  kd: TreeLink;


{Обратный Ввод дерева}

procedure InsTree(num: Integer; n: string; var t: TreeLink);
begin
  if t = nil then
  begin
    new(t);
    with t^ do
    begin
      Left := nil;
      Right := nil;
      Data := n;
      number := num;
    end;
  end else
    if t^.left = nil then InsTree(num, n, t^.Left)
    else InsTree(num, n, t^.Right);
end;


{НЕПРАВИЛЬНО, СДЕСЬ ДОЛЖЕН БЫТЬ ОБХОД}
{Вывод дерева}

Procedure PrintTree(t : TreeLink);
begin
   if t <> nil then begin
       { Сначала выводим правый узел}
       PrintTree(t^.right);
       {Потом левый}
       PrintTree(t^.left);
       {а потом данные самого узла}
       {для отладки можно вывести на экран:
         writeLn(t^.Number, '  ', t^.data);}
       outmas[t^.Number] := t^.data;
   end;
end;

(*
procedure PrintTree(num: Integer; t: TreeLink);
begin
{Здесь должен быть алгоритм обхода дерева и
ЗАПИСЬ элементов в массив OUTMAS[i]}


{
if t<>Nil
then
begin
PrintTree(num, t^.Left);
Write('-');
Write(t^.Data:3);
PrintTree(num, t^.Right);
end;}


end;
{КОНЕЦ НЕПРАВИЛЬНОГО}
*)



begin
  ClrScr; {Очищаем экран}
  count := 0; {Обнуляем счетчик слов}
  kd := nil;


{ЧТЕНИЕ И ВВОД СТРОКОВЫХ ДАННХ/СЛОВ}
{$I-} {Отключаем ошибки ввода/вывода}
  Assign(txtfile, 'in.txt'); {Сопоставляем файловую переменную с именем файла}
  Reset(txtfile); {Открываем файл для чтения}
{$I+} {Включаем ошибки}
  if IOResult = 0 then {Если файл существует}
  begin
    WriteLn('Читаем файл.......');
    st1 := '';
    while not eof(txtfile) do {Читаем файл пока нет признака его конца}
    begin
      Readln(txtfile, st1); {Считываем строку из файла в переменную st1}
      if st[length(st1)] <> ',' then st1 := st1 + ','; {И добавляем к концу запятую}
      st := st + st1;
    end;
  end else {Иначе, если файл ненайден}
  begin
    WriteLn('Файл не найден.');
    WriteLn('Создаем файл......');
    while length(st) = 0 do {Пока данные не введены повторяем цикл}
    begin
      Writeln('vvedite slova,razdelennie zapyatimi,po okonchanii nagmite enter');
      Readln(st); {Запрос ввода данных}
    end;
    if st[length(st)] <> ',' then st := st + ','; {И добавляем к концу запятую, иначе последнее слове не будет считано}
    Rewrite(txtfile); {Создаем файл}
    Write(txtfile, st); {Записываем в него наши данные}
  end;

  {Проверяем на наличие пробелов и удаляем их}
  while Pos(' ', st) > 0 do delete(st, Pos(' ', St), 1);


  if st[length(st)] <> ',' then st := st + ',';
  for i := 1 to length(st) do {Сканируем нашу строку данных до конца}
    while (Pos(',', st) > 0) do {И при нахождении запятой, т е, при нахождении признака существования слова}
    begin
      inc(count); {Увеличиваем счетчик слов}
      inmas[count] := copy(st, 1, Pos(',', St) - 1); {И заносим слово во входной массив данных}
      delete(st, 1, Pos(',', St)); {Удаляем прочитанное слово из строки чтобы не мешалось и сканируем дальше}
    end;
  Close(txtfile);
  Write('Входные данные загружены, количество элементов ');
  Writeln(count);
  Writeln;
{================================================= =====}

  for i := 1 to count do InsTree(i, inmas[i], kd); {Вызов процедуры формирования дерева из массива}

  PrintTree(kd); {Вызов процедуры обхода дерева и вывод результатов}


{================================================= =====}
  Assign(txtfile, 'out.txt');
  Rewrite(txtfile);
  Writeln(txtfile, 'RESULTAT:');
  Writeln(txtfile, '');
  for i := 1 to count do Writeln(txtfile, outmas[i]); {Запись результатов в файл, для наглядности построчно}
  Close(txtfile);
  Writeln('Данные записаны в файл out.txt');

  Readln; {Ждем нажатия кнопки}
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.04.2008, 23:08   #13
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

2Astor

Мы уже гадать начинаем. Это не дело.
У Вас там в коде рабочая процедура закомментирована. Нет только записи в массив.

Код:
{Вывод дерева}
Procedure PrintTree(num: Integer; t : TreeLink);
Begin
  {Здесь должен быть алгоритм обхода дерева и
   ЗАПИСЬ элементов в массив OUTMAS[i]}
  if t <> Nil then begin
     PrintTree(num, t^.Left);
     Write('-');
     Write(t^.Data:3);
     inc(count);
     outMas[count] := t^.Data;
     PrintTree(num, t^.Right);
  end;
End;

// И в конце перед PrintTree поставить count := 0
count := 0;
PrintTree(1, kd);
Если и это не устроит рассказывайте подробнее. Покажите входной файл, и что Вы хотите в выходном файле.

2Serge_Bliznykov
Да, нелогично это как-то. Ладно бы еще для сортировки. Может просто построение дерева неправильно. Ладно, хватит на сегодня.
alexBlack вне форума Ответить с цитированием
Старый 25.04.2008, 07:52   #14
Astor
Пользователь
 
Регистрация: 23.04.2008
Сообщений: 27
По умолчанию

Спасибо Вам Друзья! Сегодня днем протестирую код,если результаты будут не такие то напишу на примерах,как должно быть!
Astor вне форума Ответить с цитированием
Старый 25.04.2008, 13:02   #15
Astor
Пользователь
 
Регистрация: 23.04.2008
Сообщений: 27
По умолчанию

Итак, я посмотрел результаты работы программы! и вывод - должно быть не так ( !в прикреппленных файлах я показываю какой должен быть исходный файл,полученный результат и само дерево - то есть по какому принципу осуществляется обход!
Изображения
Тип файла: jpg Дерево.jpg (8.9 Кб, 119 просмотров)
Вложения
Тип файла: txt IN.txt (84 байт, 114 просмотров)
Тип файла: txt OUT.txt (84 байт, 115 просмотров)
Astor вне форума Ответить с цитированием
Старый 25.04.2008, 15:47   #16
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Astor, похоже Вы сами не знаете, что делаете. Проблема у Вас вовсе не с обходом дерева, а с построением. Вот код. Разбирайтесь.

Код:
type
   TreeLink = ^Tree;
   Tree = record
      Data: string;
      Left, Right: TreeLink;
      Level : integer;
   end;

// Возвращает узел, у которого еще не заняты left/right на уровне level
function getFreeNode(t:TreeLink; level:integer):TreeLink;
begin
   result := nil;
   if t^.Level < Level then begin
      if t^.left = nil        // Левый не занят
      then result := t
      else result := getFreeNode(t^.left, level);   

      if (result = nil) then begin
         if t^.right = nil    // правый не занят 
         then result := t
         else result := getFreeNode(t^.right, level);
      end;
   end;
end;

// Вставка строки S в дерево 
procedure InsTree(var t:TreeLink; lvl : integer; S:String);
var t1, t2:TreeLink;
begin
   if t = nil then begin
      new(t);
      with t^ do begin
         Left  := nil;
         Right := nil;
         Level := Lvl;
         Data  := S;
      end;
   end else begin
      // Ищем самый левый узел в дереве 
      t1 := t;
      while t1^.left <> nil do t1 := t1^.left;

      // Получаем свободный узел на этом уровне 
      t2 := getFreeNode(t, t1^.level);
      // Если свободного нет, добавляем еще уел влево
      if t2 = nil then t2 := t1;
      // Добавление левого / правого узла
      if t2^.left = nil
      then InsTree(t2^.left , t2^.Level+1, S)
      else InsTree(t2^.right, t2^.Level+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;
    i:integer;
begin
   kd := nil;
   // Читаем все строки из файла
   // Вставляем между ними запятые
   Assign(txtfile, 'in.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);

   // Деление на слова и добавление в дерево 
   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, 1, S1);
      end;
   end;

   s := '';
   PrintTree(s, kd);
   // Сохранение в файл
   Assign(txtfile, 'out.txt');
   Rewrite(txtfile);
   writeln(txtfile, s);
   Close(txtfile);

   readln;
Компилировал на Delphi. Могут быть пропущены некоторые символы ^.
Для Pascal замените result на имя соответствующей функции.
Компилятор подскажет. Удачи.

Последний раз редактировалось alexBlack; 25.04.2008 в 18:54.
alexBlack вне форума Ответить с цитированием
Старый 25.04.2008, 16:15   #17
Astor
Пользователь
 
Регистрация: 23.04.2008
Сообщений: 27
По умолчанию

Спасибо большое! сейчас будем разбираться! компилятор выдал ошибку unknown identifier ! ща будет объявлять эту переменную как нить
Astor вне форума Ответить с цитированием
Старый 25.04.2008, 17:26   #18
Astor
Пользователь
 
Регистрация: 23.04.2008
Сообщений: 27
Радость

alexBlack, я все сделал как вы сказали - заменил rezult на имя соответствующей функции, то есть getFreeNode, теперь пишет ошибку что пропущена скобка, но вроде все на месте! это Вы мне готовую прогу выложили? прост я пока не разберусь
Astor вне форума Ответить с цитированием
Старый 25.04.2008, 17:59   #19
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Astor, если я ничего не напутал, то вот скорретированный код функции от alexBlack:
Код:
function getFreeNode(t:TreeLink; level:integer):TreeLink;
var
  result :TreeLink;
begin
   result := nil;
   if t^.Level < Level then begin
      if t^.left = nil
      then result := t
      else result := getFreeNode(t^.left, level);

      if (result = nil) then begin
         if t^.right = nil
         then result := t
         else result := getFreeNode(t^.right, level);
      end;
   end;
   getFreeNode := Result
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.04.2008, 18:03   #20
Astor
Пользователь
 
Регистрация: 23.04.2008
Сообщений: 27
По умолчанию

Ребят, на делфях проверил! работает все правильно, обход верный! вот токо мне не удается перегнать на паскаль - ошибку пишет, не знаю почему

Последний раз редактировалось Astor; 25.04.2008 в 18:07.
Astor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ПОМОГИТЕ, ОЧЕНЬ ПРОШУ Help me Свободное общение 4 01.09.2008 09:29
очень прошу помогите решить задачки Марин@ Помощь студентам 1 24.04.2008 18:27
Помогите решить две задачи! очень прошу... DmT Фриланс 1 23.10.2007 23:19