Программа
PROGRAM Proger(input,output);
CONST FileName='PROG'; { Имя текстового файла }
QuantityChar=9; { Максимальное количество символов в идентификаторе }
{ Множества символов входящих в идентификаторы: }
Letter=['_','A'..'Z','a'..'z'];
LetterNum=['0'..'9'];
LetterWide=Letter+LetterNum;
TYPE WordType=array [1..QuantityChar] of char; { Тип - слово }
WordTreeType=^Word; { Тип - дерево слов }
Word=record { Тип - слово (элемент дерева) }
W:WordType; { Слово }
Q:integer; { Встречаемость слова в файле }
Pred,Next:WordTreeType
{ Ссылки на предыдущее и последующее (по алфавиту) слова }
end;
VAR F:text; { Файловая переменная }
WordTree:WordTreeType; { Дерево слов }
PROCEDURE UpCase(var Ch:Char);
Begin { Поцедура преобразования строчных букв в прописные }
if Ch in ['a'..'z'] then Ch:=Chr(Ord(Ch)+Ord('A')-Ord('a'))
End;
PROCEDURE ReadWord(var F:text;var Buf:WordType); { Процедура чтения слова }
Var i:0..QuantityChar; { Счетчик прочитанных символов }
PredChar:Char; { Предыдущий прочитанный символ }
BufChar:Char; { Прочитанный символ }
Begin
while EOLn(F) and not EOF(F) do ReadLn(F); { "Сброс" пустых строк }
BufChar:=' '; { Сброс значения прочитанного символа }
PredChar:=' '; { Сброс значения предыдущего символа }
Buf[1]:=' '; { Сброс первого символа в слове (установка отсутствия слова) }
while not EOF(F) and (not (BufChar in Letter) and not (PredChar in LetterNum)) do
begin { Цикл чтения файла до первого символа принадлежащего идентификатору }
PredChar:=BufChar; { Сохранение предыдущего символа }
Read(F,BufChar); { Чтение символа }
if BufChar='{' then { Если начало коментария }
begin
while BufChar<>'}' do if EOLn(F) then ReadLn(F) else Read(F,BufChar);
{ то "сброс" символов до конца коментария }
PredChar:=' ' { Сброс предыдущего символа }
end;
{ То же для "альтернативного" коментария: }
if (PredChar='(')and(BufChar='*') then
while not ((PredChar='*')and(BufChar=')')) do
if EOLn(F) then begin ReadLn(F); PredChar:=' ' end
else begin PredChar:=BufChar; Read(F,BufChar) end;
{ "Сброс" строковой константы: }
if BufChar='''' then begin
BufChar:=' ';
while BufChar<>'''' do Read(F,BufChar);
PredChar:=' '
end
end;
if (BufChar in Letter) and not (PredChar in LetterNum) then
begin { Прверка начала идентификатора }
for i:=1 to QuantityChar do { Цикл чтения слова }
begin
Buf[i]:=BufChar; { Определение символа в слове }
{ Чтение символа (если нет конца слова ) }
if not EOLn(F) and (BufChar<>' ')
then Read(F,BufChar)
else BufChar:=' '; { Сброс символа при достижении конца строки }
if not (BufChar in (LetterWide+[' '])) then BufChar:=' '
{ "Сброс" прочитанного символа невходящего в идентификатор }
end;
for i:=1 to QuantityChar do UpCase(Buf[i])
{ Перевод строчных букв в прописные }
end
End;
FUNCTION CheckDifferent(W1,W2:WordType):integer; { Функция сравнения слов }
Var i:1..QuantityChar; { Счетчик символов в слове }
Begin
i:=1; { Начальная установка счетчика }
while (W1[i]=W2[i])and(i<QuantityChar) do i:=i+1;
{ Цикл поиска первой пары различных символов }
{ Сравнение пары символов и определение зачения функции: }
if W1[i]=W2[i]
then CheckDifferent:=0
else if W1[i]<W2[i]
then CheckDifferent:=-1
else CheckDifferent:=1
End;
PROCEDURE InsertWord(var WordTree:WordTreeType;Buf:WordType);
{ Процедура вставки слова в дерево }
Begin
if WordTree=nil { Проверка наличия элемента дерева }
then begin { Формирование нового элемента }
New(WordTree); { Создание новой переменной }
with WordTree^ do begin { Инициализация полей }
W:=Buf;
Q:=1;
Pred:=nil;
Next:=nil
end
end
else case CheckDifferent(Buf,WordTree^.W) of
{ Сравнение полученного слова со словом в дереве }
-1:InsertWord(WordTree^.Pred,Buf);
{ Переход в сторону предыдущих по алфавиту слов }
0:WordTree^.Q:=WordTree^.Q+1;
{ Пересчет встречаемости данного слова }
1:InsertWord(WordTree^.Next,Buf)
{ Переход в сторону слудующих по алфавиту слов }
end
End;
PROCEDURE ReadFile(var F:text;var WordTree:WordTreeType);
{ Процедура чтения файла и создания дерева слов }
Var Buf:WordType; { Буферная переменная для чтения слов }
Begin
Reset(F); { Открытие файла }
while not EOF(F) do { Цикл чтения файла }
begin
ReadWord(F,Buf); { Чтение слова из файла }
if Buf[1]<>' ' then InsertWord(WordTree,Buf)
{ Если прочитанное - слово, то вставка слова в дерево }
end;
Close(F) { Закрытие файла }
End;
PROCEDURE DisposerTree(var L:WordTreeType); { Процедура удаления дерева }
Begin
if L<>nil then begin { Если переменная существует, то }
{ удаление поддеревьев: }
DisposerTree(L^.Pred);
DisposerTree(L^.Next);
Dispose(L); { удаление переменной }
L:=nil { преопределение ссылки }
end
End;
PROCEDURE OutListWord(WordTree:WordTreeType); { Вывод дерева }
Begin
if WordTree<>nil then { Если элемент существует, то: }
with WordTree^ do
begin
OutListWord(Pred); { Вывод поддерева с предыдущими словами }
Write(W,Q:4,' ');{ Вывод слова }
OutListWord(Next) { Вывод поддерева с последующими словами }
end
End;
BEGIN
WriteLn; { Пропуск строки }
WordTree:=nil; { Сброс ссылки на дерево }
Assign(F,FileName); { Связывание файловой переменной с файлом }
ReadFile(F,WordTree); { Чтение файла и создание дерева слов }
OutListWord(WordTree); { Вывод списка слов }
WriteLn { Пропуск строки }
END.
Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию