Пожалуйста, помогите с задачей
|
|
Ches | Дата: Понедельник, 19.12.2011, 01:34 | Сообщение # 1 |
Знакомый
Группа: Пользователи
Сообщений: 12
Статус: Offline
| Имеется дерево, корень которого соответствует основателю рода. Сыновья каждой вершины задают сыновей и дочерей соответствующего человека. Указывается имя некоторого человека. Требуется выдать имена его детей, внуков, сестер и братьев, одного из родителей, дедушки или бабушки
Прошу, помогите.
|
|
| |
Seqular | Дата: Понедельник, 19.12.2011, 08:35 | Сообщение # 2 |
Хранитель
Группа: Администраторы
Сообщений: 859
Статус: Offline
| Ches, Интересная задачка. Только вопрос по реализации? Что нужно? Динамический двусвязный список? Массив?
Поддерживаю также проект сообщество молодых сисадминов
|
|
| |
Ches | Дата: Понедельник, 19.12.2011, 19:40 | Сообщение # 3 |
Знакомый
Группа: Пользователи
Сообщений: 12
Статус: 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
Статус: Offline
| Ches, не совсем понятно, что значит точка. Ну да ладно )) я в чужих кодах не люблю разбираться, попробую своё что-нибудь накатать. )
Поддерживаю также проект сообщество молодых сисадминов
|
|
| |
Ches | Дата: Вторник, 20.12.2011, 03:01 | Сообщение # 5 |
Знакомый
Группа: Пользователи
Сообщений: 12
Статус: Offline
| точка нужна для определения уровней. если ты про файл. препод сказал, что так легче искать по дереву. я с ним спорить не стал, так как в деревьях не особо понимаю.
хорошо, спасибо, надеюсь что-нибудь получится)Добавлено (20.12.2011, 03:01) --------------------------------------------- хотел спросить, кстати, у тебя какой часовой пояс?) а то такая разница, у меня щас 20:00, а на сайте аж 03:00
|
|
| |
Seqular | Дата: Вторник, 20.12.2011, 08:22 | Сообщение # 6 |
Хранитель
Группа: Администраторы
Сообщений: 859
Статус: Offline
| Ches, Сахалин. Местное время +7 к Московскому. ) Пока пишу коды. Тебе срочно?
Поддерживаю также проект сообщество молодых сисадминов
|
|
| |
Ches | Дата: Вторник, 20.12.2011, 08:27 | Сообщение # 7 |
Знакомый
Группа: Пользователи
Сообщений: 12
Статус: Offline
| Seqular, Да... мне ее надо завтра сдать, ну по твоему времени сегодня. просто иначе меня не допустят к экзамену. хотел сам написать, писал писал, а щас время поджало, поэтому тебя прошу.Добавлено (20.12.2011, 08:27) --------------------------------------------- ну по моему времени надо сдать в 17 часов, по твоему значит в 24..вот таки дела. буду тебе очень благодарен если поможешь. сам вот сейчас сижу мучаюсь посреди ночи, ничего не выходит
|
|
| |
Seqular | Дата: Вторник, 20.12.2011, 13:43 | Сообщение # 8 |
Хранитель
Группа: Администраторы
Сообщений: 859
Статус: Offline
| Кое-что получилось. Вот пол-задачи. Думаю, разберёшься... Сперва добавляешь дерево типа такого:
Потом уже добавляешь поэлементно. не забывай сохранить в файл (S). Потом можно его загружать (L)
Осталось реализовать поиск родителей, братьев и дедушек
Поддерживаю также проект сообщество молодых сисадминов
|
|
| |
Seqular | Дата: Вторник, 20.12.2011, 18:14 | Сообщение # 9 |
Хранитель
Группа: Администраторы
Сообщений: 859
Статус: Offline
| Вот более простая схема. Для проверки.
А вот и более простой код:
Поддерживаю также проект сообщество молодых сисадминов
|
|
| |
Ches | Дата: Вторник, 20.12.2011, 18:19 | Сообщение # 10 |
Знакомый
Группа: Пользователи
Сообщений: 12
Статус: Offline
| спасибо большое) только у меня проблема, ехе не работает, не включается вообще. я удалил очистку экрана, потому что у меня не компилилось, может в этом проблема
|
|
| |
Seqular | Дата: Вторник, 20.12.2011, 18:21 | Сообщение # 11 |
Хранитель
Группа: Администраторы
Сообщений: 859
Статус: Offline
| Ches, А какой компилятор? Попробуйте тем, что у нас на сайте лежит... Может поможет. Я в нём делаю.
Поддерживаю также проект сообщество молодых сисадминов
|
|
| |
Ches | Дата: Вторник, 20.12.2011, 18:24 | Сообщение # 12 |
Знакомый
Группа: Пользователи
Сообщений: 12
Статус: Offline
| я на GNU компилю...у нас в универе они стоят. хорошо сейчас попробую
|
|
| |
Seqular | Дата: Вторник, 20.12.2011, 18:25 | Сообщение # 13 |
Хранитель
Группа: Администраторы
Сообщений: 859
Статус: Offline
| Ches, Так а что там? Ошибка? Не компилится? Может дело в CRT-модуле? Из сторонних, я только его использую.
Поддерживаю также проект сообщество молодых сисадминов
|
|
| |
Ches | Дата: Вторник, 20.12.2011, 18:28 | Сообщение # 14 |
Знакомый
Группа: Пользователи
Сообщений: 12
Статус: Offline
| да он пишет ошибку на CRT, когда его убираешь приходиться убирать все очистки, а у тебя там выбор С к очистке привязан
|
|
| |
Seqular | Дата: Вторник, 20.12.2011, 18:29 | Сообщение # 15 |
Хранитель
Группа: Администраторы
Сообщений: 859
Статус: Offline
| Ches, Да, тогда Readkey нужно менять на Readln.
Поддерживаю также проект сообщество молодых сисадминов
|
|
| |