Разработка программного средства по теме «Динамические типы данных»




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

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

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



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-06-03 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: