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

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.


Варианты заданий

Таблица 33. Варианты заданий лабораторной работы № 9

№ вар. Требования к записям, выбираемым из файла и помещаемым в список Тип Списка Файл данных
Средний балл выше 3 S2KI dan.dat
Отличные оценки во всех полях S2KO dan.txt
Первые буквы фамилий А, Б, В S0S dan.dat
Оценки во всех полях ниже 4 баллов S0O dan.txt
Первая оценка выше 3 S1L dan.dat
Первая или вторая оценка выше 3 S1KI dan.txt
Первая оценкой ниже 5, а вторая выше 3 S1KO dan.dat
Первые буквы фамилий А, В, Е и средние оценки выше 3 S2L dan.txt
Оценки 3 во всех полях оценок S2KI dan.dat
Средние оценки выше 3 баллов S2KO dan.txt
Вторая оценка выше 4, а первая выше 3 баллов S0S dan.dat
Первая и вторая оценки выше 4 баллов S0O dan.txt
В начало –со средней оценкой <4 балла, в конец – прочие S0D dan.dat
Первые буквы фамилий А, Б, В и средние оценки выше 4 S1L dan.txt
Вторые и средние оценки выше 4 баллов S1KI dan.dat
Первая оценка выше 3 баллов, а средняя оценка выше 3,5 S1KO dan.txt
Все оценки не ниже 4 баллов S2L dan.dat
Вторая и средняя оценки выше 4 баллов S2KI dan.txt
Средняя оценка выше 3,5 баллов S2KO dan.dat
Средняя оценка ниже 4,5 и фамилии начинаются с букв А и В S0S dan.txt
Средняя оценка выше 4 баллов и фамилии, начинаются с букв от А до К S0O dan.dat
В начало – если первая оценка 3, в конец – если первая – 5 S0D dan.txt
Первая оценка выше 3 балов, а средняя оценка 4 балла S1L dan.dat
Все оценки выше 4 и фамилии начинаются с букв А - Е S1KI dan.txt
Первая и средняя оценки выше 4 баллов S1KO dan.dat
Все оценки ниже 5 баллов S2L dan.txt
Первая или вторая оценка выше 4 баллов S2KI dan.dat
Первая или средняя оценки ниже 4 баллов S2KO dan.txt
Средняя оценка выше 4 баллов S0S dan.dat
Все оценки выше 4 или фамилии начинаются с букв А - Е S0O dan.txt
В начало – только с пятерками, в конец – только с тройками S0D dan.txt

Литература

  1. Бородич Ю.С., Вальвачев А.Н., Кузьмич А.И. Паскаль для персональных компьютеров: Справочне пособие. Минск: "Вышейшая школа", 1991.
  2. Епанешников А.М., Епанешников В.А. Программирование в среде Turbo Pascal 7.0 (третье издание). М.: "Диалог-МИФИ", 1996.
  3. Немнюгин С.А. Turbo Pascal: практикум. СПб.: Питер, 2001.
  4. Кнут Д. Искусство программирования для ЭВМ. /Пер. с англ.: В 3-х томах. т.3. Сортировки и поиск. М.: Мир, 1976.
  5. Бронштейн И.Н., Семендяев К.А. Справочник по математике для инженеров и учащихся ВТУЗов (Изд. 13-е). М.: "Наука", 1986.

 

Приложение А.
Система меню и команды Турбо-Паскаля