IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Построение дерева поиска, работа с последовательностями ("деревья")
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 5
Пол: Женский
Реальное имя: Анна Малаева

Репутация: -  0  +


Доброго времени суток. Недавно задали нижеприведенную задачу. Очень нуждаюсь с Вашей помощи!
Заранее спасибо за данные советы и, возможно, решение.





Исходная последовательность значений читается из текстового
файла 'file_in.pas'. Файл может быть прочитан только один раз.

ВСЕ СТРУКТУРЫ ДАННЫХ ДОЛЖНЫ БЫТЬ РЕАЛИЗОВАНЫ В ВИДЕ ОБЪЕКТОВ,
(КЛАССОВ), имеющих весь "джентльменский набор" - конструкторы,
деструкторы, "полную" инкапсуляцию и др.


........................................................................
Задание:
Цитата
Дана последовательность слов, составленных из символов английских
букв. Слова pазделены несколькими пpобелами. Длина любого слова не
пpевосходит 10 символов. Последовательность завеpшается сочетанием ' *'.
Постpоить для этой последовательности деpево поиска и pаспечатать его.
Напечатать слова исходной последовательности в алфавитном поpядке, указав
для каждого слова количество повтоpений. Разpешается использовать
массив из 10 символов для хpанения вводимого слова.


Пpимеp:
последовательность:
МАР РТХ ТНА КСВ РТХ КСА НЕВ КСН ТХМ ХК КСА РТХ *

деpево:

_____________________НЕВ
_________________КСА
_____________КСВ
_________________КСН
_________МАР
_____________РТХ
_____________________ТХМ
_________________ТНА
_____________________ХК

pезультат: НЕВ-1 КСА-2 КСВ-1 МАР-1 РТХ-3 ТНА-1 ТХМ-1 ХК-1
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Ну, решение-то уже есть:
FAQ: Бинарные деревья

Все, что осталось - перенести его на ООП-основу. Сама сможешь?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 5
Пол: Женский
Реальное имя: Анна Малаева

Репутация: -  0  +


Большое спасибо. Сама почему-то не нашла. Видимо, поиском коряво пользовалась.

В ООП-основу? Конечно, буду пытаться. Но не факт, что всё получится. У меня с этим временные проблемы.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Будут затруднения - пиши, будем разбираться вместе...
give_rose.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





Группа: Пользователи
Сообщений: 5
Пол: Женский
Реальное имя: Анна Малаева

Репутация: -  0  +


Никак не могу. =(
FAQ вроде и понятен, однако как всё это "загнать" в ООП и оформить - проблема.
кто может помочь? Ну пожалуйста! wacko.gif sad.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Ну, вот тебе набросок... Я начал переносить программу из FAQ в ООП, только не закончил еще... Попробуй продолжить...
Type
TType = string[10];


TTree = ^TNode;

TNode =
Object
Constructor Create(s: TType);

Data: TType;
Count: Integer;
Left, Right: TTree;
End;

Constructor TNode.Create(s: TType);
Begin
Data := s; Count := 1;

Left := nil;
Right := nil
End;





Procedure Add(Var T: TTree; s: TType);

Begin
If T <> nil Then
With T^ Do Begin

If Data < s Then Add(Right, s)
Else
If Data > s Then Add(Left, s)
Else
Inc(T^.Count);

End
Else
T := new(TTree, Create(s));
End;


Procedure Delete(T: TTree);
Begin
If T = nil Then Exit;

Delete(T^.Right);
Delete(T^.Left);
Dispose(T)
End;

Function FindNode(p: TTree; ToFind: TType): TTree;
Var pp: TTree;
Begin
If p <> nil Then Begin
pp := p;
While pp <> nil Do Begin

If ToFind < pp^.Data Then
pp := pp^.Left
Else
If ToFind = pp^.Data Then Break
Else pp := pp^.Right

End;
FindNode := pp
End
Else FindNode := nil
End;


Procedure PrintDown(T: TTree);
Begin
If T = nil Then Exit;
With T^ Do Begin

Write(Data, ':', Count, ' ');
PrintDown(Left); PrintDown(Right)

End
End;

Procedure PrintLex(T: TTree);
Begin
If T = nil Then Exit;
With T^ Do Begin

PrintLex(Left);
Write(Data, ':', Count, ' ');
PrintLex(Right)
End
End;

Procedure PrintUp(T: TTree);
Begin
If T = nil Then Exit;
With T^ Do Begin

PrintUp(Left);
PrintUp(Right);
Write(Data, ':', Count, ' ');

End
End;


Procedure LeafsCount(T: TTree; Var k: Integer);
Begin
If T <> nil Then Begin
LeafsCount(T^.Left, k);

If (T^.Left = nil) and (T^.Right = nil) Then Inc(k);
LeafsCount(T^.Right, k)
End
End;

Function GetNode(T: TTree): TType;
Begin
GetNode := '';

If T = nil Then
writeln('Error - empty tree!')
Else GetNode := T^.Data
End;







procedure get_words(s: string;
var root: TTree);
const
delimiter = [#32, '*'];
var
count: integer;

i, curr_len: byte;

begin
count := -1; i := 1;
while i <= length(s) do begin

while (s[i] in delimiter) and (i <= length(s)) do inc(i);

curr_len := 0;
while not (s[i] in delimiter) and (i <= length(s)) do begin
inc(i); inc(curr_len);
end;

if curr_len > 0 then begin
Add(root, copy(s, i - curr_len, curr_len));
end;

end;
end;



const
s: string = 'MAP PTX THA KCB PTX KCA HEB KCH TXM XK KCA PTX *';

var
root: TTree;

begin
root := nil;
get_words(s, root);
printLex(root);
end.
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 21.09.2020 17:25
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name