Дипломная работа

от 20 дней
от 7 499 рублей

Курсовая работа

от 10 дней
от 1 499 рублей

Реферат

от 3 дней
от 529 рублей

Контрольная работа

от 3 дней
от 79 рублей
за задачу

Билеты к экзаменам

от 5 дней
от 89 рублей

 

Курсовая Динамический список динамических стеков - Программирование

  • Тема: Динамический список динамических стеков
  • Автор: Юлия
  • Тип работы: Курсовая
  • Предмет: Программирование
  • Страниц: 45
  • ВУЗ, город: Москва
  • Цена(руб.): 1500 рублей

altText

Выдержка

модействовать друг с другом на принципах композиции. Композицией называется такое отношение между классами, когда один класс является частью другого. Конкретно композиция реализуется включением в класс поля, являющегося объектом другого класса, такие поля называются объектными полями.
Рассмотрим свойства и методы создаваемых классов. На рисунке 1 показана диаграмма классов.
Рисунок 5. Диаграмма классов
В классе информационного наполнения TItem реализовано одно закрытое свойство FInfo – целое число, публичные конструктор (с параметром – целым числом, значением свойства FInfo) и деструктор, а также три публичных метода: GetInfo (метод для получения значения свойства FInfo), метод SetInfo (метод установки значения свойства), и функция isEqual, возвращающая true, если передаваемый как параметр объект класса TItem равен данному объекту (то есть равны их поля FInfo) и false в противном случае.
В классе TListItem реализовано три свойства:
FInfo – объект класса TItem, значение элемента списка;
FNext – элемент списка, следующий за данным;
FPrev – элемент списка, предшествующий данному.
В классе реализованы публичные конструктор (с параметром типа TItem для создаваемого элемента) и деструктор.
Кроме того, имеется шесть методов, необходимых для доступа и задания знаний для описанных выше свойств:
SetInfo с параметром типа TItem – значение, устанавливаемое для элемента;
SetNext с параметром типа TListItem – указателем на следующий элемент в списке за рассматриваемым объектом;
SetPrev с параметром типа TListItem – указателем на предыдущий элемент в списке за рассматриваемым объектом;
GetInfo – возвращает значение поля FInfo.
GetNext – возвращает значение поля FNext – ссылку на следующий в списке.
GetPrev – возвращает значение поля FPrev – ссылку на предыдущий в списке.
В классе двунаправленного списка TDoubleList реализовано два свойства – FHead (головной элемент списка) и FItem (текущий элемент списка).
Закрытые методы класса TDoubleList (для доступа к свойствам):
SetHead с объектом класса TListItem в качестве параметра – установить в качестве головы указанный элемент
GetHead – возвращает указатель на головной элемент списка
SetItem с объектом класса TListItem в качестве параметра – установить в качестве текущего элемента указанный элемент
GetItem – возвращает указатель на текущий элемент списка
Доступные методы класса TDoubleList:
конструктор (без параметров);
деструктор;
IsEmpty – возвращает true если список пустой и false в остальных случаях;
AddElem – добавление элемента в список после текущего элемента; параметр – объект класса TItem – информационная составляющая создаваемого элемента. Возвращаемое значение – логическое, показывает успешность операции.
AddBegin – добавление элемента в начало списка; параметр – объект класса TItem – информационная составляющая создаваемого элемента. Возвращаемое значение – логическое, показывает успешность операции.
FindElem – поиск элемента; параметр – значение информационной составляющей – объект класса TItem. Возвращаемое значение – найденный элемент или nil, если указанного элемента в списке не содержится;
RemoveElem – удаление элемента из списка; параметр – значение информационной составляющей удаляемого элемента – объект класса TItem;
ViewList – просмотр всех элементов списка в направлении от головы к хвосту, без параметров;
Save – сохранение списка в файл; параметр – имя файла. Возвращаемое значение — логическое, успешность операции;
Load – загрузка списка из файла; параметр — имя файла. Возвращаемое значение — логическое, успешность операции.
Реализация всех методов класса осуществляется в отдельном модуле UnitClass. Реализацию методов начинаем с методов класса TItem, затем класс TListItem и последним реализуем методы класса TDoubleList
Объявление и реализация методов класса TItem приведена в приложении А.
Описание демо-модуля
Для проверки работоспособности библиотеки классов необходимо создать демонстрационную программу с поддержкой оконного пользовательского интерфейса.
В результате реализации программа должна демонстрировать основные операции, необходимые для работы со списком и дополнительные:
вставка нового элемента в начало списка,
вставка нового элемента в середину списка после текущего элемента,
поиск элемента по заданному полю,
удаление элемента из списка,
перемещение по списку в обе стороны (от начала к концу и с конца к началу),
вывод содержимого списка на экран,
возможность сохранения данных списка в файл и загрузки из файла,
Внешний вид созданной демонстрационной программы показан на рисунке 1.
Рисунок 6. Внешний вид тестирующего приложения
Для удобства тестирования созданного класса, предусмотрено окно, где будет отображаться текущее состояние двунаправленного списка (слева на форме). Используется компонент ListBoxView типа TListBox
Для отображения служебной информации о происходящих изменениях (о создании, удалении элементов, о возможных ошибках) предусмотрено специальное окно справа на форме. Используется компонент ListBoxMessage типа TListBox
В центре формы размещены управляющие кнопки (компоненты TButton), позволяющие вызвать все имеющиеся в классе методы. Эти же команды продублированы в главном меню приложения (компонент типа TMainMenu). Для каждой команды назначены «горячие» клавиши.
Для ввода значения элемента списка использован компонент Edit1. Для обеспечения правильности ввода (допустим ввод только целых чисел) в компоненте реализован обработчик события OnKeyPress, в котором осуществляется проверка введенного символа. Если это не цифра, то ввод игнорируется.
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var s: set of Char;
begin // Защита от ввода неверных символов
s:=['0','1','2','3','4','5','6','7','8','9'];
if not (Key in s) and (Ord(Key)<>VK_DELETE) and (Ord(Key)<>VK_BACK) then Key:=#0;
end;
Для организации сохранения списка в файл и вычитывания списка из файла используются стандартные диалоги сохранения TSaveDialog и открытия TOpenDialog файлов.
При реализации тестового приложения была последовательно протестирована работа всех функций класса. Тестирование показало достаточность организованных методов и корректность их реализации.
Полный код тестирующего модуля приведен в приложении Б.
Описание проекта
Структура демо-модуля состоит из трех основных частей, которые разделены на модули:
1. Основная программа – файл UnitMain.pas. Здесь пользователю предоставляется возможность выбора любой доступной операции со списком, реализована функциональность демо-модуля.
2. Модуль с библиотекой классов – файл UnitClass1.pas. В этом модуле описаны все классы приложения и реализованы все методы этих классов.
3. Модуль «О программе» - файл UnitAbout.pas. Содержит форму со сведениями о приложении.
Описанные модули объединены в общий проект DoubleList.dpr.
Примеры экранных форм с иллюстрацией разных состояний контейнера
На следующих рисунках показаны примеры экранных форм при работе с приложением, которая демонстрирует применение основных имеющихся методов класса TDoubleList.
Рисунок 7. Добавление элемента в начало списка (команда «Добавить в начало»
Рисунок 8. Добавление элемента в середину списка (команда «Добавить за текущим»)
Рисунок 9. Поиск элемента (команда «Поиск элемента»)
Рисунок 10. Удаление имеющегося элемента (команда «Удалить элемент»)
Заключение
В результате выполнения курсовой работы был разработан набор взаимосвязанных классов для реализации структуры данных «Двунаправленный список» как специализированного контейнера для хранения информационных объектов. Библиотека классов оформлена в виде отдельного модуля UnitClass1.pas
Для проверки работоспособности библиотеки классов разработана демонстрационная программа с поддержкой оконного пользовательского интерфейса.
Приложение А
interface
type
// класс Информационное наполнение
TItem = class
private
FInfo:integer; // ключевое поле
public
constructor Create(const aInfo:integer); //конструктор. параметр - значение свойства Info
destructor Destroy; override; //деструктор
function GetInfo:integer; //метод для чтения свойства
procedure SetInfo(const aInfo:integer); //установка значения свойства
function isEqual(const aInfo: TItem): boolean; //проверка на равенство двух объектов
end;
implementation
//реализация класса информационного наполнения
constructor TItem.Create(const aInfo: integer);
begin //конструктор
try
inherited Create;
FInfo:=aInfo;
except
MessageDlg('Произошла ошибка при создании элемента!', mtError, [mbOk], 0);
end;
end;
destructor TItem.Destroy;
begin //деструктор
inherited;
end;
procedure TItem.SetInfo(const aInfo: integer);
begin //установка значения свойства
FInfo:=aInfo;
end;
function TItem.GetInfo: integer;
begin //чтение свойства
Result:=FInfo;
end;

function TItem.isEqual(const aInfo: TItem): boolean;
begin //сравнение
result:=(GetInfo=aInfo.FInfo);
end;
Объявление и реализация методов класса TListItem – элемент списка
interface
type
// класс - элемент списка
TListItem = class
private
FInfo: TItem; // информационное поле
FNext, FPrev: TListItem; // указатели на следующий и предыдущий элементы
public
constructor Create(const value: TItem); //конструктор. параметр - значение свойства Info
destructor Destroy; override; //деструктор
//методы для установки свойств
procedure SetInfo(const value: TItem);
procedure SetNext(const value: TListItem);
procedure SetPrev(const value: TListItem);
//методы для чтения свойств
function GetInfo: TItem;
function GetNext: TListItem;
function GetPrev: TListItem;
end;
implementation
//реализация класса "Элемент списка"
constructor TListItem.Create(const value: TItem);
begin //конструктор
inherited Create; //вызываем метод родительского класса - TObject
FInfo:=value;
FNext:=nil;
FPrev:=nil;
end;
destructor TListItem.Destroy;
begin //деструктор
FInfo.Destroy;
inherited;
end;
procedure TListItem.SetInfo(const value: TItem);
begin //установка значений свойств
FInfo:=value;
end;
procedure TListItem.SetNext(const value: TListItem);
begin
FNext:=value;
end;
procedure TListItem.SetPrev(const value: TListItem);
begin
FPrev:=value;
end;
function TListItem.GetInfo: TItem;
begin //чтение свойств
result:=FInfo;
end;
function TListItem.GetNext: TListItem;
begin
result:=FNext;
end;
function TListItem.GetPrev: TListItem;
begin
result:=FPrev;
end;
Объявление и реализация методов класса TDoubleList
interface
type
//класс - двунаправленный список
TDoubleList = class
private
FHead: TListItem; // указатель на голову списка
FItem: TListItem; // указатель на текущий элемент
//методы доступа к головному элементу
procedure SetHead(const value: TListItem);
function GetHead: TListItem;
//методы доступа к текущему элементу
procedure SetItem(const value: TListItem);
function GetItem: TListItem;
public
constructor Create; //конструктор
destructor Destroy; override; //деструктор
function IsEmpty: Boolean; //истина - если список пустой
function AddElem(const value: TItem): Boolean; //добавление элемента в список после текущего
function AddBegin(const value: TItem): Boolean; //добавление элемента в начало списка
function FindElem(const value: TItem): TListItem; //поиск элемента
function RemoveElem(var value: TListItem): Boolean;//удаление текущего элемента
procedure ViewList(var Box: TListBox); //просмотр списка с начала
function Save(const fName: string): Boolean; //сохранение в файл
function Load(const fName: string): Boolean; //загрузка из файла
end;
implementation
//класс - двусвязный список
//методы для доступа к головнуму элементу
procedure TDoubleList.SetHead(const value: TListItem);
begin
FHead:=value;
end;
function TDoubleList.GetHead: TListItem;
begin
result:=FHead;
end;
//методы для доступа к текущему элементу
procedure TDoubleList.SetItem(const value: TListItem);
begin
FItem:=value;
end;
function TDoubleList.GetItem: TListItem;
begin
result:=FItem;
end;
function TDoubleList.IsEmpty: Boolean;
begin //проверка на пустой список
if GetHead = nil then result:=true
else result:=false;
end;
constructor TDoubleList.Create;
begin //конструктор
inherited;
SetHead(nil);
SetItem(nil);
end;
destructor TDoubleList.Destroy;
begin //деструктор
while not IsEmpty do //удаление всех элементов списка
begin
SetItem(FHead.FNext);
if not RemoveElem(FHead) then ShowMessage('Странная ошибка при удалении элемента!');
SetHead(GetItem);
end;
inherited;
end;
function TDoubleList.AddElem(const value: TItem): Boolean;
//добавление элемента в список после текущего элемента
var elem: TListItem;
MyErrorString: String;
E: Exception;
begin
try
elem:=TListItem.Create(value);
if IsEmpty then //если список пустой (т.е. добавляется первый элемент списка)
SetHead(elem)
else //если список уже не пустой
begin
if FItem.FNext<>nil then // вставляем не последний (в середину)
elem.FNext:=FItem.FNext;
FItem.FNext:=elem;
elem.FPrev:=GetItem;
result:=true; //элемент добавлен
end
except
on E: Exception do
begin
result:=false; //элемент не добавлен
elem.Destroy;
MyErrorString := 'Произошла ошибка ' + E.Message + #13#10+'Извините за неудобства!';
MessageDlg(MyErrorString, mtError, [mbOk], 0);
end;
end;
end;

function TDoubleList.AddBegin(const value: TItem): Boolean;
//добавление элемента в начало списка
var elem: TListItem;
MyErrorString: String;
E: Exception;
begin
try
elem:=TListItem.Create(value);
if IsEmpty then //если список пустой (т.е. добавляется первый элемент списка)
SetHead(elem)
else //если список уже не пустой
begin
elem.FNext:=GetHead;
FHead.FPrev:=elem;
SetHead(elem);
SetItem(elem);
result:=true; //элемент добавлен
end
except
on E: Exception do
begin
result:=false; //элемент не добавлен
elem.Destroy;
MyErrorString := 'Произошла ошибка ' + E.Message + #13#10+'Извините за неудобства!';
MessageDlg(MyErrorString, mtError, [mbOk], 0);
end;
end;
end;
function TDoubleList.FindElem(const value: TItem): TListItem;
var curr: TListItem;
begin //поиск элемента - возвращаем найденный элемент или nil
if IsEmpty then //если список пустой - искомого элемента в нем нет
begin
result:=nil;
exit;
end;
curr:=GetHead;
while (curr.FNext<>nil) and not(curr.FInfo.isEqual(value)) do
curr:=curr.FNext;
//если найдено - возвращаем сам элемент, иначе - nil
if curr.FInfo.isEqual(value) then
result:=curr
else
result:=nil;
end;
function TDoubleList.RemoveElem(var value: TListItem): Boolean;
var elem: TListItem;
begin //удаление элемента
if IsEmpty then //если список пустой, то удалять нечего
begin
result:=false;
exit;
end;

//если список не пустой
elem:=FindElem(value.FInfo);
if elem<>nil then //если удаляемый элемент есть в списке
begin
if elem.FNext<>nil then // это не последний элемент
elem.FNext.FPrev:=elem.FPrev;
if elem.FPrev<>nil then // это не первый элемент
elem.FPrev.FNext:=elem.FNext
else SetHead(elem.FNext); // для первого элемента
elem.Destroy;
result:=true;
end
else //если элемент не найден
result:=false;
end;
procedure TDoubleList.ViewList(var Box: TListBox);
var curr: TListItem;
begin //просмотр списка
Box.Clear;
curr:=GetHead;
while curr<>nil do
begin
Box.Items.Add(IntToStr(curr.FInfo.GetInfo));
curr:=curr.FNext;
end;
end;
function TDoubleList.Save(const fName: string): Boolean;
var f: TextFile; //сохранение в файл
curr: TListItem;
toWrite: TItem;
begin
result:=true;
AssignFile(f,fName);
try //пробуем открыть файл
ReWrite(f);
except
result:=false;
MessageDlg('Ошибка создания файла. Извините!',mtError,[mbOK],0);
exit;
end;
//записываем в файл все данные из списка
curr:=GetHead;
while curr<>nil do
begin
toWrite:=curr.FInfo;
Writeln(f, toWrite.FInfo);
curr:=curr.FNext;
end;
CloseFile(f); //закрываем файл
end;

function TDoubleList.Load(const fName: string): Boolean;
var f: TextFile; //чтение из файла
bufint: integer;
elem: TItem;
begin
result:=true;
AssignFile(f,fName);
try //пробуем открыть файл
reset(f);
except
result:=false;
MessageDlg('Ошибка открытия файла. Извините!',mtError,[mbOK],0);
exit;
end;
//читаем из файла в список
try
while not eof(f) do
begin
Readln(f,bufint);
elem.Create(bufint);
AddElem(elem);
end;
except
result:=false;
MessageDlg('Ошибка чтения из файла.'+#10#13+'Проверьте содержимое файла на соотвествие',mtError,[mbOK],0);
destroy;
exit;
end;
CloseFile(f); //закрываем файл
end;
Приложение Б
unit UnitMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus, ActnList, UnitClass1;
type
TForm1 = class(TForm)
SaveDialog1: TSaveDialog;
OpenDialog1: TOpenDialog;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
N13: TMenuItem;
N14: TMenuItem;
N16: TMenuItem;
N18: TMenuItem;
GroupBox1: TGroupBox;
Edit1: TEdit;
Label1: TLabel;
Button1: TButton;
Button2: TButton;
Button5: TButton;
Button6: TButton;
GroupBox2: TGroupBox;
Button3: TButton;
Button4: TButton;
Button7: TButton;
Button8: TButton;
ActionList1: TActionList;
ActionNewSpis: TAction;
GroupBox3: TGroupBox;
ListBoxMessage: TListBox;
ActionAddElem: TAction;
ActionNextElem: TAction;
ActionPrevElem: TAction;
GroupBox4: TGroupBox;
ListBoxView: TListBox;
Button9: TButton;
Button10: TButton;
ActionAddBegin: TAction;
ActionFindElem: TAction;
ActionDelElem: TAction;
N17: TMenuItem;
N19: TMenuItem;
ActionViewElem: TAction;
ActionViewList: TAction;
N20: TMenuItem;
ActionFileLoad: TAction;
ActionFileSave: TAction;
procedure FormCreate(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure ActionNewSpisExecute(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ActionAddElemExecute(Sender: TObject);
procedure ActionNextElemExecute(Sender: TObject);
procedure ActionPrevElemExecute(Sender: TObject);
procedure ActionAddBeginExecute(Sender: TObject);
procedure ActionFindElemExecute(Sender: TObject);
procedure ActionDelElemExecute(Sender: TObject);
procedure ActionViewElemExecute(Sender: TObject);
procedure ActionViewListExecute(Sender: TObject);
procedure N14Click(Sender: TObject);
procedure ActionFileSaveExecute(Sender: TObject);
procedure ActionFileLoadExecute(Sender: TObject);
procedure N5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
DblList: TDoubleList;
implementation
uses Unit

 

НАШИ КОНТАКТЫ

Skype: forstuds E-mail: [email protected]

ВРЕМЯ РАБОТЫ

Понедельник - пятница 9:00 - 18:00 (МСК)

ПРИНИМАЕМ К ОПЛАТЕ