Программа
PROGRAM Compare;
TYPE SymbolS=^SymbolRecord; { Тип "Ссылка на запись символа" }
SymbolRecord=record { Запись символа }
Ch:Char; { Символ (буква) }
Next:SymbolS { Ссылка на следующую запись }
end;
VAR FileName:String; { Имя входного файла }
List1,List2:SymbolS; { Ссылки на списки первой и второй
половины символов файла }
PROCEDURE DisposerList(var S:SymbolS); { Процедура удаления списка }
Begin
if S<>nil then begin { Если переменная существует, то }
DisposerList(S^.NEXT); { удаление хвоста списка }
Dispose(S) { удаление переменной }
end;
S:=nil { Переопределение ссылки }
End;
PROCEDURE LoadFile(FileName:string;var S:SymbolS);
{ Процедура загрузки файла }
Var Buf:SymbolS; { Буферная переменная для создания очереди }
FileVar:text; { Файловая переменная }
Begin
Assign(FileVar,FileName);{ Связывание файловой переменной с именем файла }
Reset(FileVar); { Открытие файла для чтения }
S:=nil; { Формирование конца списка }
while not EOF(FileVar) do { Цикл чтения файла и формирование списка }
begin
New(Buf); { Создание новой переменной под символ }
Read(FileVar,Buf^.Ch); { Чтение символа }
Buf^.Next:=S; { Связывание списка с буферной переменной }
S:=Buf; { Переопределение ссылки на список }
end;
Close(FileVar) { Закрытие файла }
End;
PROCEDURE DivisionList(List1:SymbolS;var List2:SymbolS);
{ Процедура деления списка на две части }
Function QuantityElementInList(Element:SymbolS):Longint;
{ Функция подсчета количества элементов в списке }
begin
if Element<>nil { Если список не пуст, }
then QuantityElementInList:=QuantityElementInList(Element^.Next)+1
{ то - определение значения функции по длине продолжения списка }
else QuantityElementInList:=0
{ иначе - определение нулевой длины }
end;
Var i:longint; { Счетчик }
Begin
for i:=1 to QuantityElementInList(List1) div 2 -1 do List1:=List1^.Next;
{ Движение по списку до последненго элемента первой половины }
if List1<>nil { Если первый список не пуст, }
then begin { то }
List2:=List1^.Next; { определение ссылки на вторую половину списка }
List1^.Next:=nil { формирование конца первого списка }
end
else List2:=nil; { иначе - определение второго списка пустым }
End;
FUNCTION ListCompare(List1,List2:SymbolS):boolean; { Функция сравнения списков }
Begin
if (List1<>nil)and(List2<>nil)
then if List1^.Ch=List2^.Ch
then ListCompare:=ListCompare(List1^.Next,List2^.Next)
else ListCompare:=FALSE
else ListCompare:=(List1=nil)and(List2=nil)
{ Если ссылки одновременно не равны nil,
то если символы равны,
то определение значения функции по факту равенства
продолжений списков
иначе определение значения функции FALSE
иначе определение значения функции по факту одновременного равенства
ссылок на nil }
End;
BEGIN
WriteLn; { Пропуск строки }
Write('Введите имя входного файла '); { Вывод приглашения ввести имя файла }
ReadLn(FileName); { Ввод имени файла }
LoadFile(FileName,List1); { Чтение файла }
DivisionList(List1,List2); { Деление списка на две части }
{ Сравнение списков и вывод соответствующего сообщения: }
if ListCompare(List1,List2)
then WriteLn('Первая и вторая половины файла равны')
else WriteLn('Первая и вторая половины файла НЕ равны');
DisposerList(List1); { Удаление первого списка из памяти }
DisposerList(List2) { Удаление второго списка из памяти }
END.
Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию