Вторник, 07.01.2025
Pascal 4 All
[ · Новые сообщения · Участники · Правила форума · Поиск · RSS ]

 

  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: Seqular, Pavel  

Пожалуйста, помогите с задачей
ChesДата: Понедельник, 19.12.2011, 01:34 | Сообщение # 1
Знакомый
Группа: Пользователи
Сообщений: 12
Репутация: 0
Замечания: 0%
Статус: Offline
Имеется дерево, корень которого соответствует основателю
рода. Сыновья каждой вершины задают сыновей и дочерей
соответствующего человека. Указывается имя некоторого
человека. Требуется выдать имена его детей, внуков, сестер и
братьев, одного из родителей, дедушки или бабушки

Прошу, помогите.
 
SeqularДата: Понедельник, 19.12.2011, 08:35 | Сообщение # 2
Хранитель
Группа: Администраторы
Сообщений: 859
Репутация: 35
Статус: Offline
Ches, Интересная задачка. Только вопрос по реализации? Что нужно? Динамический двусвязный список? Массив?

Поддерживаю также проект сообщество молодых сисадминов
 
ChesДата: Понедельник, 19.12.2011, 19:40 | Сообщение # 3
Знакомый
Группа: Пользователи
Сообщений: 12
Репутация: 0
Замечания: 0%
Статус: Offline
хочу попросить помощи с кодом.
я сижу над этой задачей уже неделю, с деревьями у меня не лады. пытался написать двумя разными ходами, ничего не вышло.

дерево лежит в файле .txt в виде

A
.B
..F
..G
..H
.C
.D
..K
..L
..M
.E
..N
..O
...X
...Y

мне сказали, что с таким видом дерева легче управиться. по точкам искать ближайших родственников.

Добавлено (19.12.2011, 19:40)
---------------------------------------------
вот смотри, вот это единственное что у меня правильно работает)
я не знаю как осуществить поиск по дереву и вывод родственников.

Code


Program TreeCount;
TYPE
   tptr = ^TElem;
   TElem = RECORD
             str: STRING;
             j: byte;
             next: tptr;
           END;
   ukaz = ^uzel;
   uzel = RECORD
            name: STRING;     {имя вершины}
            left,right: ukaz; {сыновья}
            father: ukaz;       {отец в исходном дереве}
            urov: INTEGER;    {уровень исходного дерева, начиная с 0}
            Flag, bu: BOOLEAN;    {признак последнего сына}
          END;

VAR
   p2, t, kon, root, q, w: ukaz;
   k, m, Len: INTEGER;
   S, R: STRING;
   i: byte;
   F1: TEXT;
   a, b: STRING[20];
   key: CHAR;
   bu1, bu2, bu3, bu4, bu6: BOOLEAN;

Добавлено (19.12.2011, 19:40)
---------------------------------------------

Code

BEGIN
   ASSIGN(F1,'INPUT.TXT');
   Reset(F1);
   New(root);
   root^.left := NIL;
   root^.right := NIL;  
   root^.father := NIL;
   READLN(F1, S);
   root^.name := S;  {Присваеваем значение первой строки корню}
   root^.urov := 0;
   bu1 := TRUE;
   root^.Flag := true; {признак последнего сына-для корня не обязательно}
   root^.father := NIL;  {отец}
   m := 0;             {уровень вершины}
   t := root;          {предыдущая вершина для следующей в файле}
   WHILE NOT EOF(F1)  
   DO
     BEGIN
       ReadLn(F1, 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 = 0) and (bu1 = true)  
           THEN
             BEGIN
               WRITELN('Ошибка!!! Обнаружено несколько деревьев!');
               readln;
               halt;
             END;
              IF k>m  
              THEN            {переход на следующий уровень}
                BEGIN
                  t^.left := kon;
                  kon^.father := t;
                  kon^.Flag := true;      {признак последнего сына}
                END
              ELSE
                IF k=m  
                THEN             {тот же уровень}
                  BEGIN
                    t^.right:=kon;
                    kon^.father:=t^.father; {отец тот же, что у брата}
                    t^.Flag:=false;     {снятие признака последнего сына}
                    kon^.Flag:=true;    {признак последнего сына}
                  END
                ELSE                    {подъем по дереву на m-k уровней}
                  BEGIN
                    p2:=t;
                    FOR i:=1 to m-k  
                    DO
                      p2:=p2^.father;
                     {p-предыдущая вершина того же уровня}
                      kon^.father:=p2^.father; {отец в исходном дереве тот же, что у брата}
                      p2^.right:=kon;
                      p2^.Flag:=false;     {снятие признака последнего сына}
                      kon^.Flag:=true;    {признак последнего сына}
                 END;
               m:=k;       {запомнили текущий уровень}
               t:=kon;     {для работы со следующей вершиной}
         END;          {конец While}
       Close(F1);

Writeln("Выберите:");
Writeln("1. Определить");
Writeln("2. Выход");

Writeln;
repeat
Readln(Key);
until ((Key = '1') or (Key = '2'));
Writeln;

CASE Key OF
  '1':BEGIN
        repeat
          writeln('Введите имя');
          readln(a);
        until a <> ' ';
        {search;}
        readln;
      {Halt}
      END;
  '2':BEGIN
      Halt
      END
END;

Readln;        
         
end.



Сообщение отредактировал Ches - Понедельник, 19.12.2011, 18:05
 
SeqularДата: Понедельник, 19.12.2011, 22:00 | Сообщение # 4
Хранитель
Группа: Администраторы
Сообщений: 859
Репутация: 35
Статус: Offline
Ches, не совсем понятно, что значит точка. Ну да ладно )) я в чужих кодах не люблю разбираться, попробую своё что-нибудь накатать. )

Поддерживаю также проект сообщество молодых сисадминов
 
ChesДата: Вторник, 20.12.2011, 03:01 | Сообщение # 5
Знакомый
Группа: Пользователи
Сообщений: 12
Репутация: 0
Замечания: 0%
Статус: Offline
точка нужна для определения уровней. если ты про файл.
препод сказал, что так легче искать по дереву.
я с ним спорить не стал, так как в деревьях не особо понимаю.

хорошо, спасибо, надеюсь что-нибудь получится)

Добавлено (20.12.2011, 03:01)
---------------------------------------------
хотел спросить, кстати, у тебя какой часовой пояс?)
а то такая разница, у меня щас 20:00, а на сайте аж 03:00

 
SeqularДата: Вторник, 20.12.2011, 08:22 | Сообщение # 6
Хранитель
Группа: Администраторы
Сообщений: 859
Репутация: 35
Статус: Offline
Ches, Сахалин. Местное время +7 к Московскому. ) Пока пишу коды. Тебе срочно? cool

Поддерживаю также проект сообщество молодых сисадминов
 
ChesДата: Вторник, 20.12.2011, 08:27 | Сообщение # 7
Знакомый
Группа: Пользователи
Сообщений: 12
Репутация: 0
Замечания: 0%
Статус: Offline
Seqular, Да... мне ее надо завтра сдать, ну по твоему времени сегодня. просто иначе меня не допустят к экзамену.
хотел сам написать, писал писал, а щас время поджало, поэтому тебя прошу.

Добавлено (20.12.2011, 08:27)
---------------------------------------------
ну по моему времени надо сдать в 17 часов, по твоему значит в 24..вот таки дела. буду тебе очень благодарен если поможешь.
сам вот сейчас сижу мучаюсь посреди ночи, ничего не выходит

 
SeqularДата: Вторник, 20.12.2011, 13:43 | Сообщение # 8
Хранитель
Группа: Администраторы
Сообщений: 859
Репутация: 35
Статус: Offline
Кое-что получилось. Вот пол-задачи.
Думаю, разберёшься...
Сперва добавляешь дерево типа такого:


Потом уже добавляешь поэлементно. не забывай сохранить в файл (S). Потом можно его загружать (L)

Осталось реализовать поиск родителей, братьев и дедушек
Прикрепления: GENEAL.pas (4.3 Kb) · TREE.txt (0.1 Kb) · 4594090.gif (9.7 Kb)


Поддерживаю также проект сообщество молодых сисадминов
 
SeqularДата: Вторник, 20.12.2011, 18:14 | Сообщение # 9
Хранитель
Группа: Администраторы
Сообщений: 859
Репутация: 35
Статус: Offline

Вот более простая схема. Для проверки.

А вот и более простой код:
Прикрепления: 4514825.pas (5.2 Kb) · 8994623.gif (15.7 Kb)


Поддерживаю также проект сообщество молодых сисадминов
 
ChesДата: Вторник, 20.12.2011, 18:19 | Сообщение # 10
Знакомый
Группа: Пользователи
Сообщений: 12
Репутация: 0
Замечания: 0%
Статус: Offline
спасибо большое) только у меня проблема, ехе не работает, не включается вообще. я удалил очистку экрана, потому что у меня не компилилось, может в этом проблема
 
SeqularДата: Вторник, 20.12.2011, 18:21 | Сообщение # 11
Хранитель
Группа: Администраторы
Сообщений: 859
Репутация: 35
Статус: Offline
Ches, А какой компилятор? Попробуйте тем, что у нас на сайте лежит... Может поможет. Я в нём делаю.

Поддерживаю также проект сообщество молодых сисадминов
 
ChesДата: Вторник, 20.12.2011, 18:24 | Сообщение # 12
Знакомый
Группа: Пользователи
Сообщений: 12
Репутация: 0
Замечания: 0%
Статус: Offline
я на GNU компилю...у нас в универе они стоят. хорошо сейчас попробую
 
SeqularДата: Вторник, 20.12.2011, 18:25 | Сообщение # 13
Хранитель
Группа: Администраторы
Сообщений: 859
Репутация: 35
Статус: Offline
Ches, Так а что там? Ошибка? Не компилится? Может дело в CRT-модуле? Из сторонних, я только его использую.

Поддерживаю также проект сообщество молодых сисадминов
 
ChesДата: Вторник, 20.12.2011, 18:28 | Сообщение # 14
Знакомый
Группа: Пользователи
Сообщений: 12
Репутация: 0
Замечания: 0%
Статус: Offline
да он пишет ошибку на CRT, когда его убираешь приходиться убирать все очистки, а у тебя там выбор С к очистке привязан
 
SeqularДата: Вторник, 20.12.2011, 18:29 | Сообщение # 15
Хранитель
Группа: Администраторы
Сообщений: 859
Репутация: 35
Статус: Offline
Ches, Да, тогда Readkey нужно менять на Readln.

Поддерживаю также проект сообщество молодых сисадминов
 
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Copyright MyCorp © 2025
Используются технологии uCoz
javascript:;" rel="nofollow" onclick="loginPopupForm(); return false;