Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка Паскаль (Часть 1 и 2).doc
Скачиваний:
48
Добавлен:
29.03.2015
Размер:
1.78 Mб
Скачать

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

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

Цель задания:

1. Ознакомиться с возможностью выполнения операции исключения элементов из списка.

2. Закрепление навыков использования переменных ссылочных типов данных.

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

  1. Составить список учебной группы, содержащей 20 учащихся.

  2. Указать для каждого учащегося оценки, полученные на четырех экзаменах.

  3. Разработать программу, которая вводит с экрана данные о каждом учащемся и заносит эти данные в однонаправленный список.

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

Содержание отчета:

  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.