Текст программы

Program Lab_9;

{ Программа Лабораторной работы N 9

Динамические переменные. Списки.

Вариант N 31.

А.Я.Умненькая, ст. гр. Я-007}

TYPE data = record {описатель структуры данных студента}

Name : string[15]; { поле для Фамилии И.О.}

Bal1,Bal2 : integer; {поля баллов за 2 семестра}

SrBal : real; {поле для среднего балла }

end;

Pd=^Dek; {описатель указателей на вершины дека}

Dek= record { описатель звена дека}

P1:Pd; {поле указателя следующего звена от начала}

P2:Pd; {поле указателя следующего звена от конца }

Student: data; { поле данных студента}

end;

VAR

Docum: data; {рабочая структура данных о студенте }

DN,DK : Pd; { указатели на начало и конец дека }

Fin,Fout:text; {Файлы входных данных и результатов работы}

k:integer; { количество элементов дека}

Procedure GetStud(Var F:text; var St:data);

{процедура чтения одной записи файла и формирования данных студента}

Var

P,i:integer;

Begin

i:=0;

P:=0;

St.Name:='---------------'; поле фамилии заполняем строкой из прочерков максимальной длины

while P<2 do {пока не прочтем второй пробел }

begin

inc(i);

read(F,St.Name[i]); {читаем из файла по символу в поле имени }

if St.Name[i]=' ' then P:=P+1; { подсчет пробелов}

end;

St.Name:=Copy(St.Name,1,i); { Из полной строки поля фамилии вырезаем подстроку по второй пробел (включительно) и заносим обратно в поле фамилии }

readln(F,St.Bal1,St.Bal2,St.SrBal); { остаток записи файла читаем в поля оценок }

End;

Procedure PutDek(Var NK,KN:Pd; Inf:data; Beg:boolean);

{процедура добавления элемента в дек с заказанного конца}

Var U:Pd;

Begin

New(U);

U^.Student:=Inf;

U^.P1:=nil;

U^.P2:=nil;

if NK=nil then { если дек перед этим был пуст }

KN:=U

else

if Beg then { если добавляем в начало }

begin

U^.P1:=NK;

NK^.P2:=U;

end

else { если добавляем в конец }

begin

U^.P2:=NK;

NK^.P1:=U;

end;

NK:=U;

End;

Procedure DelDek(Var NK,KN:Pd; var Inf:data; Beg:boolean);

{процедура выбора элемента из заказанного конца дека }

Var U:Pd;

Begin

U:=NK;

Inf:=U^.Student;

if NK=KN then { если в деке был всего один элемент}

begin { делаем дек пустым}

KN:=nil;

NK:=nil;

end

else

if Beg then { если удаление из начала }

begin

NK:=U^.P1;

NK^.P2:=nil;

end

else { если удаление из конца }

begin

NK:=U^.P2;

NK^.P1:=nil;

end;

Dispose(U); { собственно освобождение памяти от элемента }

End;

Procedure ReadFile(Var F:text; Var DekN,DekK:Pd; var N:integer);

{ чтение файла с заполнением дека }

Var

Stud:data;

Begin

N:=0;

While Not Eof(F) do

begin

GetStud(F,Stud);

N:=N+1;

if (Stud.Bal1=5) and (Stud.Bal2=5) then

PutDek(DekN,DekK,Stud,TRUE)

else

if (Stud.Bal1=3) and (Stud.Bal2=3) then

PutDek(DekK,DekN,Stud,FALSE)

else { если данные не заносим в дек }

N:=N-1;

end;

End;

Procedure WriteFile(Var F:text; Var NK,KN:Pd; N:integer);

{ процедура распечатки дека в выводной файл с удалением дека}

Var

i:integer;

Stud:data;

Begin

Writeln(F,'|--------------------------------------',

'--------------|');

Writeln(F,'| N | Фамилия И.О. | 1-й балл | 2-й ',

'балл | Ср.балл |');

For i:=1 to N do

begin

Writeln(F,'|---|----------------|----------|----',

'------|---------|');

DelDek(NK,KN,Stud,TRUE);

WriteLn(F,'|',i:2,' | ',Stud.Name:15,'|',Stud.Bal1:6,

' |',Stud.Bal2:6,' |', Stud.SrBal:6:1,' |');

end;

Writeln(F,'|--------------------------------------',

'--------------|');

End;

BEGIN { ОСНОВНАЯ ПРОГРАММА }

Assign(Fin,'Dan.txt');

Reset(Fin);

Assign(Fout,'Umnik9.res');

ReWrite(Fout);

DN:=nil;

DK:=nil;

k:=0;

ReadFile(Fin,DN,DK,k);

Close(Fin);

With Docum do

begin

Bal1:=k;

Bal2:=0;

SrBal:=0.0;

Name:='Список типа S0D';

end;

PutDek(DN,DK,Docum,TRUE); { добавление в начало дека записи со сводной информацией. }

DelDek(DN,DK,Docum,TRUE); {Выбор из дека сводной информации для печати }

Writeln(Fout, Docum.Name:20,' из ',Docum.Bal1,' строк');

WriteFile(Fout,DN,DK,k); {печать дека в файл с удалением элементов дека}

close(Fout);

End.