Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Исключение элементов списка.
Цель задания: 1. Ознакомиться с возможностью выполнения операции исключения элементов из списка. 2. Закрепление навыков использования переменных ссылочных типов данных.
Постановка задачи: 1. Составить список учебной группы, содержащей 20 учащихся. 2. Указать для каждого учащегося оценки, полученные на четырех экзаменах. 3. Разработать программу, которая вводит с экрана данные о каждом учащемся и заносит эти данные в однонаправленный список. 4. Обработать список согласно конкретному варианту.
Содержание отчета: 1. Постановка задачи. 2. Текст программы и результаты ее выполнения. Образец выполнения работы. Лабораторная работа № 13. Исключение элементов списка. Цель задания: 1. Ознакомиться с возможностью выполнения операции исключения элементов из списка. 2. Закрепление навыков использования переменных ссылочных типов данных.
Постановка задачи: Составить список учебной группы, содержащей 20 учащихся. Указать для каждого учащегося оценки, полученные на четырех экзаменах. Разработать программу, которая вводит с экрана данные о каждом учащемся и заносит эти данные в однонаправленный список. Обработать список согласно конкретному варианту.
Содержание отчета: 1. Постановка задачи. 2. Текст программы и результаты ее выполнения.
Вариант задания: Одна оценка 4, а остальные 3.
Текст программы:
{Исключение элементов из списка} Program ExludingelementsFromList; Uses CRT; Type PStudents= ^TStudents; TStudents= Record Name: String[20]; Marks: Array [1..4] of ShortInt; Next: PStudents; End;
Var PS: PStudents; {указатель на последний элемент списка в статической памяти}
{ Процедура заполнения списка } Procedure Init;
Var i, y: Integer; pro: PStudents; Label Exits;
Begin PS^.Next: =nil; {последний элемент списка} y: =1; While true Do Begin New(pro); {выделяем память под переменную с указателем pro}
{Присваиваем значение переменной} WriteLn('Введите Ф.И.О. ', y, '-го студента, " Enter" - завершение программы'); ReadLn(pro^.Name); If pro^.Name='' Then GoTo Exits; WriteLn('Введите оценки студента (всего 4)'); For i: =1 To 4 Do ReadLn(pro^.Marks[i]);
pro^.Next: =PS; {записываем в поле Next указатель на предыдущий элемент} PS: =pro; {указателю на голову списка присваиваем новое значение т.е значение текущего элемента} Inc(y); End;
Exits: End;
{Процедура удаления элементов из списка } Procedure Removing; Var Head, p1, p2: PStudents; i, e3, e4: ShortInt; Label Exits;
Begin head: =PS; {первый элемент-голова списка} p2: =PS; {текущий указатель} p1: =PS; {указатель на предыдущий элемент}
While True Do Begin e4: =0; e3: =0; For i: =1 to 4 Do Begin {подсчет оценок} If p2^.Marks[i]=4 Then inc(e4); If p2^.Marks[i]=3 Then inc(e3); End; If (e4=1) And (e3=3) Then {проверка условия на удаление} If (Head=P2) Then Begin {если удаляемый элемент - голова списка} PS: =PS^.Next; {новая голова} Dispose(p2); p2: =PS; p1: =PS; Head: =PS; End Else Begin {если элемент в середине списка} p1^.Next: =p2^.Next; {полю Next предыдущего элемента присваиваем указатель следующего за текущим} Dispose(p2); p2: =p1^.Next; {уничтожаем ссылку на текущий элемент}
End Else Begin p2: =p2^.Next; {если ничего не удалялось передвигаем указатель на следующий элемент} p1: =p1^.Next; {передвигаем указатель предыдущего элемента} End; If (p2=nil) Then GoTo Exits;
End; Exits: End;
{Процедура вывода на печать списка } Procedure PrintOut; var p1: PStudents; Label Exits; Begin p1: =PS; While True Do Begin WriteLn(p1^.Name); If p1^.Next=nil Then GoTo Exits; p1: =p1^.Next; End; Exits: End;
{Тело программы } Begin Init; Removing; PrintOut; WriteLn('Нажмите любую клавишу...'); Repeat Until KeyPressed; End. Результат работы программы:
Варианты задания. Исключить из списка элементы, относящиеся к учащимся, у которых:
1) Средний балл меньше среднего балла группы. 2) Средний балл меньше 4, 5. 3) Средний балл больше 4. 4) Все оценки 5. 5) Одна оценка 4, а остальные - 5. 6) Оценка, полученная на первом экзамене - 2. 7) Оценка, полученная на втором экзамене - 5. 8) Нет удовлетворительных и неудовлетворительных оценок. 9) Больше одной оценки 2. 10) Одна оценка 3, а остальные 4 и 5. 11) Одна оценка 5, а остальные 4. 12) Оценки только 4 и 5. 13) Больше одной оценки 3. 14) Две оценки 3. 15) Одна оценка 4, а остальные 3. 16) Все оценки 3. 17) Оценки 3 и 4. 18) Все оценки 4. 19) Оценка, полученная на первом экзамене - 3. 20) Оценки за первый и третий экзамен 3. 21) Одна оценка 5, а остальные 3. 22) Только одна оценка 5. 23) Две оценки 5, а остальные 2. 24) Одна оценка 2, а остальные 5. Распечатать оставшийся список.
Лабораторная работа № 14. Работа со списками.
Цель работы: 1. Закрепить навыки работы с исключением элементов из списка. 2. Ознакомиться с возможностью добавления элементов в список. Постановка задачи: Подготовить данные об абитуриентах, поступающих в институт. Информацию о каждом абитуриенте оформить в вид записи со следующими полями: 1.ФИО. 2. Год рождения. 3. Год окончания школы. 4. Оценки в аттестате. 5. Оценки вступительных экзаменов (3). Оформить информацию в виде внешнего файла.
Занести информацию из внешнего файла в однонаправленный список. Обработать список согласно варианту. 1. Исключить из списка все элементы, удовлетворяющие условию, заданному в варианте и распечатать полученный список. 2. Добавить N элементов в начало (конец) списка согласно конкретному варианту и распечатать полученный список. Содержание отчета: 1. Постановка задачи. 2. Тексты программ и результаты их выполнения. Образец выполнения работы. Лабораторная работа № 14. Работа со списками. Цель работы: 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. Результат работы программы:
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.
Результат работы программы:
{Добавление в список элементов с условием}
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.
Результат работы программы:
Варианты задания. 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. Популярное:
|
Последнее изменение этой страницы: 2016-03-15; Просмотров: 1857; Нарушение авторского права страницы