3.   На листе формата А4, опишите ход проделанной работы.

Ответьте на поставленные вопросы:

1)   Как удаляется и добавляется элементы в стек?

2)   Приведи примеры стека на практике?

________________________________________________________________

Задачи для самостоятельного решения:

1)   Предположим, что уже построен стек, элементами которого являются целые числа. Написать программу, которая находит сумму элементов, находящихся в стеке.

2)   Предположим, что уже построен стек, элементами которого являются целые числа. Написать программу, которая добавляет в конец стека S элемент, находящийся в его вершине.

3)   Предположим, что уже построен стек, элементами которого являются целые числа. Написать программу, которая удаляет из стека все элементы, кратные 4 (использовать для промежуточного хранения элементов стека однонаправленный список с заглавным звеном).

Учитель

Ученик

ПК

Тетрадь

2 этап - Подготовка к лабораторной работе

Запускаем демонстрационную программу. Нажмите кнопку теория. Перед вами появилось окно с теоретическим материалом. Внимательно ознакомьтесь с новым материалом. Обратите внимание на примеры создания стека и получения элемента из стека. Провести аналогию между очередью и стеком. Знакомится с новым материалом. Теоретический материал по теме «стек».

Определение «стека».

Порядок расположения данных.

Примеры создания стека и получения элемента из стека.

3 этап - Выполнение лабораторной работы

Открываем лабораторную работу №5.

Внимательно читаем задание и начинаем выполнять.

Выполняет лабораторную работу.

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

После выполнения заданий ответьте на поставленные вопросы. Отвечает на вопросы. Ответы на вопросы.
Попробуйте выполнить практические задания. Решает задачи. Delphi или Pascal. Листинг задачи.

4 этап - Закрепление лабораторной работы

Итак, давайте подведем итоги сегодняшней работы.
Что называется стеком?

Стек — линейный список, в котором все включения и

исключения делаются в одном конце списка.

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

Из стека мы всегда исключаем «младший» элемент из имеющихся в списке, т. е. тот, который был включен позже других. Для очереди справедливо в точности противоположное правило: исключается

всегда самый "старший" элемент; узлы покидают список в том

порядке, в котором они в него вошли.

Тема: «Тест»

Цели:

1.   Закрепить полученные знания по пройденному курсу.

2.   Выяснить результативность полученных знаний с помощью теста.

3.   Сформировать у учащихся познавательный интерес к информатике.

Этап урока

Время (мин.)

1. Организационный момент 2
2. Подготовка к тесту 10
3. Тест 20
4. Подведение итогов 8

Лабораторная работа №7 по теме «Тест».

1.   Повторите весь теоретический материал.

2.   Поработайте с демонстрационной программой.

3.   Запустите тест (сервис\тест или Ctrl + T).

4.   Ответьте на поставленные вопросы теста.

5.   Результаты теста сообщить преподавателю.

Учитель

Ученик

ПК

Тетрадь

2 этап - Подготовка к тесту

Запускаем демонстрационную программу. Внимательно просмотрите теоретический материал по пройденному курсу. Обратите внимание: на определения списков, на то как добавляется и исключаются элементы из списков, на общее и различия списков. Повторяет пройденный материал. Теоретический материал по пройденному курсу.

Определения списков.

Включение и исключение элементов из списков. Общее и различия между списками.

3 этап – Тест

Запускаем тест. (Меню: Сервис\Тест). Перед вами появилось окно «Тест». В верхнем левом поле предлагается вопрос, ниже под полем предлагаются на выбор несколько вариантов ответов. Правой клавишей мыши щелкаете на правильный по вашему мнению ответ. После выбора ответа, кнопка «Далее» становится активной, нажимаете ее. После нажатия на кнопку «Далее», появится следующий вопрос.

Продолжаете далее, пока не появится оценка за тест.

Тестируется. Тест.
Результат сообщите учителю. Оценка за тест.
Если результат оказывается неудовлетворительный, ученику предлагается повторить пройденный материал, и проверить свои знания на следующем уроке. После проведения теста, вызов теста блокируется.

4 этап – Подведение итогов

Итак, мы с вами изучили линейные списки.

Подведем итоги. Вы ознакомились с такими списками как: однонаправленный и двунаправленный списки, стек, дек, очередь и циклический список. Вы узнали, что такое связанное распределение и динамические информационные структуры. Научились использовать полученные знания на практике при решении задач.

При помощи теста оценили результаты полученных знаний.

Если кого, что-то заинтересовало или кто-то полностью не усвоил пройденный материал, то он может подойти к учителю и получить интересующие его сведения.
Сообщаются оценки за тест, и за факультатив в общем.
2.2 Разработка программного средства по теме «Динамические типы данных»

После загрузки демонстрационной программы перед вами появится вот такое окно.

Это главная форма демонстрационной программы. Для формирования списков нажмите кнопку «Обновить».

Теперь списки сформированы и готовы к работе. Списки содержат целые положительные числа. Указатели указывают на начало списка. С помощью кнопок «<<» «>>» можно перемещать указатель по списку. С помощью кнопки «Добавить» вы можете добавить элемент в список. При нажатии на кнопку «Добавить» всплывает окно «Добавление нового элемента», в котором вы указываете какой элемент хотите добавить и нажимаете кнопку «Ok».

При нажатии на кнопку «Удалить» удаляется элемент из списка. В однонаправленном, двунаправленном и циклическом списках удаляется тот элемент, на который указывает указатель. В очереди и стеке удаляется первый. При удалении элемента из дека появляется окно «Удаление элемента», в котором вам предлагается выбрать откуда удалять элемент из начала или с конца.

При нажатии на кнопку теория (для очереди) открывается окно «Очередь», котором изложена теория и даны примеры.

Аналогично для остальных списков.

Для более удобной работы с учащимися в программе предусмотрены лабораторные работы (Ctrl + L или Сервис \ Лабораторные работы). Если вы выберете все то откроется окно «Лабораторные работы», в котором даны сразу все работы и задания. Перед вами 4 лабораторная работа на список «Очередь».

Если вы будете выбирать каждую в отдельности то они будут отображаться в комментариях на главной форме.

Помощь можно вызвать (Справка\Помощь или F1).

После проведения всех лабораторных работ учащимся предлагается ответить на вопросы теста, за который они получают оценку. При запуске теста (Сервис\Тест или Ctrl + T) открывается окно «Тест».

Сверху вопрос, ниже варианты ответов. После выбора ответа кнопка «Далее» становится активной, нажав на нее появляется следующий вопрос. После выполнения теста выдается оценка, если неудовлетворительная то открывается окно «Лабораторные работы».

Примечание: после того как тест запустился вызов теста становится неактивным т.е. второй раз учащийся запустить тест не сможет.

Закрыть программу можно нажатием на кнопку «Закрыть» или F10.

Заключение

В квалификационной работе мы попытались раскрыть более полно и наглядно понятие линейного списка, однонаправленного и двунаправленного списков, стека, дека и очереди. Сформировать и закрепить познавательный интерес к данной теме у учащихся. Выявлять и развивать творческие способности в использовании полученного навыка при программировании.

Главной целью нашей работы было знакомство с теоретическим материалом, касающийся информационных структур и разработка программного средства «Динамические типы данных».

Достижением этой цели и согласно поставленной гипотезы определялись следующие задачи:

1.   Изучить литературу по теме динамические информационные структуры, педагогическую и методическую по теме исследования;

2.   Проанализировать виды динамических информационных структур;

3.   Разработать факультатив по теме исследования;

4.   Разработать программный продукт по теме исследования.

Все поставленные цели и задачи реализованы в данной квалификационной работе. Изучено понятие линейного списка, всевозможные операции с этим списком, определяются основные термины и понятия. Кроме того, рассматривается более конкретно и полно каждый список в отдельности и показывается целесообразность использования списков в тех или иных случаях. Для каждого списка приводятся жизненные примеры для простоты восприятия. Дается понятие связанного распределения и кратко изучается понятие динамических информационной структуры, которая позволяют применить полученные знания при программировании. Также рассматривается преимущество и недостатки двух форм представления информации: связанное и последовательное. Далее следует методическая часть, в которой представлена расчасовка факультатива, его структура, и поставлены цели и задачи факультатива. Приводится для примера три конспекта уроков по теме «Очередь», «Стек» и «Тест». И последнее это руководство пользователя, в котором дается описания работы с демонстрационной программой.

Литература

1.   Айен Синклер «Большой толковый словарь компьютерных терминов», М.: 1998 г.

