3. На листе формата А4, опишите ход проделанной работы.
Ответьте на поставленные вопросы:
1) Как удаляется и добавляется элементы в стек?
2) Приведи примеры стека на практике?
________________________________________________________________
Задачи для самостоятельного решения:
1) Предположим, что уже построен стек, элементами которого являются целые числа. Написать программу, которая находит сумму элементов, находящихся в стеке.
2) Предположим, что уже построен стек, элементами которого являются целые числа. Написать программу, которая добавляет в конец стека S элемент, находящийся в его вершине.
3) Предположим, что уже построен стек, элементами которого являются целые числа. Написать программу, которая удаляет из стека все элементы, кратные 4 (использовать для промежуточного хранения элементов стека однонаправленный список с заглавным звеном).
Учитель | Ученик | ПК | Тетрадь |
2 этап - Подготовка к лабораторной работе | |||
Запускаем демонстрационную программу. Нажмите кнопку теория. Перед вами появилось окно с теоретическим материалом. Внимательно ознакомьтесь с новым материалом. Обратите внимание на примеры создания стека и получения элемента из стека. Провести аналогию между очередью и стеком. | Знакомится с новым материалом. | Теоретический материал по теме «стек». | Определение «стека». Порядок расположения данных. Примеры создания стека и получения элемента из стека. |
3 этап - Выполнение лабораторной работы | |||
Открываем лабораторную работу №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 этап – Подведение итогов | |||
Итак, мы с вами изучили линейные списки. Подведем итоги. Вы ознакомились с такими списками как: однонаправленный и двунаправленный списки, стек, дек, очередь и циклический список. Вы узнали, что такое связанное распределение и динамические информационные структуры. Научились использовать полученные знания на практике при решении задач. При помощи теста оценили результаты полученных знаний. | |||
Если кого, что-то заинтересовало или кто-то полностью не усвоил пройденный материал, то он может подойти к учителю и получить интересующие его сведения. | |||
Сообщаются оценки за тест, и за факультатив в общем. |
После загрузки демонстрационной программы перед вами появится вот такое окно.
Это главная форма демонстрационной программы. Для формирования списков нажмите кнопку «Обновить».
Теперь списки сформированы и готовы к работе. Списки содержат целые положительные числа. Указатели указывают на начало списка. С помощью кнопок «<<» «>>» можно перемещать указатель по списку. С помощью кнопки «Добавить» вы можете добавить элемент в список. При нажатии на кнопку «Добавить» всплывает окно «Добавление нового элемента», в котором вы указываете какой элемент хотите добавить и нажимаете кнопку «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.
... ячейка, а имя переменной превращается в адрес ячейки. Появление этого адреса происходит в результате работы специального оператора языка (NEW), однако его значение в большинстве случаев не используется при программировании на алгоритмических языках типа Паскаль. Условимся считать, что адрес ячейки, которая будет хранить переменную А, есть А. Или, другими словами, А - это общее имя переменной и ...
... : 1. Добавление элемента в начало дека. 2. Удаление элемента из начала дека. 3. Добавление элемента в конец дека. 4. Удаление элемента из конца дека. 5. Проверка дека на наличие в нем элементов. Динамические структуры данных: дек В языках программирования существует такой способ выделения памяти под данные, который называется динамическим. В этом случае ...
... с помощью массива или списка, строку с помощью массива или списка. Теперь последовательно рассмотрим вышеперечисленные структу- ры данных и их представление через более прстые применимо к языку Pascal. 2.2 _Массив Переменная или константа, имеющая структуру массива, являет- ся совокупностью элементов одного и того же типа. Каждая от- дельная компонента массива ...
... с адресом р. В повседневной практике средства работы с адресами используются довольно редко. Основное назначение указателей состоит в том, чтобы обеспечить механизм использования в программе динамических переменных. Этот механизм мы и будем обсуждать подробно в следующих разделах. 1.2. Описание указателей В Pascal имеются два различных вида указателей: типизированные и нетипизированные. ...
0 комментариев