Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
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 |
Литература
Дата публикования: 2014-11-03; Прочитано: 294 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!