Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

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



Цель работы:

1. Закрепить навыки работы с исключением элементов из списка.

2. Ознакомиться с возможностью добавления элементов в список.

Постановка задачи:

Подготовить данные об абитуриентах, поступающих в институт. Информацию о каждом абитуриенте оформить в вид записи со следующими полями:

1.ФИО.

2. Год рождения.

3. Год окончания школы.

4. Оценки в аттестате.

5. Оценки вступительных экзаменов (3).

Оформить информацию в виде внешнего файла.

Занести информацию из внешнего файла в однонаправленный список.

Обработать список согласно варианту.

1. Исключить из списка все элементы, удовлетворяющие условию, заданному в варианте и распечатать полученный список.

2. Добавить N элементов в начало (конец) списка согласно конкретному варианту и распечатать полученный список.

Вариант задания:

1. Все оценки 4.

2. Добавить в список элементы, относящиеся к абитуриентам, у которых:

все оценки 3 за экзамены и отличный аттестат.

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

{Заполнение внешнего файла данными, вводимыми с клавиатуры}

Program P8_5_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;

Var

Telega: Data;

FileOfData: File of Data;

(* Процедура заполнения файла 'data.dat' *)

Procedure Initialising;

Var i,y:Integer;

Label

Exits;

Begin

Assign(FileOfData,'data.dat');

ReWrite(FileOfData);

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;

Write(FileOfData,Telega);

inc(i);

End;

Exits: End;

{**************** Тело программы ***************}

Begin

Initialising;

Close(FileOfData);

End.

Результат работы программы:

__________ Д А Н Н Ы Е 1 -ГО А Б И Т У Р И Е Н Т А___________   Введите Ф.И.О. абитуриента: "Enter"-завершение программы Иванов И.И. Введите год рождения абитуриента: Введите год окончания школы абитуриентом: _______Введите оценки из аттестата абитуриента_______ всего 5 штук   Введите оценки, полученные абитуриентом на экзамене: Всего 3 штук   __________ Д А Н Н Ы Е 2 -ГО А Б И Т У Р И Е Н Т А___________   Введите Ф.И.О. абитуриента: "Enter"-завершение программы Петров Введите год рождения абитуриента: Введите год окончания школы абитуриентом: _______Введите оценки из аттестата абитуриента_______ всего 5 штук   Введите оценки, полученные абитуриентом на экзамене: Всего 3 штук   __________ Д А Н Н Ы Е 3 -ГО А Б И Т У Р И Е Н Т А___________   Введите Ф.И.О. абитуриента: "Enter"-завершение программы Сидоров С.С. Введите год рождения абитуриента: Введите год окончания школы абитуриентом: _______Введите оценки из аттестата абитуриента_______ всего 5 штук   Введите оценки, полученные абитуриентом на экзамене: Всего 3 штук   __________ Д А Н Н Ы Е 4 -ГО А Б И Т У Р И Е Н Т А___________   Введите Ф.И.О. абитуриента: "Enter"-завершение программы Васильев В.В. Введите год рождения абитуриента: Введите год окончания школы абитуриентом: _______Введите оценки из аттестата абитуриента_______ всего 5 штук   Введите оценки, полученные абитуриентом на экзамене: Всего 3 штук   __________ Д А Н Н Ы Е 5 -ГО А Б И Т У Р И Е Н Т А___________   Введите Ф.И.О. абитуриента: "Enter"-завершение программы Сергеев С.С. Введите год рождения абитуриента: Введите год окончания школы абитуриентом: _______Введите оценки из аттестата абитуриента_______ всего 5 штук   Введите оценки, полученные абитуриентом на экзамене: Всего 3 штук   __________ Д А Н Н Ы Е 6 -ГО А Б И Т У Р И Е Н Т А___________   Введите Ф.И.О. абитуриента: "Enter"-завершение программы Юрьев Ю.Ю. Введите год рождения абитуриента: Введите год окончания школы абитуриентом: _______Введите оценки из аттестата абитуриента_______ всего 5 штук   Введите оценки, полученные абитуриентом на экзамене: Всего 3 штук   __________ Д А Н Н Ы Е 7 -ГО А Б И Т У Р И Е Н Т А___________   Введите Ф.И.О. абитуриента: "Enter"-завершение программы Ильин И.И. Введите год рождения абитуриента: Введите год окончания школы абитуриентом: _______Введите оценки из аттестата абитуриента_______ всего 5 штук   Введите оценки, полученные абитуриентом на экзамене: Всего 3 штук   __________ Д А Н Н Ы Е 8 -ГО А Б И Т У Р И Е Н Т А___________   Введите Ф.И.О. абитуриента: "Enter"-завершение программы Михайлов М.М. Введите год рождения абитуриента: Введите год окончания школы абитуриентом: _______Введите оценки из аттестата абитуриента_______ всего 5 штук   Введите оценки, полученные абитуриентом на экзамене: Всего 3 штук   __________ Д А Н Н Ы Е 9 -ГО А Б И Т У Р И Е Н Т А___________   Введите Ф.И.О. абитуриента: "Enter"-завершение программы Савельев С.С. Введите год рождения абитуриента: Введите год окончания школы абитуриентом: _______Введите оценки из аттестата абитуриента_______ всего 5 штук   Введите оценки, полученные абитуриентом на экзамене: Всего 3 штук   __________ Д А Н Н Ы Е 10 -ГО А Б И Т У Р И Е Н Т А___________   Введите Ф.И.О. абитуриента: "Enter"-завершение программы Николаев Н.Н. Введите год рождения абитуриента: Введите год окончания школы абитуриентом: _______Введите оценки из аттестата абитуриента_______ всего 5 штук   Введите оценки, полученные абитуриентом на экзамене: Всего 3 штук   __________ Д А Н Н Ы Е 11 -ГО А Б И Т У Р И Е Н Т А___________   Введите Ф.И.О. абитуриента: "Enter"-завершение программы  

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"-завершение программы Смирнов В.В. Введите год рождения абитуриента: Введите год окончания школы абитуриентом: _______Введите оценки из аттестата абитуриента_______ всего 5 штук   Введите оценки, полученные абитуриентом на экзамене: Всего 3 штук   __________ Д А Н Н Ы Е 2 -ГО А Б И Т У Р И Е Н Т А___________   Введите Ф.И.О. абитуриента: "Enter"-завершение программы Пермяков Введите год рождения абитуриента: Введите год окончания школы абитуриентом: _______Введите оценки из аттестата абитуриента_______ всего 5 штук   Введите оценки, полученные абитуриентом на экзамене: Всего 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 за экзамены и отличный аттестат.





Дата публикования: 2015-02-22; Прочитано: 252 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.048 с)...