Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Построение дерева поиска

Автор: Анна М. 17.03.2006 0:46

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





Исходная последовательность значений читается из текстового
файла '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

Автор: volvo 17.03.2006 0:53

Ну, решение-то уже есть:
http://forum.pascal.net.ru/index.php?s=&showtopic=2706&view=findpost&p=28334

Все, что осталось - перенести его на ООП-основу. Сама сможешь?

Автор: Анна М. 17.03.2006 0:57

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

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

Автор: volvo 17.03.2006 1:00

Будут затруднения - пиши, будем разбираться вместе...
give_rose.gif

Автор: Анна М. 30.03.2006 22:29

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

Автор: volvo 30.03.2006 22:51

Ну, вот тебе набросок... Я начал переносить программу из 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.

Автор: should i take 1mg or 5mg of prop 10.09.2021 16:51

Notas De Propecia

Автор: buy prednisone online without a 10.10.2021 17:56

similar a la viagra

Автор: is neurontin commonly used with 9.12.2021 9:55

Comprime Cytotec