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

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

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

> Бинарные деревья поиска, Определить пути в дереве, имеющие только
FENIX
сообщение 26.04.2005 17:21
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 45
Пол: Мужской

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


Задание:
Дан текстовый файл. Построить дерево поиска из символов этого файла. Определить пути в дереве, имеющие только согласные буквы. Все эти вершины отметить цветом.

Моя задумка заключается в следующем: в процедуре Print сравнивать входящую информацию с инфой в массиве и, соответственно, менять цвет.
Но что-то ничего не сравнивается sad.gif
Не могу понять, как сделать правильно.


Program Lab;
Uses Crt;

Const n = 19;

Alphabet : array [1..n] of String =
  ('b', 'c', 'd', 'f', 'g', 'h', 'k', 'l', 'm', 'n', 'p', 'q', 'r',
  's', 't', 'v', 'w', 'x', 'z');

Type DataType = String;

Type BTreePtr = ^BTree;

BTree = object
       Data : DataType;
       Barrier : boolean;
       Left, Right : BTreePtr;
       LLen, RLen : word;
       Constructor Init;
       Destructor Done;
       Procedure Print(K : word);
       Procedure Add_Search(D : DataType); virtual;
       {Procedure Main;}
end;

Constructor BTree.Init;
begin
  Barrier := TRuE;
end;

Destructor BTree.Done;
begin
  If not Barrier then
  begin
     Dispose(Left, Done);
     Dispose(Right, Done);
  end;
end;

Procedure BTree.Add_Search(D : DataType);
begin
  If Barrier then
  begin
     Data := D;
     Barrier := false;
     New(Left, Init);
     New(Right, Init);
  end
  else
  If D < Data then
  Left^.Add_Search(D) else Right^.Add_Search(D);
end;

==============================

Procedure BTree.Print(K : word);
var i : word;
begin
  If not Barrier then
  begin
     Left^.Print(k + 4);
     For i := 1 to n do
     If Data = Alphabet[i] then
     begin
        TextColor(Yellow);
     end
     else
     TextColor(7);
     writeln(Data : k);
     Right^.Print(k + 4);
  end;
end;

==============================

var B1 : BTree;
  input : text;
  s, sl : string;
  i : word;

BEGIN
  ClrScr;
  assign(input, 'Lab_12.txt');
  reset(input);
  writeln('BEFORE - ', MemAvail, ' bytes.');
  writeln;
  B1.Init;

  While not EOF (input) do
  begin
     sl := '';
     Readln(input, s);
     If s[length(s)] <> ' '
     then s := s + ' ';
        For i := 1 to length(s) do
           If s[i] <> ' '
           then sl := sl + s[i]
           else
           If length(sl) <> 0 then
           begin
              B1.Add_Search(sl);
              sl := '';
           end;
  end;

  B1.Print(4);
  {B1.Main;}
  writeln;
  B1.Done;
  writeln('AFTER - ', MemAvail, ' bytes.');
  readln;

END.


Сообщение отредактировано: FENIX - 26.04.2005 17:24
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
FENIX
сообщение 26.04.2005 21:38
Сообщение #2


Новичок
*

Группа: Пользователи
Сообщений: 45
Пол: Мужской

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


Хммм...
Очень странно, но у меня твоя процедура наотрез отказывалась работать blink.gif
...

Однако я ее переделал вот так :low: и все заработало:

If not Barrier then 
begin
Left^.Print(k + 4);
only_cons := false;
For i := 1 to length(Data) do
begin
If Data[i] in alpha then
only_cons:=true;
end;
If only_cons then TextColor(Yellow) else TextColor(7);
writeln(Data : k);
textcolor(7);
Right^.Print(k + 4);
end;



З.Ы. Пример входного файла Lab_12.txt :
Цитата
a o g l f k e h v y o i r s

З.З.Ы. Еще вопросик: если в файле будут большие буквы, то прога не учтет их. Как исправить, не добавляя константы из больших букв? Я что-то слышал-видел, связанное с UpCase...

Сообщение отредактировано: FENIX - 26.04.2005 22:03
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 26.04.2005 22:51
Сообщение #3


Гость






Цитата(FENIX @ 26.04.05 21:38)
если в файле будут большие буквы, то прога не учтет их. Как исправить, не добавляя константы из больших букв? Я что-то слышал-видел, связанное с UpCase...

Нет... Как раз наоборот, тебе нужно будет внести ТОЛЬКО большие буквы (не добавляя маленьких) и использовать UpCase:
For i := 1 to length(Data) do begin
If UpCase(Data[i]) in alpha then only_cons:=true;
end;


Но стандартную функцию Паскаля можно использовать только если буквы у тебя латинские. Если же используется кириллица - поищи по форуму, выкладывалась функция для обработки любых символов (можешь посмотреть в моем модуле в FAQ: Строки, там точно есть...)
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 



- Текстовая версия 20.07.2025 12:22
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"