Файл: 2. Лекции Паскаль (Часть 2).doc

Добавлен: 19.10.2018

Просмотров: 4357

Скачиваний: 8

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

Оглавление

9. Файловые типы данных

9.1. Инициализация файла

9.2. Файлы и работа с ними

Лабораторная работа №11.

Работа с внешними файлами

Лабораторная работа №11, вариант № 5.

Работа с внешними файлами

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

9.3. Сортировка файлов.

9.3.1. Слияние упорядоченных последовательностей.

9.3.2. Сортировка сбалансированным слиянием

9.3.3. Сортировка простым слиянием

9.3.4. Сортировка естественным слиянием.

9.3.5. Сортировка многофазным слиянием.

Лабораторная работа №12.

Сортировка файлов.

Лабораторная работа №12.

Сортировка файлов.

10. Динамическая память.

10.1. Указатели.

10.2. Списки.

Лабораторная работа № 13.

Исключение элементов списка.

Образец выполнения работы.

Лабораторная работа № 13.

Исключение элементов списка.

Варианты задания.

Лабораторная работа № 14.

Работа со списками.

Образец выполнения работы.

Лабораторная работа № 14.

Работа со списками.

Варианты задания.

Лабораторная работа № 15.

Выполнение операций над списковыми структурами.

Образец выполнения работы.

Лабораторная работа № 15.

Выполнение операций над списковыми структурами.

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

10.3. Деревья.

10.4. Стеки, очереди.

Образец выполнения работы.

Лабораторная работа № 16.

Работа со стеками и очередями.

Лабораторная работа № 16.

Работа со стеками и очередями.

11. Организация меню с использованием средств среды Turbo Pascal

Лабораторная работа №17.

Составления меню.

Образец выполнения работы.

Лабораторная работа № 17.

Составления меню.



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; {порядковый номер элемента в середине списка}