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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2009, 21:14   #1
Gon
Пользователь
 
Регистрация: 30.04.2008
Сообщений: 16
По умолчанию Работа с деревом.

Было такое задание:
Имеются две статьи. Каждая из них включает список ис-
точников. В них в свою очередь могут быть ссылки на другие
источники. Известны год и месяц опубликования каждой статьи.
Проверить корректность ввода информации. Определить общие ис-
точники двух статей, начиная с заданного года.
Собствено я подумав решил объеденить 2 дерева 1 вершиной, в итоге получилось 1 дерево с 2 сыновьями.
Дерево в файле я задал так:

Цитата:
.Статья1 (12.2008)
..Источник1 (1.2008)
...Ссылка1 (1.2000)
....Аннотация1 (1.1990)
...Ссылка2 (2.1999)
....Аннотация2 (2.1991)
..Источник2 (2.2008)
.Статья2 (11.2008)
..Источник2 (2.2008)
...Ссылка5 (5.2001)
....Аннотация2 (2.1991)
...Ссылка6 (6.2005)
....Аннотация4 (4.1985)
..Источник5 (5.2006)
...Ссылка1 (1.2000)
....Аннотация6 (6.1970)
.....Первоисточник1 (4.1940)
......Первоисточник1 (1.1930)
Смог сделать считывание дерева с файла в память(что я вляется обязательным для сдачи) и удаляет точки, но меня это очень запутало.
Я незнаю как разделить строку на название статьи и дату, чтобы сравнить статьи между собой по дате и имени, и незнаю как сравнивать и проверить корректность...а если бы и знал то незнаю куда вставить в программе, т.к. эту программу делал основываясь на данную преподователем в ввиде примера.

Код:
Program TreeIO;

USES CRT;

TYPE
  ukaz=^uzel;
  uzel=record
         name: string;     {имя вершины}
         Date: STRING;     {Дата статьи}
         left,right: ukaz; {сыновья}
         fath: ukaz;       {отец в исходном дереве}
         urov: integer;    {уровень исходного дерева, начиная с 0}
         Flag: boolean;    {признак последнего сына}
       end;
Var
  result: STRING;
  t,kon,root,p: ukaz;
  i,k,m,Len: integer;
  S, R, D, D1: string;
  Fin,Fout: text;
  Delims: STRING;
Begin
  CLRSCR;
  BEGIN
    Assign(Fin,'tree.txt');
    Reset(Fin);
    New(root);
    ReadLn(Fin,S);
    root^.name:=S;
    root^.urov:=0;
    root^.Flag:=true; {признак последнего сына-для корня не обязательно}
    root^.fath:=nil;  {отец}
    m:=0;             {уровень вершины}
    t:=root;          {предыдущая вершина для следующей в файле}
    Delims := ' ';
    While not Eof(Fin) do
      begin
        ReadLn(Fin,S);
        k:=0;
        Len:=Length(S);
        While S[k+1]='.'
        do
          k:=k+1;   {k-уровень вершины, начиная с 0}
        R:=Copy(S,k+1,Len-k);         {имя вершины}
        New(kon);
        kon^.name:=R;
        kon^.left:=nil;
        kon^.right:=nil;
        kon^.urov:=k;
        if k>m then               {переход на следующий уровень}
          begin
            t^.left:=kon;
            kon^.fath:=t;
            kon^.Flag:=true;      {признак последнего сына}
          end
        else
          if k=m then             {тот же уровень}
            begin
              t^.right:=kon;
              kon^.fath:=t^.fath; {отец тот же, что у брата}
              t^.Flag:=false;     {снятие признака последнего сына}
              kon^.Flag:=true;    {признак последнего сына}
            end
          else                    {подъем по дереву на m-k уровней}
            begin
              p:=t;
              For i:=1 to m-k do
                p:=p^.fath;
              {p-предыдущая вершина того же уровня}
              kon^.fath:=p^.fath; {отец в исходном дереве тот же, что у брата}
              p^.right:=kon;
              p^.Flag:=false;     {снятие признака последнего сына}
              kon^.Flag:=true;    {признак последнего сына}
            end;
        m:=k;       {запомнили текущий уровень}
        t:=kon;     {для работы со следующей вершиной}
      end;          {конец While}
    Close(Fin);
  END;
End.
Зарание благодарен за все ответы...
Gon вне форума Ответить с цитированием
Старый 18.01.2009, 20:24   #2
Gon
Пользователь
 
Регистрация: 30.04.2008
Сообщений: 16
По умолчанию

Сделал сам. Точнее почти сделал... +)
Gon вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
дописать прграмму с бинарным деревом... prince-of-dark Паскаль, Turbo Pascal, PascalABC.NET 0 19.12.2008 10:06