2.   Архангельский А. Я. «Программирование в Delphi 4», М.: 1999 г.

3.   Архангельский А. Я. «Программирование в Delphi 5», М.: 2000 г.

4.   Вирт Н. «Алгоритмы и структуры данных», Москва Изд. Мир, 1989 г.

5.   Гудмэн Д. «Управление памятью для всех», Киев 1995 г.

6.   Зубов В. С. «Справочник программиста», М.: 1999 г.

7.   Кнут Д. «Искусство программирования для ЭВМ», т.1 Основные алгоритмы, Изд. Мир М.: 1976 г.

8.   Кормен Т. и другие «Алгоритмы построения и анализ», М.: 2000 г.

9.   Подласый И. П. Учебник для студентов высших педагогических учебных заведений, М.: Просвещение 1996 г.

10.   Усова А. В. «Формирование у школьников понятий в процессе обучения», М.: Педагогика, 1986 г.

Приложение 1. (Листинг программы)

В листинге приведены только три основных модуля. В первом модуле описан интерфейс программы, обработка всех событий. Второй модуль, отвечай за формирование списков и выполнения всех операций со списками. У второго модуля нет формы. Третий модуль – это тест, служит для проверки и оценивания учащихся. В остальных, не приведенных модулях, описаны: формы для добавления элемента в список, лабораторные работы, теоретический материал с примерами, помощь и информация о программе.

unit Unit1; // Интерфейс

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls, Unit2, Unit3, Unit4, Unit5, Unit6, Unit7, Unit8, Unit9, Menus, Unit11, Unit12, Unit13, Unit14, Unit15, Unit16, Unit17;

type

TForm1 = class(TForm)

Panel1: TPanel;

Edit1: TEdit;

Label1: TLabel;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Button4: TButton;

Panel2: TPanel;

Label2: TLabel;

Edit2: TEdit;

Button5: TButton;

Button6: TButton;

Button7: TButton;

Button8: TButton;

Panel3: TPanel;

Label3: TLabel;

Edit3: TEdit;

Button9: TButton;

Button10: TButton;

Button11: TButton;

Button12: TButton;

Panel4: TPanel;

Label4: TLabel;

Edit4: TEdit;

Button13: TButton;

Button14: TButton;

Button15: TButton;

Button16: TButton;

Panel5: TPanel;

Label5: TLabel;

Edit5: TEdit;

Button17: TButton;

Button18: TButton;

Button19: TButton;

Button20: TButton;

Panel6: TPanel;

Edit6: TEdit;

Label6: TLabel;

Button21: TButton;

StatusBar1: TStatusBar;

Image1: TImage;

Image2: TImage;

Image3: TImage;

Image4: TImage;

Image5: TImage;

Button22: TButton;

Memo1: TMemo;

Label7: TLabel;

Image6: TImage;

Bevel1: TBevel;

Panel7: TPanel;

Button23: TButton;

Button24: TButton;

Button25: TButton;

Button26: TButton;

Edit7: TEdit;

Image7: TImage;

Label8: TLabel;

Panel8: TPanel;

Image8: TImage;

MainMenu1: TMainMenu;

N1: TMenuItem;

N2: TMenuItem;

N3: TMenuItem;

N4: TMenuItem;

N5: TMenuItem;

Button27: TButton;

Button28: TButton;

Button30: TButton;

Button29: TButton;

Button31: TButton;

Button32: TButton;

N6: TMenuItem;

N7: TMenuItem;

N8: TMenuItem;

N11: TMenuItem;

N21: TMenuItem;

N31: TMenuItem;

N41: TMenuItem;

N51: TMenuItem;

N61: TMenuItem;

N71: TMenuItem;

Button33: TButton;

N9: TMenuItem;

procedure Button12Click(Sender: TObject);

procedure Button11Click(Sender: TObject);

procedure Button22Click(Sender: TObject);

procedure Button21Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Button7Click(Sender: TObject);

