ВУЗ: Пермский национальный исследовательский политехнический университет
Категория: Лекция
Дисциплина: Программирование
Добавлен: 19.10.2018
Просмотров: 4357
Скачиваний: 8
СОДЕРЖАНИЕ
Лабораторная работа №11, вариант № 5.
9.3.1. Слияние упорядоченных последовательностей.
9.3.2. Сортировка сбалансированным слиянием
9.3.3. Сортировка простым слиянием
9.3.4. Сортировка естественным слиянием.
9.3.5. Сортировка многофазным слиянием.
Выполнение операций над списковыми структурами.
Выполнение операций над списковыми структурами.
Работа со стеками и очередями.
Работа со стеками и очередями.
11. Организация меню с использованием средств среды Turbo Pascal
Program T8_5_2_1;
Uses CRT;
Const
GradMarks=5; {количество оценок в аттестате}
ExamenMarks=3; {количество оценок на экзамене}
Type
Data = Record
Name:String[20]; {Имя}
BirthDate,GradDate:Integer; {год рождения, год окончания школы}
SchoolGrad: Array[1..GradMarks] of Byte; {оценки в аттестате}
ExamGrad: Array[1..ExamenMarks] of Byte; {оценки на экзамене}
End;
DataPointer=^DataList;
DataList = Record
Name:String[20]; {Имя}
BirthDate,GradDate:Integer; {год рождения, год окончания школы}
SchoolGrad: Array[1..GradMarks] of ShortInt; {оценки в аттестате}
ExamGrad: Array[1..ExamenMarks] of ShortInt; {оценки на экзамене}
Next: DataPointer;
End;
Var
Telega: Data;
P:DataPointer;
Stop:Boolean;
{**** Копирование записей из внешнего файла в однонаправленный список *****}
Procedure CopyToList;
Var i,ii:Integer;
P1:DataPointer;
DataFile: File of Data;
Begin
p1:=nil;
Assign(DataFile,'Students.dat');
Reset(DataFile);
While (Not EOF(DataFile)) Do Begin
Read(DataFile,Telega);
New(P1);
P1^.Name:=Telega.Name;
P1^.BirthDate:=Telega.BirthDate;
P1^.GradDate:=Telega.GradDate;
For i:=1 To GradMarks Do P1^.SchoolGrad[i]:=Telega.SchoolGrad[i] ;
For i:=1 To ExamenMarks Do P1^.ExamGrad[i]:=Telega.ExamGrad[i];
P1^.Next:=P; {ссылка на предыдущий элемент}
P:=P1 {новая голова списка}
End;
Close(DataFile);
End;
{***** Удаление элементов списка, удовлетворяющих условию *****}
Function Removing(Head:DataPointer):DataPointer;
var
i,e4: ShortInt;
Begin
e4:=0;
If Head=nil Then Removing:=nil {если список пустой}
Else Begin
For i:=1 to ExamenMarks Do If Head^.ExamGrad[i]=4 Then inc(e4);
If e4=3 Then Begin
Removing:=Head^.Next; {обработка головы списка}
Dispose(Head); Head:=nil;
End
Else Begin {если удаляемый элемент-не голова,тогда рекурсия}
Head^.Next:=Removing(Head^.Next); {по следующим за ним}
Removing:=Head;
If Head^.Next=nil Then Stop:=True; {выход из функции и из цикла}
End; {по достижении конца списка}
End;
End;
{*************** Процедура вывода на печать списка *********************}
Procedure PrintOut;
var
p1:DataPointer;
s1,s2:string;
i,n:integer;
Label
Finita;
Begin
p1:=P;
WriteLn('_______ Ф.И.О. абитуриентов, оставшихся в списке ________');
WriteLn;
While True Do Begin
s1:='';
s2:='';
For i:=1 to ExamenMarks Do Begin
str(p1^.ExamGrad[i],s1);
s2:=s2+s1+', ';
End;
WriteLn('имя: ',p1^.Name,' (оценки: ',s2,')');
If p1^.Next=nil Then GoTo Finita;
p1:=p1^.Next;
End;
Finita:End;
{**************** Тело программы ***************}
Begin
P:=nil;
CopyToList;
Stop:=False;
While (Not Stop) Do P:=Removing(P); {вызов рекурсивной функции}
PrintOut;
WriteLn('Press any key...');
Repeat Until KeyPressed;
End.
Результат работы программы:
_______ Ф.И.О. абитуриентов, оставшихся в списке ________
имя: Савельев С.С. (оценки: 3, 3, 3, ) имя: Ильин И.И. (оценки: 3, 3, 3, ) имя: Юрьев Ю.Ю. (оценки: 3, 5, 5, ) имя: Сергеев С.С. (оценки: 3, 3, 3, ) имя: Сидоров С.С. (оценки: 3, 2, 4, ) имя: Петров (оценки: 3, 3, 3, ) Press any key... |
{Добавление в список элементов с условием}
Program T8_5_2_2;
Uses CRT;
Const
GradMarks=5; {количество оценок в аттестате}
ExamenMarks=3; {количество оценок на экзамене}
Type
Data = Record {тип элементов в файле}
Name:String[20]; {Имя}
BirthDate,GradDate:Integer; {год рождения, год окончания школы}
SchoolGrad: Array[1..GradMarks] of Byte; {оценки в аттестате}
ExamGrad: Array[1..ExamenMarks] of Byte; {оценки на экзамене}
End;
DataPointer=^DataList;
DataList = Record {тип элементов в списке}
Name:String[20]; {Имя}
BirthDate,GradDate:Integer; {год рождения, год окончания школы}
SchoolGrad: Array[1..GradMarks] of Byte; {оценки в аттестате}
ExamGrad: Array[1..ExamenMarks] of Byte; {оценки на экзамене}
Next: DataPointer;
End;
Var
Telega: Data;
P:DataPointer;
StopCondition:Boolean;
{**** Копирование записей из внешнего файла в однонаправленный список *****}
Procedure LoadFromFileToList;
Var i,y:Integer;
P1:DataPointer;
FileOfData: File of Data;
Begin
p1:=nil;
Assign(FileOfData,'data.dat');
Reset(FileOfData);
While (Not EOF(FileOfData)) Do Begin
Read(FileOfData,Telega);
New(P1);
P1^.Name:=Telega.Name;
P1^.BirthDate:=Telega.BirthDate;
P1^.GradDate:=Telega.GradDate;
For i:=1 To GradMarks Do P1^.SchoolGrad[i]:=Telega.SchoolGrad[i] ;
For i:=1 To ExamenMarks Do P1^.ExamGrad[i]:=Telega.ExamGrad[i];
P1^.Next:=P; {ссылка на предыдущий элемент}
P:=P1 {новая голова списка}
End;
Close(FileOfData);
End;
{***** Удаление элементов списка, удовлетворяющих условию *****}
{удалить всех кроме тех, у которых все оценки "3" за экзамены}
{и отличный аттестат}
Function Filtering(Head:DataPointer):DataPointer;
var
i,Mark_0,Mark_1: ShortInt;
Begin
Mark_0:=0;
Mark_1:=0;
If Head=nil Then Filtering:=nil {если список пустой}
Else Begin
For i:=1 to ExamenMarks Do If Head^.ExamGrad[i]=3 Then inc(Mark_0);
For i:=1 to GradMarks Do If Head^.SchoolGrad[i]=5 Then inc(Mark_1);
If not ((Mark_0=ExamenMarks) and (Mark_1=GradMarks)) Then Begin
Filtering:=Head^.Next; {обработка головы списка}
Dispose(Head); Head:=nil;
End
Else Begin {если удаляемый элемент-не голова,тогда рекурсия}
Head^.Next:=Filtering(Head^.Next); {по следующим за ним}
Filtering:=Head;
If Head^.Next=nil Then StopCondition:=True; {выход из функции и из цикла}
End; {по достижении конца списка}
End;
End;
{*************** Процедура вывода на печать списка *********************}
Procedure PrintResult;
var
p1:DataPointer;
str1,str2,str3:string;
i,n:integer;
Label
Exits;
Begin
p1:=P;
HighVideo;
WriteLn(' _______ Ф.И.О. абитуриентов, оставшихся в списке ________');
NormVideo;
WriteLn;
While True Do Begin
str1:='';
str2:='';
str3:='';
For i:=1 to ExamenMarks Do Begin
str(p1^.ExamGrad[i],str1);
str2:=str2+str1+', ';
End;
For i:=1 to GradMarks Do Begin
str(p1^.SchoolGrad[i],str1);
str3:=str3+str1+', ';
End;
WriteLn('имя: ',p1^.Name,' (оценки в аттестате: ',str3,'на экзамене: ',str2,')');
If p1^.Next=nil Then GoTo Exits;
p1:=p1^.Next;
End;
Exits:End;
Function CheckOut:Boolean;
var
Mark_1,e3,i:ShortInt;
Begin
e3:=0; Mark_1:=0;
For i:=1 to ExamenMarks Do If Telega.ExamGrad[i]=3 Then inc(e3);
For i:=1 to GradMarks Do If Telega.SchoolGrad[i]=5 Then inc(Mark_1);
If ((e3=ExamenMarks) and (Mark_1=GradMarks)) Then CheckOut:=true
Else CheckOut:=false;
End;
Procedure AddictionToList;
var
P1:DataPointer;
i:ShortInt;
Begin
New(P1);
P1^.Name:=Telega.Name;
P1^.BirthDate:=Telega.BirthDate;
P1^.GradDate:=Telega.GradDate;
For i:=1 To GradMarks Do P1^.SchoolGrad[i]:=Telega.SchoolGrad[i] ;
For i:=1 To ExamenMarks Do P1^.ExamGrad[i]:=Telega.ExamGrad[i];
P1^.Next:=P; {ссылка на предыдущий элемент}
P:=P1 {новая голова списка}
End;
Procedure Initialising;
Var
i,y:Integer;
Label
Exits;
Begin
WriteLn(' Дополнение данного списка новыми элементами: ');
WriteLn;
i:=1;
While True Do Begin
WriteLn(' __________ Д А Н Н Ы Е ',i,' -ГО А Б И Т У Р И Е Н Т А___________');
WriteLn;
With Telega Do Begin
WriteLn('Введите Ф.И.О. абитуриента:');
WriteLn('"Enter"-завершение программы');
ReadLn(Name);
If (Name='') Then Goto Exits;
WriteLn('Введите год рождения абитуриента:');
ReadLn(BirthDate);
WriteLn('Введите год окончания школы абитуриентом:');
ReadLn(GradDate);
WriteLn(' _______Введите оценки из аттестата абитуриента_______');
WriteLn('всего ',GradMarks,' штук');
WriteLn;
For y:=1 to GradMarks Do Begin
ReadLn(SchoolGrad[y]);
End;
WriteLn(' Введите оценки, полученные абитуриентом на экзамене:');
WriteLn('Всего ',ExamenMarks,' штук');
WriteLn;
For y:=1 to ExamenMarks Do Begin
ReadLn(ExamGrad[y]);
End;
End;
If CheckOut Then AddictionToList;
inc(i);
End;
Exits: End;
{**************** Тело программы ***************}
Begin
ClrScr;
P:=nil;
LoadFromFileToList;
StopCondition:=False;
While (Not StopCondition) Do P:=Filtering(P); {вызов рекурсивной функции}
PrintResult;
WriteLn;
Initialising;
PrintResult;
WriteLn('Press any key...');
While not KeyPressed do;
End.
Результат работы программы:
_______ Ф.И.О. абитуриентов, оставшихся в списке ________
имя: Савельев С.С. (оценки в аттестате: 5, 5, 5, 5, 5, на экзамене: 3, 3, 3, ) имя: Сергеев С.С. (оценки в аттестате: 5, 5, 5, 5, 5, на экзамене: 3, 3, 3, ) имя: Петров (оценки в аттестате: 5, 5, 5, 5, 5, на экзамене: 3, 3, 3, )
Дополнение данного списка новыми элементами:
__________ Д А Н Н Ы Е 1 -ГО А Б И Т У Р И Е Н Т А___________
Введите Ф.И.О. абитуриента: "Enter"-завершение программы Смирнов В.В. Введите год рождения абитуриента: 1970 Введите год окончания школы абитуриентом: 1978 _______Введите оценки из аттестата абитуриента_______ всего 5 штук
5 4 5 4 5 Введите оценки, полученные абитуриентом на экзамене: Всего 3 штук
3 3 3 __________ Д А Н Н Ы Е 2 -ГО А Б И Т У Р И Е Н Т А___________
Введите Ф.И.О. абитуриента: "Enter"-завершение программы Пермяков Введите год рождения абитуриента: 1980 Введите год окончания школы абитуриентом: 1998 _______Введите оценки из аттестата абитуриента_______ всего 5 штук
5 5 5 5 5 Введите оценки, полученные абитуриентом на экзамене: Всего 3 штук
3 3 3 __________ Д А Н Н Ы Е 3 -ГО А Б И Т У Р И Е Н Т А___________
Введите Ф.И.О. абитуриента: "Enter"-завершение программы
_______ Ф.И.О. абитуриентов, оставшихся в списке ________
имя: Пермяков (оценки в аттестате: 5, 5, 5, 5, 5, на экзамене: 3, 3, 3, ) имя: Савельев С.С. (оценки в аттестате: 5, 5, 5, 5, 5, на экзамене: 3, 3, 3, ) имя: Сергеев С.С. (оценки в аттестате: 5, 5, 5, 5, 5, на экзамене: 3, 3, 3, ) имя: Петров (оценки в аттестате: 5, 5, 5, 5, 5, на экзамене: 3, 3, 3, ) Press any key...
|
Варианты задания.
1. Исключить из списка элементы, относящиеся к абитуриентам, у которых:
1) одна оценка 2;
2) все оценки 3;
3) средний балл меньше 4,5 и одна оценка 3 в аттестате;
4) средний балл больше 4 и одна оценка 3 в аттестате;
5) средний балл меньше 4;
6) возраст больше 18 лет;
7) нет ни одной оценки 5 в аттестате;
8) нет отличного аттестата, но все оценки за экзамены 5;
9) хотя бы одна оценка 3;
10) отличный аттестат;
11) больше одной оценки 3 в аттестате;
12) нет ни одной оценки 5 в аттестате;
13) хотя бы одна оценка 3 в аттестате;
14) отличный аттестат и больше одной оценки 3 за экзамены;
15) меньше 2-х оценок 5;
16) аттестат с хотя бы одной оценкой 3 и нет оценки 5 за экзамены;
17) оценки 3 и 4 за экзамены;
18) все оценки 3 за экзамены и отличный аттестат;
19) средний балл меньше 4,5;
20) средний балл больше 4 и оценки 3 в аттестате;
21) средний балл меньше 4;
22) отличный аттестат и возраст больше 18 лет;
23) отличный аттестат и возраст меньше 17 лет;
24) Нет удовлетворительных и неудовлетворительных оценок;
25) все оценки 4;
2. Добавить в список элементы, относящиеся к абитуриентам, у которых :
1) отличный аттестат;
2) одна оценка 4, а остальные 5;
3) средний балл в аттестате 4,5;
4) две оценки 4,а остальные 5;
5) средний балл меньше 4;
6) все экзамены сданы на 5;
7) все экзамены сданы на 4 и 5;
8) все экзамены сданы на 4;
9) одна оценка 4, а остальные 5;
10) одна оценка 5, а остальные 4;
11) две оценки 4, а остальные 5;
12) одна оценка 3;
13) одна оценка 3 в аттестате;
14) больше одной оценки 3 в аттестате;
15) средний балл в аттестате ниже 4,5;
16) две оценки 3 за экзамены и отличный аттестат;
17) нет ни одной оценки 5 в аттестате;
18) отличный аттестат и средний балл меньше 4;
19) средний балл больше 4 и оценки 3 в аттестате;
20) возраст больше 18 лет и все оценки 5 за экзамены;
21) средний балл больше 4,5 и одна оценка 3 в аттестате;
22) отличный аттестат и одна оценка 3 за экзамены;
23) одна оценка 3 за экзамены, а остальные 4;
24) одна оценка 3 за экзамены, а остальные 5;
25) все оценки 3 за экзамены и отличный аттестат.
Лабораторная работа № 15.
Выполнение операций над списковыми структурами.
Цель задания:
1. Ознакомление с возможностями представления строк символов в виде списков.
2. Закрепление навыков выполнения операций над списками.
Постановка задачи:
Ввести с клавиатуры строку символов, формируя из ее элементов однонаправленный список. Обработать список согласно конкретному варианту. Распечатать результат.
Содержание отчета:
1. Постановка задачи.
2. Входная строка символов.
3. Текст программы.
Выходная строка символов.
Образец выполнения работы.
Лабораторная работа № 15.
Выполнение операций над списковыми структурами.
Цель задания:
1. Ознакомление с возможностями представления строк символов в виде списков.
2. Закрепление навыков выполнения операций над списками.
Постановка задачи:
Ввести с клавиатуры строку символов, формируя из ее элементов однонаправленный список. Обработать список согласно конкретному варианту. Распечатать результат.
Вариант задания:
Поменять местами первый символ и символ, стоящий посередине строки;
{Представление строк символов в виде списков}
Program T853;
Uses CRT;
Type
PListHead=^TList;
TList=Record
Sym:Char;
Next:PListHead;
End;
Var
str1, str2:String;
P:PListHead; {указатель нa голову списка}
Procedure InitString;
Begin
WriteLn('Введите строку символов');
ReadLn(str1);
End;
{формируем из строки символов однонаправленный список}
Procedure ConvertStringToList;
Var
i:integer;
Head,P1,P2:PListHead;
Label
Exits;
Begin
P:=nil;
P1:=nil;
P2:=nil;
{создаем и заполняем голову списка и следующий за ней элемент}
Head^.Sym:=str1[1];
New(P1);
P1^.Sym:=str1[2];
Head^.Next:=P1;
{создаем и заполняем остальные элементы}
For i:=3 to 255 Do Begin
If Ord(str1[i])=0 Then Goto Exits;
New(P2);
P2^.Sym:=str1[i];
P1^.Next:=P2;
P1:=P2;
End;
Exits:
P2^.Next:=nil;
P:=Head;
End;
Procedure EditList;
var
i,i1,i2:integer;
P1,P2,P3,PMiddle,PEnd:PListHead;
Begin
P1:=P;
i1:=-1; i2:=0;
While P1^.Next<>nil Do Begin {находим общее количество элементов(i1)}
PEnd:=P1; {PEnd - предпоследний элемент}
P1:=P1^.Next; {P1 - последний элемент}
inc(i1);
End;
i2:=i1 div 2; {порядковый номер элемента в середине списка}