procedure Button8Click(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure Button15Click(Sender: TObject);

procedure Button16Click(Sender: TObject);

procedure Button20Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Button19Click(Sender: TObject);

procedure Button5Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button6Click(Sender: TObject);

procedure Button10Click(Sender: TObject);

procedure Button9Click(Sender: TObject);

procedure Button14Click(Sender: TObject);

procedure Button13Click(Sender: TObject);

procedure Button17Click(Sender: TObject);

procedure Button18Click(Sender: TObject);

procedure Button26Click(Sender: TObject);

procedure Button25Click(Sender: TObject);

procedure Button23Click(Sender: TObject);

procedure Button24Click(Sender: TObject);

procedure N2Click(Sender: TObject);

procedure N5Click(Sender: TObject);

procedure N4Click(Sender: TObject);

procedure Button27Click(Sender: TObject);

procedure Button30Click(Sender: TObject);

procedure Button29Click(Sender: TObject);

procedure Button31Click(Sender: TObject);

procedure Button32Click(Sender: TObject);

procedure N8Click(Sender: TObject);

procedure N11Click(Sender: TObject);

procedure Button33Click(Sender: TObject);

procedure N21Click(Sender: TObject);

procedure N31Click(Sender: TObject);

procedure N41Click(Sender: TObject);

procedure N51Click(Sender: TObject);

procedure N61Click(Sender: TObject);

procedure N71Click(Sender: TObject);

procedure N9Click(Sender: TObject);

private

public

end;

procedure DoNewEditList;

procedure DoNewEditListTwo;

procedure DoNewEditRoundList;

var

Form1: TForm1;

ListBegin: List; //указатель на однонапр. список

ListPos: Integer; //позиция в однонапр. списке

ListTwoBegin: ListTwo; //указатель на двунапр. список

ListTwoPos: Integer; //позиция в двунапр. списке

QueueBegin: List; //указатель на очередь

QueuePos: Integer; //"позиция в очереди" (содержит кол-во символов в Edit до первого элемента)

Stack: List; //указатель на стек

StackPos: Integer; //"позиция в стеке" (содержит кол-во символов в Edit до первого элемента)

DeckBegin, DeckEnd: ListTwo; //указатели на начало и конец дека

DeckBeginPos, DeckEndPos: Integer; //"позиции в деке" (DeckEndPos содержит кол-во символов в Edit от DeckEndPosition до последнего элемента)

DeckEndPosition: Integer;  //позиция последнего элемента в деке (содержит первоначальное кол-во символов в Edit до последнего элемента)

RoundList: List; //указатель в циклическом списке

RoundListPos: Integer; //"позиция в циклическом списке"

implementation

uses O_programm, Help, Un18_Lab;

{$R *.DFM}

procedure DoNewEditList;

var

q: List;

begin

q := ListBegin;

Form1.Edit1.Text := '';

while q <> nil do

begin

Form1.Edit1.Text := Form1.Edit1.Text + ' ' + IntToStr(q^.Info);

q := q^.Next;

end;

end;

procedure DoNewEditListTwo;

var

q: ListTwo;

begin

q := ListTwoBegin;

Form1.Edit2.Text := '';

while q <> nil do

begin

Form1.Edit2.Text := Form1.Edit2.Text + ' ' + IntToStr(q^.Info);

q := q^.Next;

end;

end;

procedure DoNewEditRoundList;

var

q: List;

begin

q := RoundList^.Next;

Form1.Edit7.Text := ' ' + IntToStr(RoundList^.Info);

while q <> RoundList do

begin

Form1.Edit7.Text := Form1.Edit7.Text + ' ' + IntToStr(q^.Info);

q := q^.Next;

end;

end;

procedure TForm1.Button12Click(Sender: TObject);

var

i, j: Integer;

s: string;

begin

StatusBar1.Panels[0].Text := '';

GetQueue(QueueBegin);

if QueueBegin <> nil then

begin

while Edit3.Text[QueuePos] <> ' ' do Inc(QueuePos);

Inc(QueuePos);

s := Edit3.Text;

for i := 1 to QueuePos - 1 do

if s[i] <> ' ' then s[i] := ' ';

Edit3.Text := s;

end

else

begin

ShowMessage('Очередь пуста');

Edit3.Text := '';

Image3.Hide;

Button10.Enabled := False;

Button11.Enabled := False;

Button12.Enabled := False;

StatusBar1.Panels[1].Text := 'Очередь пуста';

end;

Image3.Left := Round(QueuePos * 7);

end;

procedure TForm1.Button11Click(Sender: TObject);

begin

StatusBar1Panels[0].Text := 'Нельзя !!!';

Memo1.Lines.Add('В очерди нельзя возвращаться в начало т.к. указатель указывает сразу на начало;');

end;

procedure TForm1.Button22Click(Sender: TObject);

begin

Application.Terminate;

end;

procedure TForm1.Button21Click(Sender: TObject);

var

q: List;

qTwo: ListTwo;

qQueue, rQueue: List;

Info: Integer;

FlagList: Boolean;

qStack: List;

qDeckBegin, qDeckEnd: ListTwo;

qRoundList: List; // начало циклич. списка

begin

Button1.Enabled := True;

Button2.Enabled := True;

Button3.Enabled := True;

Button4.Enabled := True;

Button5.Enabled := True;

Button6.Enabled := True;

Button7.Enabled := True;

Button8.Enabled := True;

Button9.Enabled := True;

Button10.Enabled := True;

Button11.Enabled := True;

Button12.Enabled := True;

Button13.Enabled := True;

Button14.Enabled := True;

Button15.Enabled := True;

Button16.Enabled := True;

Button17.Enabled := True;

Button18.Enabled := True;

Button19.Enabled := True;

Button20.Enabled := True;

Button23.Enabled := True;

Button24.Enabled := True;

Button25.Enabled := True;

Button26.Enabled := True;

Image1.Visible := True;

Image2.Visible := True;

Image3.Visible := True;

Image4.Visible := True;

Image5.Visible := True;

Image6.Visible := True;

Image7.Visible := True;

Edit1.Text := '';

Edit2.Text := '';

Edit3.Text := '';

Edit4.Text := '';

Edit5.Text := '';

Edit7.Text := '';

StatusBar1.Panels[0].Text := '';

StatusBar1.Panels[1].Text := '';

CreateLists;

q := ListBegin;

qTwo := ListTwoBegin;

while q <> nil do

begin

Edit1.Text := Edit1.Text + ' ' + IntToStr(q^.Info);

q := q^.Next;

end;

Image1.Left := 9;

ListPos := 0;

while qTwo <> nil do

begin

Edit2.Text := Edit2.Text + ' ' + IntToStr(qTwo^.Info);

qTwo := qTwo^.Next;

end;

Image2.Left := 9;

ListTwoPos := 0;

FlagList := True;

while QueueBegin <> nil do

begin

Info := GetQueue(QueueBegin);

Edit3.Text := Edit3.Text + ' ' + IntToStr(Info);

AddToQueue(Info, qQueue);

if FlagList then

begin

FlagList := False;

rQueue := qQueue;

end;

end;

QueueBegin := rQueue;

QueuePos := 2;

Image3.Left := 9;

while Stack <> nil do

begin

Info := GetStack(Stack);

Edit4.Text := Edit4.Text + ' ' + IntToStr(Info);

AddToStack(Info, qStack);

end;

Stack := qStack;

Memo1.Lines.Add('В стеке числа идут на оборот т.к. элементы считываются из конца стека.');

StackPos := 2;

Image4.Left := 9;

while DeckEnd <> nil do

begin

Info := GetDeckEnd(DeckEnd);

Edit5.Text := Edit5.Text + ' ' + IntToStr(Info);

AddToDeck(Info, qDeckBegin, qDeckEnd, 0);

end;

DeckBegin := qDeckBegin;

DeckEnd := qDeckEnd;

DeckBeginPos := 2;

Image5.Left := 9;

Memo1.Lines.Add('Дек прочитывался с начала, поэтому элементы записались по порядку.');

DeckEndPosition := 1;

while Edit5.Text[DeckEndPosition] <> '' do Inc(DeckEndPosition);

Image6.Left := Round(9 + DeckEndPosition * 6.2);

Dec(DeckEndPosition);

DeckEndPos := DeckEndPosition;

qRoundList := RoundList^.Next;

Edit7.Text := ' ' + IntToStr(RoundList^.Info);

while qRoundList <> RoundList do

begin

Edit7.Text := Edit7.Text + ' ' + IntToStr(qRoundList^.Info);

qRoundList := qRoundList^.Next;

end;

Image7.Left := 9;

RoundListPos := 0;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Form3.Show;

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

StatusBar1.Panels[0].Text := 'Нельзя !!!';

Memo1.Lines.Add('В однонаправленном списке нельзя перемещаться назад, т.к. связь существует толко в одну сторону;');

end;

procedure TForm1.Button4Click(Sender: TObject);

var

qList: List;

i, j: Integer;

begin

StatusBar1.Panels[0].Text := '';

qList := ListBegin;

i := 0;

while i <> ListPos do

begin

qList := qList^.Next;

Inc(i);

end;

if qList <> nil then

begin

if qList^.Next <> nil then Inc(ListPos);

i := 0;

j := 0;

while i < ListPos do

begin

Inc(j);

if Edit1.Text[j] = ' ' then Inc(i);

end;

Image1.Left := Round(9 + (j + 1) * 7.5);

end;

end;

procedure TForm1.Button7Click(Sender: TObject);

var

qListTwo: ListTwo;

i, j: Integer;

begin

StatusBar1.Panels[0].Text := '';

qListTwo := ListTwoBegin;

i := 0;

if ListTwoPos <> 0 then dec(ListTwoPos);

i := 0;

j := 0;

while i < ListTwoPos do

begin

Inc(j);

if Edit2.Text[j] = ' ' then Inc(i);

end;

if ListTwoPos = 0 then Image2.Left := 9

else Image2.Left := Round(9 + (j + 1) * 7.5);

end;

procedure TForm1.Button8Click(Sender: TObject);

var

qListTwo: ListTwo;

i, j: Integer;

begin

StatusBar1.Panels[0].Text := '';

qListTwo := ListTwoBegin;

i := 0;

while i <> ListTwoPos do

begin

qListTwo := qListTwo^.Next;

Inc(i);

end;

if qListTwo <> nil then

begin

if qListTwo^.Next <> nil then Inc(ListTwoPos);

i := 0;

j := 0;

while i < ListTwoPos do

begin

Inc(j);

if Edit2.Text[j] = ' ' then Inc(i);

end;

Image2.Left := Round(9 + (j + 1) * 7.5);

end;

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

DestroyList(ListBegin);

DestroyListTwo(ListTwoBegin);

DestroyList(QueueBegin);

DestroyList(Stack);

DestroyListTwo(DeckBegin);

Application.Terminate;

end;

procedure TForm1.Button15Click(Sender: TObject);

begin

StatusBar1.Panels[0].Text := 'Нельзя !!!';

Memo1.Lines.Add('В стеке нельзя возвращаться в начало т.к. указатель указывает сразу на начало;');

end;

procedure TForm1.Button16Click(Sender: TObject);

var

i: Integer;

s: string;

begin

StatusBar1.Panels[0].Text := '';

GetStack(Stack);

if Stack <> nil then

begin

while Edit4.Text[StackPos] <> ' ' do Inc(StackPos);

Inc(StackPos);

s := Edit4.Text;

for i := 1 to StackPos - 1 do

if s[i] <> ' ' then s[i] := ' ';

Edit4.Text := s;

end

else

begin

ShowMessage('Стек пуст');

Edit4.Text := '';

Image4.Hide;

Button14.Enabled := False;

Button15.Enabled := False;

Button16.Enabled := False;

StatusBar1.Panels[1].Text := 'Стек пуст';

end;

Image4.Left := Round(StackPos * 7);

end;

procedure TForm1.Button20Click(Sender: TObject);

var

i: Integer;

s: string;

begin

StatusBar1.Panels[0].Text := '';

GetDeckBegin(DeckBegin);

if DeckBegin <> nil then

begin

while Edit5.Text[DeckBeginPos] <> ' ' do Inc(DeckBeginPos);

Inc(DeckBeginPos);

s := Edit5.Text;

for i := 1 to DeckBeginPos - 1 do

if s[i] <> ' ' then s[i] := ' ';

Edit5.Text := s;

end;

if (DeckBegin = nil) and (DeckBegin = DeckEnd) then

begin

ShowMessage('Дек пуст');

Edit5.Text := '';

Image5.Hide;

Image6.Hide;

Button18.Enabled := False;

Button19.Enabled := False;

Button20.Enabled := False;

StatusBar1.Panels[1].Text := 'Дек пуст';

end;

Image5.Left := Round(DeckBeginPos * 7);

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

Windows.SetFocus(Button21.Handle);

end;

procedure TForm1.Button19Click(Sender: TObject);

var

i, a: Integer;

s: string;

begin

StatusBar1.Panels[0].Text := '';

GetDeckEnd(DeckEnd);

if DeckEnd <> nil then

begin

while Edit5.Text[DeckEndPos] <> ' ' do Dec(DeckEndPos);

Dec(DeckEndPos);

s := Edit5.Text;

for i := DeckEndPosition downto DeckEndPos + 1 do

if s[i] <> ' ' then s[i] := ' ';

Edit5.Text := s;

//удаляем все пробелы конце строки

s := '';

i := Length(Edit5.Text) - 1;

while Edit5.Text[i] = ' ' do Dec(i);

for a := 1 to i do s := s + Edit5.Text[a];

Edit5.Text := s;

end;

if (DeckEnd = nil) and (DeckBegin = DeckEnd) then

begin

ShowMessage('Дек пуст');

Edit5.Text := '';

Image5.Hide;

Image6.Hide;

Button19.Enabled := False;

Button20.Enabled := False;

StatusBar1.Panels[1].Text := 'Дек пуст';

end;

Image6.Left := Round(DeckEndPos * 7 - 9);

end;

procedure TForm1.Button5Click(Sender: TObject);

begin

Form5.Show;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

DeleteFromList(ListPos);

DoNewEditList;

end;

procedure TForm1.Button6Click(Sender: TObject);

begin

DeleteFromListTwo(ListTwoPos);

DoNewEditListTwo;

end;

procedure TForm1.Button10Click(Sender: TObject);

var

i, a: Integer;

s1, s2: string;

begin

GetQueue(QueueBegin);

if QueueBegin <> nil then

begin

i := QueuePos;

while (Edit3.Text[i] <> ' ') and (i <= Length(Edit3.Text)) do Inc(i);

Inc(i);

s1 := '';

s2 := '';

for a := 1 to QueuePos - 1 do s1 := s1 + Edit3.Text[a];

for a := i to Length(Edit3.Text) do s2 := s2 + Edit3.Text[a];

Edit3.Text := s1 + s2;

end;

end;

procedure TForm1.Button9Click(Sender: TObject);

begin

Form4.Show;

end;

procedure TForm1.Button14Click(Sender: TObject);

var

i, a: Integer;

s1, s2: string;

begin

GetStack(Stack);

i := StackPos;

while (Edit4.Text[i] <> ' ') and (i <= Length(Edit4.Text)) do Inc(i);

Inc(i);

s1 := '';

s2 := '';

for a := 1 to StackPos - 1 do s1 := s1 + Edit4.Text[a];

for a := i to Length(Edit4.Text) do s2 := s2 + Edit4.Text[a];

Edit4.Text := s1 + s2;

end;

procedure TForm1.Button13Click(Sender: TObject);

begin

Form6.Show;

end;

procedure TForm1.Button17Click(Sender: TObject);

begin

Form7.Show;

end;

procedure TForm1.Button18Click(Sender: TObject);

begin

Form8.Show;

end;

procedure TForm1.Button26Click(Sender: TObject);

begin

StatusBar1.Panels[0].Text := 'Нельзя !!!';

Memo1.Lines.Add('В цикл. списке нельзя перемещаться назад, т.к. по сути цикл. список это однонаправ. список и следовательно связь существует только в одну сторону;');

end;

procedure TForm1.Button25Click(Sender: TObject);

var

qRoundList: List;

i, j: Integer;

Count: Integer;

begin

StatusBar1.Panels[0].Text := '';

qRoundList := RoundList^.Next;

// Подсчет кол-ва елементов в списке

Count := 1;

while qRoundList <> RoundList do

begin

Inc(Count);

qRoundList := qRoundList^.Next;

end;

qRoundList := RoundList;

i := 0;

while i <> RoundListPos do

begin

qRoundList := qRoundList^.Next;

Inc(i);

end;

if qRoundList <> nil then

begin

if qRoundList^.Next <> nil then Inc(RoundListPos);

if RoundListPos > Count - 1 then RoundListPos := 0;

i := 0;

j := 0;

while i < RoundListPos do

begin

Inc(j);

if Edit7.Text[j] = ' ' then Inc(i);

end;

if RoundListPos = 0 then j := -1;

Image7.Left := Round(9 + (j + 1) * 7.5);

end;

end;

procedure TForm1.Button23Click(Sender: TObject);

begin

Form9.Show;

end;

procedure TForm1.Button24Click(Sender: TObject);

begin

if RoundList <> nil then

begin

DeleteFromRoundList(RoundListPos);

if RoundList <> nil then DoNewEditRoundList;

end

else

begin

Edit7.Text := '';

ShowMessage('Циклический список пуст');

Button24.Enabled := False;

Button25.Enabled := False;

Button26.Enabled := False;

Image7.Hide;

end;

end;

procedure TForm1.N2Click(Sender: TObject);

begin

Close;

end;

procedure TForm1.N5Click(Sender: TObject);

begin

AboutBox.Visible := True;

end;

procedure TForm1.N4Click(Sender: TObject);

begin

Form10.Visible := True;

end;

procedure TForm1.Button27Click(Sender: TObject);

begin

Form11.Show;

end;

procedure TForm1.Button30Click(Sender: TObject);

begin

Form12.Show;

end;

procedure TForm1.Button29Click(Sender: TObject);

begin

Form13.Show;

end;

procedure TForm1.Button31Click(Sender: TObject);

begin

Form14.Show;

end;

procedure TForm1.Button32Click(Sender: TObject);

begin

Form15.Show;

end;

procedure TForm1.N8Click(Sender: TObject);

begin

Form1.Hide;

Form16.Show;

N8.Enabled := False;

end;

procedure TForm1.N11Click(Sender: TObject);

begin

Memo1.Clear;

Memo1.Lines.Add(' Лабораторная работа №1.');

Memo1.Lines.Add(' "Списки"');

Memo1.Lines.Add('______________________________________________________________');

Memo1.Lines.Add('1. Нажмите кнопку "Теория" для получения информации о списках.');

Memo1.Lines.Add(' Внимательно изучите теоретический материал.');

Memo1.Lines.Add('');

Memo1.Lines.Add('2. На листе формата А4, опишите ход проделанной работы.');

Memo1.Lines.Add(' Ответьте на поставленные вопросы.');

Memo1.Lines.Add(' 1) Что такое линейный список?');

Memo1.Lines.Add(' 2) Какие операции можно выполнить с линейным списком?');

Memo1.Lines.Add(' 3) Какие существую еще списки?');

Memo1.Lines.Add(' 4) Что представляет из себя связанное распределение?');

Memo1.Lines.Add(' 5) Чем отличается связанное распределение от последовательного?');

Memo1.Lines.Add(' 6) Что такое динамические переменные? Функции new и nil.');

end;

procedure TForm1.Button33Click(Sender: TObject);

begin

Form17.Show;

end;

procedure TForm1.N21Click(Sender: TObject);

begin

Memo1.Clear;

Memo1.Lines.Add(' Лабораторная работа №2.');

Memo1.Lines.Add(' "Однонаправленный и двунаправленный список"');

Memo1.Lines.Add('______________________________________________________________');

Memo1.Lines.Add('1. Нажмите кнопку "Теория" для однонаправленного и ');

Memo1.Lines.Add(' двунаправленного списка.');

Memo1.Lines.Add(' Внимательно изучите теоретический материал.');

Memo1.Lines.Add('');

Memo1.Lines.Add('2. Нажмите кнопку "Обновить" для формирования списков.');

Memo1.Lines.Add(' Кнопки "<< и >>" служат для перемещения курсора по списку.');

Memo1.Lines.Add(' а) Переместитесь влево до 3, 5 и последнего элемента;');

Memo1.Lines.Add(' б) Переместитесь вправо до первого элемента (см. коментарии);');

Memo1.Lines.Add(' Кнопка "Добавить" служит для добавления элемента в список.');

Memo1.Lines.Add(' а) Добавьте после 3, 5, 7 элемента цифру 33 в обоих списках;');

Memo1.Lines.Add(' б) Добавте 1-м и 3-м элементом цифру 55 в двунаправленном списке;');

Memo1.Lines.Add(' Кнопка "Удалить" служит для удаления элемента из списка.');

Memo1.Lines.Add(' а) Удалите 3, 5, 7 элементы в однонаправленном списке;');

Memo1.Lines.Add(' б) Удалите последний, 1 и 3 элементы в двунаправленном;');

Memo1.Lines.Add('');

Memo1.Lines.Add('3. На листе формата А4, опишите ход проделанной работы.');

Memo1.Lines.Add(' Ответьте на поставленные вопросы:');

Memo1.Lines.Add(' 1) Обратите внимание как перемещается курсор?');

Memo1.Lines.Add('  2) Чем отличается однонаправленный и двунаправленный списки?');

Memo1.Lines.Add(' 3) Можно ли добавить элемент в любое место списка?');

Memo1.Lines.Add(' 4) Можно ли удалить любой элемент из списка?');

end;

procedure TForm1.N31Click(Sender: TObject);

begin

Memo1.Clear;

Memo1.Lines.Add(' Лабораторная работа №3.');

Memo1.Lines.Add(' "Циклический список"');

Memo1.Lines.Add('______________________________________________________________');

Memo1.Lines.Add('1. Нажмите кнопку "Теория" для циклического списка?');

Memo1.Lines.Add(' Внимательно изучите теоретический материал.');

Memo1.Lines.Add('');

Memo1.Lines.Add('2. Нажмите кнопку "Обновить" для формирования списков.');

Memo1.Lines.Add(' Кнопки "<< и >>" служат для перемещения курсора по списку.');

Memo1.Lines.Add(' а) Переместитесь вправо до 3, 5, последнего, первого элемента;');

Memo1.Lines.Add(' б) Переместитесь влево (см. коментарии);');

Memo1.Lines.Add(' Кнопка "Добавить" служит для добавления элемента в список.');

Memo1.Lines.Add(' а) Добавьте 3, 5, 1-м элементами число 44;');

Memo1.Lines.Add(' б) Добавьте после 2, 4, 1-го элемента число 0;');

Memo1.Lines.Add(' Кнопка "Удалить" служит для удаления элемента из списка.');

Memo1.Lines.Add(' Удалите 3, 5, 1, 4 элементы;');

Memo1.Lines.Add('');

Memo1.Lines.Add('3. На листе формата А4, опишите ход проделанной работы.');

Memo1.Lines.Add(' Ответьте на поставленные вопросы:');

Memo1.Lines.Add(' 1) Обратите внимание как перемещается курсор?');

Memo1.Lines.Add(' 2) Какую ссылку имеет последний элемент циклического списка?');

Memo1.Lines.Add(' 3) Что называется головой и хвостом списка?');

end;

procedure TForm1.N41Click(Sender: TObject);

begin

Memo1.Clear;

Memo1.Lines.Add(' Лабораторная работа №4.');

Memo1.Lines.Add(' "Очередь"');

Memo1.Lines.Add('______________________________________________________________');

Memo1.Lines.Add('1. Нажмите кнопку "Теория" для очереди.');

Memo1.Lines.Add(' Внимательно изучите теоретический материал.');

Memo1.Lines.Add('');

Memo1.Lines.Add('2. Нажмите кнопку "Обновить" для формирования списков.');

Memo1.Lines.Add(' Кнопки "<< и >>" служат для перемещения курсора по очереди.');

Memo1.Lines.Add(' а) Переместитесь вправо до 3 элемента;');

Memo1.Lines.Add(' б) Переместитесь влево (см. коментарии);');

Memo1.Lines.Add(' Кнопка "Добавить" служит для добавления элемента в очередь.');

Memo1.Lines.Add(' а) Добавьте 1, 4, 5-м элементами число 99;');

Memo1.Lines.Add(' б) Добавьте последним число 999;');

Memo1.Lines.Add(' Кнопка "Удалить" служит для удаления элемента из очереди.');

Memo1.Lines.Add(' Удалите 1, 2, 3 элементы;');

Memo1.Lines.Add('');

Memo1.Lines.Add('3. На листе формата А4, опишите ход проделанной работы.');

Memo1.Lines.Add(' Ответьте на поставленные вопросы:');

Memo1.Lines.Add(' 1) Как удаляется и добавляется элементы в очереди?');

Memo1.Lines.Add(' 2) В чем различие и сходство очереди и однонаправленного списка?');

Memo1.Lines.Add(' 3) Что называется головой и хвостом очереди?');

Memo1.Lines.Add(' 4) Как располагаются элементы в очереди?');

end;

procedure TForm1.N51Click(Sender: TObject);

begin

Memo1.Clear;

Memo1.Lines.Add(' Лабораторная работа №5.');

Memo1.Lines.Add(' "Стек"');

Memo1.Lines.Add('______________________________________________________________');

Memo1.Lines.Add('1. Нажмите кнопку "Теория" для стека.');

Memo1.Lines.Add(' Внимательно изучите теоретический материал.');

Memo1.Lines.Add('');

Memo1.Lines.Add('2. Нажмите кнопку "Обновить" для формирования списков.');

Memo1.Lines.Add(' Кнопки "<< и >>" служат для перемещения курсора в стеке.');

Memo1.Lines.Add(' а) Переместитесь вправо до 4 элемента;');

Memo1.Lines.Add(' б) Переместитесь влево (см. коментарии);');

Memo1.Lines.Add(' Кнопка "Добавить" служит для добавления элемента в стек.');

Memo1.Lines.Add(' Добавьте 1, 3, 5 элементами число 22;');

Memo1.Lines.Add(' Кнопка "Удалить" служит для удаления элемента из стека.');

Memo1.Lines.Add(' Удалите 1, 3, 5, последний элементы;');

Memo1.Lines.Add('3. На листе формата А4, опишите ход проделанной работы.');

Memo1.Lines.Add(' Ответьте на поставленные вопросы:');

Memo1.Lines.Add(' 1) Как удаляется и добавляется элементы в стек?');

Memo1.Lines.Add(' 2) Приведи примеры стека на практике?');

end;

procedure TForm1.N61Click(Sender: TObject);

begin

Memo1.Clear;

Memo1.Lines.Add(' Лабораторная работа №6.');

Memo1.Lines.Add(' "Дек"');

Memo1.Lines.Add('______________________________________________________________');

Memo1.Lines.Add('1. Нажмите кнопку "Теория" для дека.');

Memo1.Lines.Add(' Внимательно изучите теоретический материал.');

Memo1.Lines.Add('');

Memo1.Lines.Add('2. Нажмите кнопку "Обновить" для формирования списков.');

Memo1.Lines.Add(' Кнопки "<< и >>" служат для перемещения курсора в деке.');

Memo1.Lines.Add(' а) Переместитесь влево на 2 элемента;');

Memo1.Lines.Add(' б Переместитесь вправо на 4 элемента;');

Memo1.Lines.Add(' Кнопка "Добавить" служит для добавления элемента в дек.');

Memo1.Lines.Add(' а) Добавьте 1, 3 элементом число 11;');

Memo1.Lines.Add(' б) Добавьте 5, 6 элементом число 88;');

Memo1.Lines.Add(' Кнопка "Удалить" служит для удаления элемента из дека.');

Memo1.Lines.Add(' а) Удалите 2, 4 элементы;');

Memo1.Lines.Add(' б) Добавте 6, 7 элементы;');

Memo1.Lines.Add('');

Memo1.Lines.Add('3. На листе формата А4, опишите ход проделанной работы.');

Memo1.Lines.Add(' Ответьте на поставленные вопросы:');

Memo1.Lines.Add(' 1) Как удаляется и добавляется элементы в дек?');

Memo1.Lines.Add(' 2) В чем сходны и различны дек, стек и двунаправленный список?');

end;

procedure TForm1.N71Click(Sender: TObject);

begin

Memo1.Clear;

Memo1.Lines.Add(' Лабораторная работа №7.');

Memo1.Lines.Add(' "Тест"');

Memo1.Lines.Add('______________________________________________________________');

Memo1.Lines.Add('1. Повторите весь теоретический материал.');

Memo1.Lines.Add('');

Memo1.Lines.Add('2. Поработайте с демонстрационной программой.');

Memo1.Lines.Add('');

Memo1.Lines.Add('3. Запустите тест (сервис\тест или Ctrl + T).');

Memo1.Lines.Add(' Ответьте на поставленные вопросы теста.');

Memo1.Lines.Add('');

Memo1.Lines.Add('4. Результаты теста сообщить преподавателю.');

end;

procedure TForm1.N9Click(Sender: TObject);

begin

Form18.Show;

end;

end.

unit Unit2; //Формирование списков

interface

uses SysUtils, Windows, Dialogs;

type

List = ^Spisok; //Однонаправленный

Spisok = record

Info: Integer;

Next: List;

end;

ListTwo = ^SpisokTwo; //Двунаправленный

SpisokTwo = record

Info: Integer;

Next: ListTwo;

Prev: ListTwo;

end;

procedure CreateLists;

procedure AddToList(X: Integer; var PointerEndList: List);

procedure AddToListAfterPos(X: Integer; Position: Integer);

procedure DeleteFromList(Position: Integer);

procedure AddToListTwo(X: Integer; var PointerEndListTwo: ListTwo);

procedure AddToListTwoAfterPos(X: Integer; Position: Integer);

procedure DeleteFromListTwo(Position: Integer);

procedure AddToQueue(X: Integer; var PointerEndQueue: List);

procedure AddToEndQueue(X: Integer);

function GetQueue(var PointerBegin: List): Integer;

procedure AddToStack(X: Integer; var PointerStack: List);

function GetStack(var PointerStack: List): Integer;

procedure AddToDeck(X: Integer;

var PointerDeckBegin, PointerDeckEnd: ListTwo; Flag: Integer);

function GetDeckBegin(var PointerDeckBegin: ListTwo): Integer;

function GetDeckEnd(var PointerDeckEnd: ListTwo): Integer;

procedure DestroyList(PointerBegin: List);

procedure DestroyListTwo(PointerBegin: ListTwo);

procedure AddToRoundList(X: Integer; var PointerRoundList: List);

procedure DeleteFromRoundList(Position: Integer);

procedure DestroyRoundList(var PointerRoundList: List);

implementation

uses Unit1;

procedure DestroyList(PointerBegin: List);

var

q: List;

begin

while PointerBegin <> nil do

begin

q := PointerBegin;

PointerBegin := PointerBegin^.Next;

if q <> nil then Dispose(q);

end;

end;

procedure DestroyListTwo(PointerBegin: ListTwo);

var

q: ListTwo;

begin

while PointerBegin <> nil do

begin

q := PointerBegin;

PointerBegin := PointerBegin^.Next;

if q <> nil then Dispose(q);

end;

end;

procedure DestroyRoundList(var PointerRoundList: List);

var

q, t: List;

begin

q := PointerRoundList^.Next;

PointerRoundList^.Next := nil;

while q <> nil do

begin

t := q;

q := q^.Next;

if t <> nil then Dispose(t);

end;

PointerRoundList := nil;

end;

procedure AddToList(X: Integer; var PointerEndList: List); //Добавить элемент в

//конец списка (PointerEnd - указатель на последний элемент списка)

begin

if PointerEndList = nil then // Если первый элемент еще не существует

begin

New(PointerEndList);

PointerEndList^.Info := X;

PointerEndList^.Next := nil;

end

else

begin

New(PointerEndList^.Next);

PointerEndList := PointerEndList^.Next;

PointerEndList^.Info := X;

PointerEndList^.Next := nil;

end;

end;

procedure AddToListAfterPos(X: Integer; Position: Integer);

var //Добавить элемент в список после Position

i: Integer;

q, qNew: List;

begin

if Position = 0 then // Если позиция = 0, то добавляем в начало

begin

New(qNew);

qNew^.Info := X;

qNew^.Next := ListBegin;

ListBegin := qNew;

end

else

begin

q := ListBegin;

i := 0;

while (i < Position) and (q <> nil) do // Ищем элемент после которого

// нужно вставить

begin

q := q^.Next;

Inc(i);

end;

if q <> nil then // Если элемент существует то вставляем

begin

New(qNew);

qNew^.Info := X;

qNew^.Next := q^.Next;

q^.Next := qNew;

end

else ShowMessage('Элемент, после которого хотите вставить, удален');

end;

end;

procedure AddToRoundList(X: Integer; var PointerRoundList: List);

var qRound: List;

begin

if PointerRoundList = nil then

begin

New(PointerRoundList);

PointerRoundList^.Info := X;

PointerRoundList^.Next := PointerRoundList;

RoundList := PointerRoundList;

end

else

begin

New(qRound);

qRound^.Info := X;

qRound^.Next := PointerRoundList^.Next;

PointerRoundList^.Next := qRound;

end;

PointerRoundList := PointerRoundList^.Next;

end;

procedure DeleteFromRoundList(Position: Integer);

var

q, h: List;

i: Integer;

begin

if RoundList^.Next = RoundList then //один элемент в списке

begin

if RoundList <> nil then Dispose(RoundList);

RoundList := nil;

end

else // не один элемент в списке

begin

i := 1;

q := RoundList;

while i < RoundListPos do

begin

Inc(i);

q := q^.Next;

end;

if i <> 1 then

begin

h := q^.Next;

q^.Next := h^.Next;

if h <> nil then Dispose(h);

end

else

begin

q := RoundList^.Next;

while q^.Next <> RoundList do q := q^.Next;

h := q^.Next;

q^.Next := h^.Next;

if h <> nil then Dispose(h);

RoundList := q^.Next;

end;

end;

if RoundList <> nil then

begin

q := RoundList^.Next;

i := 1;

while q <> RoundList do

begin

Inc(i);

q := q^.Next;

end;

if i = RoundListPos then

begin

RoundListPos := 0;

Form1.Image7.Left := 9;

end;

end;

end;

procedure DeleteFromList(Position: Integer); //Удаляет элемент под

//номером Position

var

i: Integer;

q, r: List;

begin

q := ListBegin;

if q <> nil then // Если список не пуст, то

begin

if Position = 0 then //Если позиция = 0, то удаляем первый элемент

begin

ListBegin := q^.Next;

if q <> nil then Dispose(q);

end

else

begin

i := 0;

while (i < Position - 1) and (q <> nil) do //Ищем элемент после

//которого нужно удалить

begin

q := q^.Next;

Inc(i);

end;

r := q^.Next;

if r <> nil then //Если удаляемый элемент существует, то удаляем его

begin

q^.Next := r^.Next;

if r <> nil then Dispose(r);

end

else ShowMessage('Элемент уже не существует');

end;

end

else

begin

ShowMessage('Список пуст');

Form1.Image1.Hide;

end;

end;

procedure AddToListTwo(X: Integer; var PointerEndListTwo: ListTwo); //Добавить элемент в

//конец дв-списка (PointerEnd - указатель на последний элемент списка)

begin

if PointerEndListTwo = nil then //Если список еще не существует или пуст,

//добавляем в начало

begin

New(PointerEndListTwo);

PointerEndListTwo^.Info := X;

PointerEndListTwo^.Next := nil;

PointerEndListTwo^.Prev := nil;

end

else

begin

New(PointerEndListTwo^.Next);

PointerEndListTwo := PointerEndListTwo^.Next;

PointerEndListTwo^.Info := X;

PointerEndListTwo^.Next := nil;

PointerEndListTwo^.Prev := nil;

end;

end;

procedure AddToListTwoAfterPos(X: Integer; Position: Integer);

var //Добавить элемент в двунап. список после Position

i: Integer;

q, qNew: ListTwo;

begin

if Position = 0 then //Если позиция = 0, вставляем в начало

begin

New(qNew);

qNew^.Info := X;

qNew^.Next := ListTwoBegin;

ListTwoBegin := qNew;

end

else

begin

q := ListTwoBegin;

i := 0;

while (i < Position) and (q <> nil) do //Ищем элемент после которого

//нужно вставить

begin

q := q^.Next;

Inc(i);

end;

if q <> nil then // Если элемент существует то вставляем

begin

New(qNew);

qNew^.Info := X;

qNew^.Next := q^.Next;

qNew^.Prev := q;

q^.Next := qNew;

end

else ShowMessage('Элемент, после которого хотите вставить, удален');

end;

end;

procedure DeleteFromListTwo(Position: Integer); //Удаляет элемент

//под номером Position

var

i: Integer;

q, r: ListTwo;

begin

q := ListTwoBegin;

if q <> nil then //Если удаляемый элемент существует, то

begin

if Position = 0 then //Если позиция = 0, то удаляем первый элемент

begin

ListTwoBegin^.Prev := nil;

ListTwoBegin := q^.Next;

if q <> nil then Dispose(q);

end

else

begin

i := 0;

while (i < Position - 1) and (q <> nil) do //Ищем элемент

// после которого нужно удалить

begin

q := q^.Next;

Inc(i);

end;

r := q^.Next;

if r <> nil then //Если он существует, то удаляем его

begin

if r^.Next <> nil then r^.Next^.Prev := q;

q^.Next := r^.Next;

if r <> nil then Dispose(r);

end

else ShowMessage('Элемент уже не существует');

end;

end

else

begin

ShowMessage('Список пуст');

Form1.Image2.Hide;

end;

end;

procedure AddToQueue(X: Integer; var PointerEndQueue: List); //Добавить элемент

//в конец очереди (PointerEnd - указатель на последний элемент очереди)

begin

if PointerEndQueue = nil then //Если очередь еще не существует или пуста

//добавляем в начало

begin

New(PointerEndQueue);

PointerEndQueue^.Info := X;

PointerEndQueue^.Next := nil;

end

else

begin

New(PointerEndQueue^.Next);

PointerEndQueue := PointerEndQueue^.Next;

PointerEndQueue^.Info := X;

PointerEndQueue^.Next := nil;

end;

end;

function GetQueue(var PointerBegin: List): Integer; //ф-ия получает элемент из

// очереди и возвращает указатель на начало очереди

var

rQueue: List;

begin

rQueue := PointerBegin;

if rQueue <> nil then //Если очередь не пуста

begin

PointerBegin := PointerBegin^.Next;

Result := rQueue^.Info;

if rQueue <> nil then Dispose(rQueue);

end

else

begin

ShowMessage('Очередь пуста');

Form1.Edit3.Text := '';

Form1.Button10.Enabled := False;

Form1.Button11.Enabled := False;

Form1.Button12.Enabled := False;

Form1.Image3.Hide;

end;

end;

procedure AddToEndQueue(X: Integer);

var

Info: Integer;

rQueue, qQueue: List;

FlagList: Boolean;

begin

FlagList := True; //Для выделения первого элемента

qQueue := nil;

rQueue := nil;

while QueueBegin <> nil do //Ищем указатель на последний элемент очереди

begin

Info := GetQueue(QueueBegin);

AddToQueue(Info, rQueue); //Формируем новую очередь из элементов старой

//очереди, чтобы не потерять ее

if FlagList then /////////////////////////////////////

begin // //

qQueue := rQueue; // формируем указатель на очередь //

FlagList := False; //  //

end; // //////////////////////////////////

end;

AddToQueue(X, rQueue);

if qQueue <> nil then QueueBegin := qQueue // определяем указатель на очередь

else QueueBegin := rQueue; //////////////////////////////////

end;

procedure AddToStack(X: Integer; var PointerStack: List); //Добавить элемент в

//стек (PointerStack - указатель на стек)

var

Stacks: List;

begin

if PointerStack = nil then //Если стек пуст, то формируем его

begin

New(PointerStack);

PointerStack^.Info := X;

PointerStack^.Next := nil;

end

else //иначе добавляем элемент

begin

New(Stacks);

Stacks^.Info := X;

Stacks^.Next := PointerStack;

PointerStack := Stacks;

end;

end;

function GetStack(var PointerStack: List): Integer; //ф-ия получает элемент из

// стека и возвращает указатель на стек

var

rStack: List;

begin

rStack := PointerStack;

if rStack <> nil then //Если стек еще не пуст

begin

PointerStack := PointerStack^.Next;

Result := rStack^.Info;

if rStack <> nil then Dispose(rStack);

end

else

begin

ShowMessage('Стек пуст');

Form1.Button14.Enabled := False;

Form1.Image4.Hide;

end;

end;

procedure AddToDeck(X: Integer; var PointerDeckBegin, PointerDeckEnd: ListTwo;

Flag: Integer); //Добавить элемент в дек

//PointerDeckBegin - указатель на начало дека

//PointerDeckEnd - указатель на конец дека

var

Decks: ListTwo;

begin

if PointerDeckBegin = nil then //Если дек пуст, то формируем его

begin

New(PointerDeckBegin);

PointerDeckBegin^.Info := X;

PointerDeckBegin^.Next := nil;

PointerDeckBegin^.Prev := nil;

PointerDeckEnd := PointerDeckBegin;

end

else //иначе добавляем элемент

begin

if Flag = 0 then //добавляем в начало

begin

New(Decks);

Decks^.Info := X;

Decks^.Next := PointerDeckBegin;

Decks^.Prev := nil;

PointerDeckBegin^.Prev := Decks;

PointerDeckBegin := Decks;

end

else //добавлям в конец

begin

New(Decks);

Decks^.Info := X;

Decks^.Next := nil;

Decks^.Prev := PointerDeckEnd;

PointerDeckEnd^.Next := Decks;

PointerDeckEnd := Decks;

end;

end;

end;

function GetDeckBegin(var PointerDeckBegin: ListTwo): Integer;

//ф-ия получает элемент из начала дека и возвращает указатель на начало дека.

var

q: ListTwo;

begin

if PointerDeckBegin <> nil then //Если дек не пуст

begin

Result := PointerDeckBegin^.Info;

q := PointerDeckBegin;

PointerDeckBegin := q^.Next;

if PointerDeckBegin <> nil then PointerDeckBegin^.Prev := nil;

if q <> nil then Dispose(q);

end

else

begin

ShowMessage('Дек пуст');

Form1.Edit5.Text := '';

Form1.Button18.Enabled := False;

Form1.Button19.Enabled := False;

Form1.Button20.Enabled := False;

Form1.Image5.Hide;

Form1.Image6.Hide;

end;

end;

function GetDeckEnd(var PointerDeckEnd: ListTwo): Integer;

//ф-ия получает элемент из конца дека и возвращает указатель на конец дека.

var

q: ListTwo;

begin

if PointerDeckEnd <> nil then //Если дек не пуст

begin

Result := PointerDeckEnd^.Info;

q := PointerDeckEnd;

PointerDeckEnd := q^.Prev;

if PointerDeckEnd <> nil then PointerDeckEnd^.Next := nil;

if q <> nil then Dispose(q);

end

else

begin

ShowMessage('Дек пуст');

Form1.Edit5.Text := '';

Form1.Button18.Enabled := False;

Form1.Button19.Enabled := False;

Form1.Button20.Enabled := False;

Form1.Image5.Hide;

Form1.Image6.Hide;

end;

end;

procedure CreateLists; //процедура создания всех списков

var

i: Integer;

X: Integer;

Uk, q: List;

UkTwo, qTwo: ListTwo;

UkQueue, qQueue: List;

qStack: List;

qDeckBegin, qDeckEnd: ListTwo;

begin

X := Random(101); //Определяем значение первого элемента

Uk := nil; //////////////////////////

q := nil; // //

UkTwo := nil; // НАЧАЛЬНЫЕ УСТАНОВКИ: //

qTwo := nil; // //

UkQueue := nil; // все указатели = nil //

qQueue := nil; // //

qStack := nil; // //

qDeckBegin := nil; // //

qDeckEnd := nil; //////////////////////////

// Destroy for every lists

if ListBegin <> nil then DestroyList(ListBegin);

if ListTwoBegin <> nil then DestroyListTwo(ListTwoBegin);

if QueueBegin <> nil then DestroyList(QueueBegin);

if Stack <> nil then DestroyList(Stack);

if DeckBegin <> nil then DestroyListTwo(DeckBegin);

if RoundList <> nil then DestroyRoundList(RoundList);

AddToList(X, Uk); //

AddToListTwo(X, UkTwo); // Добавляем Х в

AddToQueue(X, UkQueue); // каждый список

AddToStack(X, qStack); //

AddToDeck(X, qDeckBegin, qDeckEnd, 0); //

AddToRoundList(X, RoundList); ///////////////////

Unit1.Form1.Edit6.Text := IntToStr(X);

q := Uk; //

qTwo := UkTwo; // Формируем указатели на начало списков

qQueue := UkQueue; //

for i := to 9 do //Дальнейшее формирование списков

begin

X := Random(101);

AddToList(X, q);

AddToListTwo(X, qTwo);

AddToQueue(X, qQueue);

AddToStack(X, qStack);

AddToDeck(X, qDeckBegin, qDeckEnd, 0);

AddToRoundList(X, RoundList);

Unit1.Form1.Edit6.Text := Unit1.Form1.Edit6.Text + ' ' + IntToStr(X);

end;

ListBegin := Uk; //////////////////////////////////////

ListTwoBegin := UkTwo; // //

QueueBegin := UkQueue; // //

Stack := qStack; // Определяем указатели все списки //

DeckBegin := qDeckBegin; // //

DeckEnd := qDeckEnd; // //

RoundList := RoundList^.Next //////////////////////////////////

end;

end.

unit Unit16; //Тест

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, ExtCtrls;

type

TForm16 = class(TForm)

Memo1: TMemo;

Panel1: TPanel;

Button1: TButton;

RadioGroup1: TRadioGroup;

Button2: TButton;

procedure RadioGroup1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form16: TForm16;

NumberQuestion: Integer = 0;

NumberTrueAnswer: Integer = 0;

ff: Boolean = True;

implementation

uses Unit1, Un18_Lab;

{$R *.DFM}

procedure TForm16.RadioGroup1Click(Sender: TObject);

begin

Button1.Enabled := True;

Button1.SetFocus;

end;

procedure TForm16.Button2Click(Sender: TObject);

begin

Form16.Hide;

Form1.Show;

end;

procedure TForm16.Button1Click(Sender: TObject);

begin

Memo1.Lines.Clear;

Button1.Enabled := False;

Inc(NumberQuestion);

case NumberQuestion of

1:

begin

if RadioGroup1.ItemIndex = 0 then Inc(NumberTrueAnswer);

Memo1.Lines.Add('Однонаправленный список - это ...');

RadioGroup1.Items.Clear;

RadioGroup1.Items.Add('Список, элементы которого имеют связь со следующим и предыдущим элементом');

RadioGroup1.Items.Add('Список, элементы которого имеют связь со следующим элементом');

RadioGroup1.Items.Add('Список, элементы которого не имеют связи');

end;

2:

begin

if RadioGroup1.ItemIndex = 1 then Inc(NumberTrueAnswer);

Memo1.Lines.Add('Если элемент содержит ссылки на следующий и предыдущий элемент, то это ...');

RadioGroup1.Items.Clear;

RadioGroup1.Items.Add('однонаправленный список');

RadioGroup1.Items.Add('двунаправленный список');

RadioGroup1.Items.Add('очередь');

RadioGroup1.Items.Add('стек');

RadioGroup1.Items.Add('дек');

RadioGroup1.Items.Add('циклический список');

end;

3:

begin

if RadioGroup1.ItemIndex = 1 then Inc(NumberTrueAnswer);

Memo1.Lines.Add('Куда добавляется элемент в двунаправленный список?');

RadioGroup1.Items.Clear;

RadioGroup1.Items.Add('В начало');

RadioGroup1.Items.Add('В конец');

RadioGroup1.Items.Add('В любое другое место');

end;

4:

begin

if RadioGroup1.ItemIndex = 2 then Inc(NumberTrueAnswer);

Memo1.Lines.Add('Чем отличается однонаправленный список от двунаправленного?');

RadioGroup1.Items.Clear;

RadioGroup1.Items.Add('Существует связь с предыдущим элементом');

RadioGroup1.Items.Add('Не существует связь с предыдущим элементом');

RadioGroup1.Items.Add('Не отличаются');

end;

5:

begin

if RadioGroup1.ItemIndex = 1 then Inc(NumberTrueAnswer);

Memo1.Lines.Add('Какой элемент считывается из стека?');

RadioGroup1.Items.Clear;

RadioGroup1.Items.Add('Последний');

RadioGroup1.Items.Add('Любой');

RadioGroup1.Items.Add('Первый');

end;

6:

begin

if RadioGroup1.ItemIndex = 0 then Inc(NumberTrueAnswer);

Memo1.Lines.Add('Чем отличается дек от стека?');

RadioGroup1.Items.Clear;

RadioGroup1.Items.Add('Добавление в любом место. Удаление из начала');

RadioGroup1.Items.Add('Добавление в начало. Удаление из любого места');

RadioGroup1.Items.Add('Все включения исключения происходят на обоих его концах');

end;

7:

begin

if RadioGroup1.ItemIndex = 2 then Inc(NumberTrueAnswer);

Memo1.Lines.Add('Откуда считывается элемент из очереди?');

RadioGroup1.Items.Clear;

RadioGroup1.Items.Add('С конца');

RadioGroup1.Items.Add('С начала');

RadioGroup1.Items.Add('Из люього места');

end;

8:

begin

if RadioGroup1.ItemIndex = 1 then Inc(NumberTrueAnswer);

Memo1.Lines.Add('Куда добавляется элемент в стек?');

RadioGroup1.Items.Clear;

RadioGroup1.Items.Add('В конец');

RadioGroup1.Items.Add('В начало');

RadioGroup1.Items.Add('В любое место');

end;

9:

begin

if RadioGroup1.ItemIndex = 0 then Inc(NumberTrueAnswer);

Memo1.Lines.Add('Какую ссылку содержит последний элемент циклического списка?');

RadioGroup1.Items.Clear;

RadioGroup1.Items.Add('На первый элемент');

RadioGroup1.Items.Add('На предыдущий элемент');

RadioGroup1.Items.Add('NIL');

end;

10:

begin

if RadioGroup1.ItemIndex = 0 then Inc(NumberTrueAnswer);

Memo1.Lines.Add('Если все включения и исключения происходят на одном конце списка, то это ...');

RadioGroup1.Items.Clear;

RadioGroup1.Items.Add('однонаправленный список');

RadioGroup1.Items.Add('двунаправленный список');

RadioGroup1.Items.Add('очередь');

RadioGroup1.Items.Add('стек');

RadioGroup1.Items.Add('дек');

RadioGroup1.Items.Add('циклический список');

end;

11:

begin

if RadioGroup1.ItemIndex = 3 then Inc(NumberTrueAnswer);

Memo1.Lines.Add('Если последний элемент имеет ссылку на первый элемент, то это ...');

RadioGroup1.Items.Clear;

RadioGroup1.Items.Add('однонаправленный список');

RadioGroup1.Items.Add('двунаправленный список');

RadioGroup1.Items.Add('очередь');

RadioGroup1.Items.Add('стек');

RadioGroup1.Items.Add('дек');

RadioGroup1.Items.Add('циклический список');

end;

12:

begin

if RadioGroup1.ItemIndex = 5 then Inc(NumberTrueAnswer);

Button1.Hide;

if NumberTrueAnswer >= 10 then ShowMessage('Ваша оценка - ОТЛИЧНО!');

if (NumberTrueAnswer >= 8) and (NumberTrueAnswer < 10) then ShowMessage('Ваша оценка - ХОРОШО!');

if (NumberTrueAnswer >= 6) and (NumberTrueAnswer < 8) then ShowMessage('Ваша оценка - ТРИ!');

if NumberTrueAnswer < 6 then

begin

ShowMessage('Тебе однозначно нужно почитать теорию. Твоя оценка - Два!!!');

ff := False;

end;

Form16.Hide;

Form1.Show;

if not ff then Form18.Show;

end;

end;

end;

procedure TForm16.FormClose(Sender: TObject; var Action: TCloseAction);

begin

Form16.Hide;

Form1.Show;

if not ff then Form18.Show;

end;

end.


Информация о работе «Линейные списки. Стек. Дек. Очередь»
Раздел: Информатика, программирование
Количество знаков с пробелами: 94620
Количество таблиц: 8
Количество изображений: 0

Похожие работы

Скачать
274963
85
0

... ячейка, а имя переменной превращается в адрес ячейки. Появление этого адреса происходит в результате работы специального оператора языка (NEW), однако его значение в большинстве случаев не используется при программировании на алгоритмических языках типа Паскаль. Условимся считать, что адрес ячейки, которая будет хранить переменную А, есть А. Или, другими словами, А - это общее имя переменной и ...

Скачать
13398
0
7

... : 1.       Добавление элемента в начало дека. 2.       Удаление элемента из начала дека. 3.       Добавление элемента в конец дека. 4.       Удаление элемента из конца дека. 5.       Проверка дека на наличие в нем элементов. Динамические структуры данных: дек В языках программирования существует такой способ выделения памяти под данные, который называется динамическим. В этом случае ...

Скачать
21786
0
0

... с помощью массива или списка, строку с помощью массива или списка. Теперь последовательно рассмотрим вышеперечисленные структу- ры данных и их представление через более прстые применимо к языку Pascal. 2.2  _Массив Переменная или константа, имеющая структуру массива, являет- ся совокупностью элементов одного и того же типа. Каждая от- дельная компонента массива ...

Скачать
37264
2
8

... с адресом р. В повседневной практике средства работы с адресами используются довольно редко. Основное назначение указателей состоит в том, чтобы обеспечить механизм использования в программе динамических переменных. Этот механизм мы и будем обсуждать подробно в следующих разделах. 1.2. Описание указателей В Pascal имеются два различных вида указателей: типизированные и нетипизированные. ...

0 комментариев


Наверх