Реализация специализированного контейнера на базе списка на основе массива со сдвигом элементов и очереди на основе адресных указателей
Описание используемых понятий и механизмов объектно-ориентированного программирования. Разработка и описание необходимых классов. Демонстрационный модуль с кратким описанием использованных стандартных компонентов. Внешний вид и листинг программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 24.07.2013 |
Размер файла | 1,3 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Курсовая работа
по дисциплине
"Объектно-ориентированное программирование"
на тему:
"Реализация специализированного контейнера на базе списка на основе массива со сдвигом элементов и очереди на основе адресных указателей"
Оглавление
- Введение
- 1. Описание используемых понятий и механизмов ООП
- 2. Разработка и описание необходимых классов
- 3. Описание демонстрационного модуля с кратким описанием использованных стандартных компонентов
- Краткое описание использованных стандартных компонентов
- Описание внешнего вида программы
- Листинг программы
- Вывод
- Список литературы
Введение
Очередь представляет собой линейный список данных, доступ к которому осуществляется по принципу "первый вошел, первый вышел" (иногда сокращенно его называют методом доступа FIFO). Элемент, который был первым поставлен в очередь, будет первым получен из нее. Элемент, поставленный в очередь вторым, при поиске будет получен также вторым и т.д. Существует два способа реализации очереди - статический и динамический. При статической реализации элементы очереди хранятся в обычном массиве. Память под массив выделяется сразу и не изменяется по мере заполнения очереди. Преимуществом данного способа является скорость работы с очередью, т.к. элементы очереди располагаются в памяти друг за другом. Недостатком является возможность переполнения очереди при слишком большом количестве добавленных элементов. При динамической реализации каждый элемент очереди состоит из двух частей - информационной части и указателя на следующий элемент очереди. При этом в отдельных переменных хранятся указатели на первый и последний элементы очереди. При таком способе реализации элементы располагаются в памяти произвольным образом. Преимуществом данного способа является то, что размеры очереди ограничены лишь размерами памяти и пустые элементы не хранятся в очереди, а освобождаются из памяти. Недостатком является медленная скорость работы с элементами при большом их количестве. Основные операции с динамической очередью: добавление, поиск и удаление элементов. Для унифицирования операций добавления и удаления элементов в начало очереди вводится фиктивный элемент-заголовок, который всегда остается в памяти и содержит указатель на первый элемент очереди.
программа объектный ориентированный программирование
1. Описание используемых понятий и механизмов ООП
Объемктно-ориентимрованное программирование (ООП) - современный подход к программированию программ и систем, в котором основные операции совершаются с некими объектами и описывающими их классами. Объектно-ориентированная программа является совокупностью объектов и способов их взаимодействия.
Класс - это тип, описывающий устройство объектов. В классах описываются свойства объекта, его методы и события, на которые он может реагировать. Объект - это экземпляр класса. Объект можно определить, как некую совокупность данных и способов работы с ним. При объектно-ориентированном программировании объект состоит из двух частей: набора данных (или свойств объекта) и программного кода обработки этих данных (или методов объекта).
Класс является описываемой на языке терминологии (пространства имён) исходного кода моделью ещё не существующей сущности, так называемого объекта.
Объект - сущность в адресном пространстве вычислительной системы, появляющаяся при создании экземпляра класса (например, после запуска результатов компиляции (и линковки) исходного кода на выполнение).
Основные понятия
Контейнер
Контейнером называется объект, позволяющий хранить и обрабатывать набор некоторых объектов. Вариантами реализации контейнера могут быть на основе: массива, динамических списков разных типов, хеш-таблиц.
Взаимодействие объектов и классов
Любая программа в объектно-ориентированном программировании реализует ту или иную поставленную задачу с помощью взаимодействия объектов разных классов.
Различают два способа взаимодействия:
агрегация (композиция)
обобщение (наследование)
Агрегация возникает в тех случаях, когда один объект включает в себя в качестве
составных частей другие объекты, т.е. моделирует отношение часть - целое.
Абстракция данных
Объекты представляют собою упрощенное, идеализированное описание реальных сущностей предметной области. Если соответствующие модели адекватны решаемой задаче, то работать с ними оказывается намного удобнее, чем с низкоуровневым описанием всех возможных свойств и реакций объекта.
Инкапсуляция
Инкапсуляция - это принцип, согласно которому любой класс должен рассматриваться как чёрный ящик - пользователь класса должен видеть и использовать только интерфейсную часть класса (т.е. список декларируемых свойств и методов класса) и не вникать в его внутреннюю реализацию. Поэтому данные принято инкапсулировать в классе таким образом, чтобы доступ к ним по чтению или записи осуществлялся не напрямую, а с помощью методов. Принцип инкапсуляции (теоретически) позволяет минимизировать число связей между классами и, соответственно, упростить независимую реализацию и модификацию классов.
Сокрытие данных - неотделимая часть ООП, управляющая областями видимости. Является логическим продолжением инкапсуляции. Целью сокрытия является невозможность для пользователя узнать или испортить внутреннее состояние объекта.
Наследование
Наследованием называется возможность порождать один класс от другого с сохранением всех свойств и методов класса-предка (прародителя, иногда его называют суперклассом) и добавляя, при необходимости, новые свойства и методы. Набор классов, связанных отношением наследования, называют иерархией. Наследование может быть двух видов: простое и множественное.
Наследование называется простым, когда у дочернего класса существует только один родитель, множественным - когда дочернего класса существует более одного родителя.
Полиморфизм
Полиморфизмом называют явление, при котором функции (методу) с одним и тем же именем соответствует разный программный код (полиморфный код) в зависимости от того, объект какого класса используется при вызове данного метода. Полиморфизм обеспечивается тем, что в классе-потомке изменяют реализацию метода класса-предка с обязательным сохранением сигнатуры метода. Это обеспечивает сохранение неизменным интерфейса класса-предка и позволяет осуществить связывание имени метода в коде с разными классами - из объекта какого класса осуществляется вызов, из того класса и берётся метод с данным именем. Такой механизм называется динамическим (или поздним) связыванием - в отличие от статического (раннего) связывания, осуществляемого на этапе компиляции.
Переопределение методов - это возможность объявления в дочернем классе метода, заголовок которого полностью совпадает с родительским методом, но для этого метода существует своя программная реализация.
Переопределение методов основано на двух важных понятиях:
динамическая компоновка программного кода, т.е. подключение необходимых программных модулей непосредственно во время работы программы.
информация о переопределенных в классе методах, доступная механизму динамической компоновки
Динамическая компоновка позволяет создавать такие программные коды, которые могут динамически подключаться в процессе выполнения программы. Данная программа отличается своей гибкостью, но имеет достаточно медленную скорость выполнения. Методы данного класса делятся на две группы: неизменяемые методы (реализация по схеме раннего связывания), изменяемые переопределенные (виртуальные) методы.
Статическая компоновка - это создание полностью готового к выполнению программного кода на этапе разработки программы. При разработки программы компилятор переводит набор программ в машинный код, а компоновщик объединяет остальные программные модули в единое целое. Данный код содержит все необходимые адресные связи и может выполняться без каких - либо дополнительных действий. Преимуществами этого способа являются быстрая скорость выполнения программного кода, а недостатком - жесткость программы.
Интерфейсные классы
Интерфейсный класс - полностью абстрактный класс, в котором методы представляют собой только заголовки. Основные значения интерфейсных классов - это построение гибких объектных моделей с возможностью создания обычных классов на основе нескольких интерфейсных классов с обязательной реализацией всех заявленных методов. Существуют некоторые отличия интерфейсных классов от абстрактных классов: абстрактные классы могут содержать реализацию некоторых методов, а в интерфейсных исключена всякая реализация; абстрактнее классы поддерживают только простое наследование, а интерфейсные - множественное.
2. Разработка и описание необходимых классов
Класс TPlayerInfo.
Данный класс содержит такую информацию об игроках как фамилия игрока и номер. Также он содержит конструктор, get метод и set метод для фамилии, get метод и set метод для номера.
type
TPlayerInfo=class
private
Surname: string;
Number: integer;
public
constructor Create (aSurname: string; aNumber: integer);
function GetSurname: string;
procedure SetSurname (aSurname: string);
function GetNumber: integer;
procedure SetNumber (aNumber: integer);
end;
Класс TPlayer.
Данный класс содержит такую информацию, как указатель на информацию об объекте и указатель на следующий элемент. Также он содержит конструктор (создающий фиктивный элемент-заголовок, который содержит указатель на первый элемент очереди), get метод и set метод для указателя на информацию об объекте, get метод и set метод для указателя на следующий элемент.
type
TPlayer=class
private
PlayerData: TPlayerInfo;
Next: TPlayer;
public
constructor Create (aSurname: string; aNumber: integer);
function GetPlayerData: TPlayerInfo;
procedure SetPlayerData (aPlayerData: TPlayerInfo);
function GetNext: TPlayer;
procedure SetNext (aNext: TPlayer);
end;
Класс TTeam;
Данный класс содержит такую информацию, как указатель на элемент-заголовок, указатель на последний элемент очереди, количество элементов в очереди и название команды. Также он содержит конструктор, get метод и set метод для названия команды, get метод и set метод для указателя на элемент-заголовок, get метод и set метод для указателя на последний элемент, get метод и set метод для количества элементов в очереди, методы добавления, поиска и удаления элементов.
type
TTeam=class
private
NameTeam: string;
First, Last: TPlayer;
Count: integer;
public
constructor Create (aNameTeam: string);
function GetNameTeam: string;
procedure SetNameTeam (aNameTeam: string);
function GetFirst: TPlayer;
procedure SetFirst (aFirst: TPlayer);
function GetLast: TPlayer;
procedure SetLast (aLast: TPlayer);
function GetCount: integer;
procedure SetCount (aCount: integer);
procedure AddPlayer (aSurname: string; aNumber: integer);
function SearchPlayer (aSurname: string): TPlayerInfo; overload;
function SearchPlayer (aNumber: integer): TPlayerInfo; overload;
function DeletePlayer: boolean;
end;
Класс TLeague.
Данный класс содержит такую информацию, как название спортлиги, массив указателей на данные о команде и элемент-счетчик. Также он содержит конструктор, get метод и set метод для названия спортлиги,get метод для определенной команды в списке, get метод и set метод для элемента-счетчика, методы добавления, поиска и удаления элементов, методы сохранения данных в файл и загрузки данных из файла.
type
TLeague=class
private
NameLeague: string;
Teams: array [1. KolTeam] of TTeam;
Count: integer;
public
constructor Create (aNameLeague: string);
function GetNameLeague: string;
procedure SetNameLeague (aNameLeague: string);
function GetTeam (i: integer): TTeam;
function GetCount: integer;
procedure SetCount (aCount: integer);
function SearchTeam (aNameTeam: string): integer;
function AddTeam (aNameNewTeam,aNameSearchTeam: string): boolean;
function DeleteTeam (aNameTeam: string): boolean;
procedure Open (FileName: string);
procedure Save (Filename: string);
end;
Диаграмма взаимодействия объектов
3. Описание демонстрационного модуля с кратким описанием использованных стандартных компонентов
Краткое описание использованных стандартных компонентов
В программе используются несколько стандартных компонентов: TListBox, TLabel, TActionMainMenu, TActionToolBar.
TActionMainMenu - специализированный контейнер (подобный компоненту TPanel), который отображает элементы действий на панели в порядке, указанном в Менеджере Действий. Этот компонент имеет непосредственную связь с компонентом TActionManager.
TActionManager является своего рода "командным пунктом", из которого должны управляться элементы управления приложения.
TActionToolBar - панель инструменты, для размещения компонентов, которые были созданы в TActionManager.
TLabel - компонент, отображающий простейшее название на главной форме и расположенной на панели Standart. Главное свойство компонента TLabel - Caption, с помощью которого мы легко можем поменять изменить название.
Компонент TListBox отображает список выбираемых элементов, к примеру в процедурах поиска, добавления и удаления той или иной команды или игрока. Основное свойство ListBox - Items, отвечающее за список строк и соответственно имеющее тип TStrings. TStrings представляет собой набор строк, который является достаточно мощным средством для хранения и работы с информацией, представленной в виде строк.
Описание внешнего вида программы
Главное окно программы:
Окно содержит 3 видимых компонента TLabel для отображения надписей на форме,
2 видимых компонента TListBox для вывода информации об игроках, видимые компоненты TActionMainMenuBar и TActionToolBar для отображения меню. Еще оно содержит невидимые компоненты TSaveDialog и TOpenDialog для сохранения текущей работы и открытия ранее сохраненной работы соответственно.
Панель быстрого запуска выглядит следующим образом:
Меню "Файл" и "Правка" содержит следующие команды:
Некоторые компоненты меню и соответствующие им кнопки быстрого запуска недоступны с начала запуска программы, а появляются по мере работы с ней. При запуске программы доступны лишь команды "Новая лига", "Открыть" и "Выход".
При попытке создать лигу появится новое окно, где пользователь может задать имя новой лиги.
После ввода названия и нажатия кнопки "ОК" название предыдущей лиги, если оно было, сменится на новое. Станут доступными такие компоненты меню, как "Редактировать лигу", "Удалить лигу", "Сохранить" и "Добавить команду".
Процедура открытия ранее сохраненной лиги выглядит следующим образом:
После открытия файла окно программы будет выглядеть примерно так:
Для добавления игрока в команду необходимо выбрать команду из списка команд и нажать кнопку "Добавить игрока". После этого появится окно, в котором пользователь может ввести фамилию и номер нового игрока. Для ввода номера используется компонент TMaskEdit с маской "! 99; 1; _", которая означает, что в поле ввода можно ввести только цифры.
Листинг программы
Модуль PlayerInfo
unit PlayerInfo;
interface
uses Main;
type
TPlayerInfo=class
private
Surname: string;
Number: integer;
public
constructor Create (aSurname: string; aNumber: integer);
function GetSurname: string;
procedure SetSurname (aSurname: string);
function GetNumber: integer;
procedure SetNumber (aNumber: integer);
end;
implementation
constructor TPlayerInfo. Create (aSurname: string; aNumber: integer);
begin
Surname: =aSurname;
Number: =aNumber;
end;
function TPlayerInfo. GetSurname;
begin
result: =Surname;
end;
procedure TPlayerInfo. SetSurname (aSurname: string);
begin
Surname: =aSurname;
end;
function TPlayerInfo. GetNumber: integer;
begin
result: =Number;
end;
procedure TPlayerInfo. SetNumber (aNumber: integer);
begin
Number: =aNumber;
end;
end.
Модуль Player
unit Player
interface
uses Main, PlayerInfo;
type
TPlayer=class
private
PlayerData: TPlayerInfo;
Next: TPlayer;
public
constructor Create (aSurname: string; aNumber: integer);
function GetPlayerData: TPlayerInfo;
procedure SetPlayerData (aPlayerData: TPlayerInfo);
function GetNext: TPlayer;
procedure SetNext (aNext: TPlayer);
end;
implementation
constructor TPlayer. Create (aSurname: string; aNumber: integer);
begin
PlayerData: =TPlayerInfo. Create (aSurname,aNumber);
Next: =nil;
end;
function TPlayer. GetPlayerData: TPlayerInfo;
begin
result: =PlayerData;
end;
procedure TPlayer. SetPlayerData (aPlayerData: TPlayerInfo);
begin
PlayerData: =aPlayerData;
end;
function TPlayer. GetNext: TPlayer;
begin
result: =Next;
end;
procedure TPlayer. SetNext (aNext: TPlayer);
begin
Next: =aNext;
end;
end.
Модуль Team
unit Team;
interface
uses Main, PlayerInfo, Player;
type
TTeam=class
private
NameTeam: string;
First, Last: TPlayer;
Count: integer;
public
constructor Create (aNameTeam: string);
function GetNameTeam: string;
procedure SetNameTeam (aNameTeam: string);
function GetFirst: TPlayer;
procedure SetFirst (aFirst: TPlayer);
function GetLast: TPlayer;
procedure SetLast (aLast: TPlayer);
function GetCount: integer;
procedure SetCount (aCount: integer);
procedure AddPlayer (aSurname: string; aNumber: integer);
function SearchPlayer (aSurname: string): TPlayerInfo; overload;
function SearchPlayer (aNumber: integer): TPlayerInfo; overload;
function DeletePlayer: boolean;
end;
implementation
constructor TTeam. Create (aNameTeam: string);
begin
NameTeam: =aNameTeam;
First: =TPlayer. Create ('заголовок',1);
Last: =First;
Count: =0;
end;
function TTeam. GetNameTeam: string;
begin
result: =NameTeam;
end;
procedure TTeam. SetNameTeam (aNameTeam: string);
begin
NameTeam: =aNameTeam;
end;
function TTeam. GetFirst: TPlayer;
begin
result: =First;
end;
procedure TTeam. SetFirst (aFirst: TPlayer);
begin
First: =aFirst;
end;
function TTeam. GetLast: TPlayer;
begin
result: =Last;
end;
procedure TTeam. SetLast (aLast: TPlayer);
begin
Last: =aLast;
end;
function TTeam. GetCount: integer;
begin
result: =Count;
end;
procedure TTeam. SetCount (aCount: integer);
begin
Count: =aCount;
end;
procedure TTeam. AddPlayer (aSurname: string; aNumber: integer);
var
Temp: TPlayer;
begin
Temp: =TPlayer. Create (aSurname,aNumber);
Last. SetNext (Temp);
Last: =Last. GetNext;
Count: =Count+1;
end;
function TTeam. SearchPlayer (aSurname: string): TPlayerInfo;
var
Temp: TPlayer;
begin
Temp: =First. GetNext;
result: =nil;
while Temp<>nil do
if Temp. GetPlayerData. GetSurname=aSurname then
begin
result: =Temp. GetPlayerData;
break;
end
else
Temp: =Temp. GetNext;
end;
function TTeam. SearchPlayer (aNumber: integer): TPlayerInfo;
var
Temp: TPlayer;
begin
Temp: =First. GetNext;
result: =nil;
while Temp<>nil do
if Temp. GetPlayerData. GetNumber=aNumber then
begin
result: =Temp. GetPlayerData;
break;
end
else
Temp: =Temp. GetNext;
end;
function TTeam. DeletePlayer: boolean;
var
Temp: TPlayer;
begin
if First=Last then
result: =false
else
if Count=1 then
begin
First. SetNext (nil);
Last: =First;
Count: =0;
result: =true;
end
else
begin
Temp: =First. GetNext;
First. SetNext (Temp. GetNext);
Temp. Free;
Count: =Count-1;
result: =true;
end;
end;
end.
Модуль League
unit League;
interface
uses Main, PlayerInfo, Player, Team, SysUtils;
Const KolTeam=3;
type
TLeague=class
private
NameLeague: string;
Teams: array [1. KolTeam] of TTeam;
Count: integer;
public
constructor Create (aNameLeague: string);
function GetNameLeague: string;
procedure SetNameLeague (aNameLeague: string);
function GetTeam (i: integer): TTeam;
function GetCount: integer;
procedure SetCount (aCount: integer);
function SearchTeam (aNameTeam: string): integer;
function AddTeam (aNameNewTeam,aNameSearchTeam: string): boolean;
function DeleteTeam (aNameTeam: string): boolean;
procedure Open (FileName: string);
procedure Save (Filename: string);
end;
implementation
constructor TLeague. Create (aNameLeague: string);
var i: integer;
begin
NameLeague: =aNameLeague;
for i: =1 to Count do Teams [i]: =nil;
Count: =0;
end;
function TLeague. GetNameLeague: string;
begin
result: =NameLeague;
end;
procedure TLeague. SetNameLeague (aNameLeague: string);
begin
NameLeague: =aNameLeague;
end;
function TLeague. GetTeam (i: integer): TTeam;
begin
result: =Teams [i];
end;
function TLeague. GetCount: integer;
begin
result: =Count;
end;
procedure TLeague. SetCount (aCount: integer);
begin
Count: =aCount;
end;
function TLeague. SearchTeam (aNameTeam: string): integer;
var
i: integer;
begin
result: =0;
for i: =1 to Count do
if Teams [i]. GetNameTeam=aNameTeam then
begin
result: =i;
break;
end;
end;
function TLeague. AddTeam (aNameNewTeam, aNameSearchTeam: string): boolean;
var
i,Temp: integer;
begin
result: =false;
if Count<KolTeam then
if Count>0 then
begin
Temp: =SearchTeam (aNameSearchTeam);
if Temp<>0 then
begin
Count: =Count+1;
for i: =Count downto Temp+1 do
Teams [i]: =Teams [i-1];
Teams [Temp+1]: =TTeam. Create (aNameNewTeam);
result: =true;
end
else
MainForm. ErrorMessage ('Ошибка!!! ','Команда с именем '+aNameSearchTeam+' не найдена');
end
else
begin
Count: =1;
Teams [Count]: =TTeam. Create (aNameNewTeam);
result: =true;
end
else
MainForm. ErrorMessage ('Ошибка!!! ','Нет места для добавления');
end;
function TLeague. DeleteTeam (aNameTeam: string): boolean;
var
i,j: integer;
begin
result: =false;
i: =1;
while i<=Count do
if Teams [i]. GetNameTeam=aNameTeam then
begin
for j: =i to Count-1 do
Teams [j]: =Teams [j+1];
Count: =Count-1;
result: =true;
break;
end
else
i: =i+1;
end;
procedure TLeague. Open (FileName: string);
procedure OneToThree (aTempFull: string; var aTempTeamName,aTempPlayerName,aTempPlayerNumber: string);
var
i,j: integer;
begin
i: =1;
while (aTempFull [i] <>^I) do
i: =i+1;
aTempTeamName: =Copy (aTempFull,1, i-1);
j: =i+1;
while (aTempFull [j] <>^I) do
j: =j+1;
aTempPlayerName: =Copy (aTempFull, i+1,j- (i+1));
aTempPlayerNumber: =Copy (aTempFull,j+1,Length (aTempFull));
end;
var
f: TextFile;
TempLeagueName,TempFull,TempTeamName,TempSearchName,TempPlayerName,TempPlayerNumber: string;
TempTeam: TTeam;
begin
AssignFile (f,FileName);
Reset (f);
ReadLn (f,TempLeagueName);
SetNameLeague (TempLeagueName);
ReadLn (f,TempFull);
TempSearchName: ='';
while TempFull<>'' do
begin
OneToThree (TempFull,TempTeamName,TempPlayerName,TempPlayerNumber);
if SearchTeam (TempTeamName) =0 then
AddTeam (TempTeamName,TempSearchName);
if (TempPlayerName<>'') or (TempPlayerNumber<>'') then
begin
TempTeam: =GetTeam (SearchTeam (TempTeamName));
TempTeam. AddPlayer (TempPlayerName,StrToInt (TempPlayerNumber));
end;
TempSearchName: =TempTeamName;
ReadLn (f,TempFull);
end;
CloseFile (f);
end;
procedure TLeague. Save (FileName: string);
var
f: TextFile;
TempPlayer: TPlayer;
i: integer;
TempString: string;
begin
Assignfile (f,FileName);
Rewrite (f);
WriteLn (f,GetNameLeague);
for i: =1 to GetCount do
begin
if GetTeam (i). GetCount>0 then
begin
TempPlayer: =GetTeam (i). GetFirst. GetNext;
while TempPlayer<>nil do
begin
TempString: =GetTeam (i). GetNameTeam+^I+TempPlayer. GetPlayerData. GetSurname+^I+IntToStr (TempPlayer. GetPlayerData. GetNumber);
writeln (f,TempString);
TempPlayer: =TempPlayer. GetNext;
end;
end
else
writeln (f,GetTeam (i). GetNameTeam+^I+''+^I+'');
end;
CloseFile (f);
end;
end.
Модуль Main
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ActnList, ImgList, ActnCtrls, ToolWin, ActnMan, ActnMenus,
XPStyleActnCtrls, XPMan, StdCtrls;
type
TMainForm = class (TForm)
ActionManager1: TActionManager;
ActionMainMenuBar1: TActionMainMenuBar;
ActionToolBar1: TActionToolBar;
ImageList1: TImageList;
NewLeague: TAction;
EditLeague: TAction;
DeleteLeague: TAction;
ExitProgramm: TAction;
SaveData: TAction;
OpenData: TAction;
AddTeamToLeague: TAction;
FindTeam: TAction;
DelTeam: TAction;
AddPlayerToTeam: TAction;
FindPlayer: TAction;
DelPlayerFromTeam: TAction;
TeamsBox: TListBox;
PlayersBox: TListBox;
LeagueName: TLabel;
Label2: TLabel;
Label3: TLabel;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
procedure ErrorMessage (cap,lab: string);
procedure RefreshPlayersBox;
procedure RefreshTeamsBox;
procedure RefreshEnables;
procedure FormCreate (Sender: TObject);
procedure NewLeagueExecute (Sender: TObject);
procedure EditLeagueExecute (Sender: TObject);
procedure DeleteLeagueExecute (Sender: TObject);
procedure OpenDataExecute (Sender: TObject);
procedure SaveDataExecute (Sender: TObject);
procedure ExitProgrammExecute (Sender: TObject);
procedure AddTeamToLeagueExecute (Sender: TObject);
procedure FindTeamExecute (Sender: TObject);
procedure DelTeamExecute (Sender: TObject);
procedure TeamsBoxClick (Sender: TObject);
procedure AddPlayerToTeamExecute (Sender: TObject);
procedure FindPlayerExecute (Sender: TObject);
procedure DelPlayerFromTeamExecute (Sender: TObject);
end;
var
MainForm: TMainForm;
implementation
uses League, Player, PlayerInfo, Team, Lab1Ed1But1, Error, Lab1But2,Lab3Ed2But2, Lab2Ed2But2;
var League1: TLeague;
{$R *. dfm}
procedure TMainForm. ErrorMessage (cap,lab: string); // процедура выводит сообщение об ошибке
begin
ErrorForm. Caption: =cap;
ErrorForm. ErrorMes. Caption: =lab;
ErrorForm. ShowModal;
end;
procedure TMainForm. RefreshPlayersBox;
var Temp: TPlayer;
begin
if TeamsBox. ItemIndex>=0 then
begin
PlayersBox. Clear;
Temp: =League1. GetTeam (League1. SearchTeam (TeamsBox. Items. Strings [TeamsBox. ItemIndex])). GetFirst. GetNext;
while Temp<>nil do
begin
PlayersBox. Items. Add (Temp. GetPlayerData. GetSurname+^I+IntToStr (Temp. GetPlayerData. GetNumber));
Temp: =Temp. GetNext;
end;
end;
end;
procedure TMainForm. RefreshTeamsBox;
var
i: integer;
Temp: TTeam;
begin
TeamsBox. Clear;
if League1. GetCount>0 then
for i: =1 to League1. GetCount do
begin
Temp: =League1. GetTeam (i);
TeamsBox. Items. Add (Temp. GetNameTeam);
end;
end;
procedure TMainForm. RefreshEnables;
begin
if League1=nil then
begin
MainForm. EditLeague. Enabled: =false;
MainForm. DeleteLeague. Enabled: =false;
MainForm. SaveData. Enabled: =false;
MainForm. AddTeamToLeague. Enabled: =false;
MainForm. FindTeam. Enabled: =false;
MainForm. DelTeam. Enabled: =false;
MainForm. AddPlayerToTeam. Enabled: =false;
MainForm. FindPlayer. Enabled: =false;
MainForm. DelPlayerFromTeam. Enabled: =false;
end
else
begin
MainForm. LeagueName. Caption: =League1. GetNameLeague;
MainForm. EditLeague. Enabled: =true;
MainForm. DeleteLeague. Enabled: =true;
MainForm. SaveData. Enabled: =true;
MainForm. AddTeamToLeague. Enabled: =true;
if League1. GetCount<>0 then
begin
MainForm. FindTeam. Enabled: =true;
MainForm. DelTeam. Enabled: =true;
MainForm. AddPlayerToTeam. Enabled: =true;
if TeamsBox. ItemIndex>=0 then
if League1. GetTeam (League1. SearchTeam (TeamsBox. Items. Strings [TeamsBox. ItemIndex])). GetCount<>0 then
begin
MainForm. FindPlayer. Enabled: =true;
MainForm. DelPlayerFromTeam. Enabled: =true;
end
else
begin
MainForm. FindPlayer. Enabled: =false;
MainForm. DelPlayerFromTeam. Enabled: =false;
end;
end
else
begin
MainForm. FindTeam. Enabled: =false;
MainForm. DelTeam. Enabled: =false;
MainForm. AddPlayerToTeam. Enabled: =false;
MainForm. FindPlayer. Enabled: =false;
MainForm. DelPlayerFromTeam. Enabled: =false;
end;
end;
end;
procedure TMainForm. FormCreate (Sender: TObject);
begin
RefreshEnables;
end;
// процедуры меню "Файл"
procedure TMainForm. NewLeagueExecute (Sender: TObject); // создание новой лиги
begin
Lab1Ed1But2Form. Caption: ='Создание лиги';
Lab1Ed1But2Form. Label1. Caption: ='Введите имя лиги';
Lab1Ed1But2Form. Edit1. Text: ='';
if (Lab1Ed1But2Form. ShowModal=mrOK) then
if Lab1Ed1But2Form. Edit1. Text<>'' then
begin
League1: =TLeague. Create (Lab1Ed1But2Form. Edit1. Text);
MainForm. LeagueName. Caption: =Lab1Ed1But2Form. Edit1. Text;
Lab1Ed1But2Form. Close;
end
else
MainForm. ErrorMessage ('Ошибка!!! ','Нельзя использовать пустое название');
RefreshEnables;
end;
procedure TMainForm. EditLeagueExecute (Sender: TObject); // переименование созданной ранее лиги
begin
Lab1Ed1But2Form. Caption: ='Редактирование лиги';
Lab1Ed1But2Form. Label1. Caption: ='Введите новое имя лиги';
Lab1Ed1But2Form. Edit1. Text: ='';
if (Lab1Ed1But2Form. ShowModal=mrOK) then
if Lab1Ed1But2Form. Edit1. Text<>'' then
begin
League1. SetNameLeague (Lab1Ed1But2Form. Edit1. Text);
MainForm. LeagueName. Caption: =Lab1Ed1But2Form. Edit1. Text;
Lab1Ed1But2Form. Close;
end
else
MainForm. ErrorMessage ('Ошибка!!! ','Нельзя использовать пустое название');
RefreshEnables;
end;
procedure TMainForm. DeleteLeagueExecute (Sender: TObject); // удаление ранее созданной лиги
begin
Lab1But2Form. Caption: ='Удаление лиги';
Lab1But2Form. Label1. Caption: ='Все несохраненные данные будут потеряны! '+#10#13+'Вы уверены, что хотите удалить созданную лигу? ';
if Lab1But2Form. ShowModal=mrYES then
begin
League1: =nil;
MainForm. LeagueName. Caption: ='Лига не создана. ';
TeamsBox. Clear;
PlayersBox. Clear;
end;
RefreshEnables;
end;
procedure TMainForm. OpenDataExecute (Sender: TObject); // процедура открытия ранее сохраненных данных
begin
if OpenDialog1. Execute then
begin
League1: =TLeague. Create ('Temp');
League1. Open (OpenDialog1. FileName);
MainForm. RefreshTeamsBox;
MainForm. PlayersBox. Clear;
RefreshEnables;
end;
end;
procedure TMainForm. SaveDataExecute (Sender: TObject); // процедура сохранения данных
begin
SaveDialog1. FileName: =League1. GetNameLeague;
if SaveDialog1. Execute then
League1. Save (SaveDialog1. FileName);
end;
procedure TMainForm. ExitProgrammExecute (Sender: TObject);
begin
Lab1But2Form. Caption: ='Выход';
Lab1But2Form. Label1. Caption: ='Все несохраненные данные будут потеряны! '+#10#13+'Вы уверены, что хотите выйти из программы? ';
if Lab1But2Form. ShowModal=mrYES then
MainForm. Close;
end;
procedure TMainForm. TeamsBoxClick (Sender: TObject); // обновляет список игроков, при изменении выбора команды
begin
MainForm. RefreshPlayersBox;
RefreshEnables;
end;
// процедуры меню "Правка"
// процедуры работы с командой
procedure TMainForm. AddTeamToLeagueExecute (Sender: TObject); // процедура добавлении команды
begin
if League1. GetCount=0 then
begin
Lab1Ed1But2Form. Caption: ='Добавление команды';
Lab1Ed1But2Form. Label1. Caption: ='Введите название команды';
Lab1Ed1But2Form. Edit1. Text: ='';
if (Lab1Ed1But2Form. ShowModal=mrOK) then
if Lab1Ed1But2Form. Edit1. Text<>'' then
begin
League1. AddTeam (Lab1Ed1But2Form. Edit1. Text,Lab1Ed1But2Form. Edit1. Text);
MainForm. TeamsBox. Items. Add (Lab1Ed1But2Form. Edit1. Text);
Lab1Ed1But2Form. Close;
MainForm. RefreshTeamsBox;
end
else
MainForm. ErrorMessage ('Ошибка!!! ','Нельзя использовать пустое название');
end
else
begin
Lab2Ed2But2Form. Caption: ='Добавление команды';
Lab2Ed2But2Form. Label1. Caption: ='Введите название команды';
Lab2Ed2But2Form. Edit1. Text: ='';
Lab2Ed2But2Form. Label2. Caption: ='Введите название предыдущей команды';
if TeamsBox. ItemIndex>=0 then
Lab2Ed2But2Form. Edit2. Text: =TeamsBox. Items. Strings [TeamsBox. ItemIndex]
else
Lab2Ed2But2Form. Edit2. Text: ='';
if (Lab2Ed2But2Form. ShowModal=mrOK) then
if (Lab2Ed2But2Form. Edit1. Text<>'') and (Lab2Ed2But2Form. Edit2. Text<>'') then
begin
League1. AddTeam (Lab2Ed2But2Form. Edit1. Text,Lab2Ed2But2Form. Edit2. Text);
MainForm. TeamsBox. Items. Add (Lab2Ed2But2Form. Edit1. Text);
Lab2Ed2But2Form. Close;
MainForm. RefreshTeamsBox;
end
else
MainForm. ErrorMessage ('Ошибка!!! ','Нельзя использовать пустое название');
end;
RefreshEnables;
end;
procedure TMainForm. FindTeamExecute (Sender: TObject); // процедура поиска команды
var i: integer;
begin
Lab1Ed1But2Form. Caption: ='Поиск команды';
Lab1Ed1But2Form. Label1. Caption: ='Введите название команды';
Lab1Ed1But2Form. Edit1. Text: ='';
TeamsBox. ItemIndex: =-1;
if (Lab1Ed1But2Form. ShowModal=mrOK) then
if Lab1Ed1But2Form. Edit1. Text<>'' then
begin
if League1. SearchTeam (Lab1Ed1But2Form. Edit1. Text) <>0 then
for i: =0 to TeamsBox. Count-1 do
if TeamsBox. Items. Strings [i] =Lab1Ed1But2Form. Edit1. Text then
begin
TeamsBox. ItemIndex: =i;
break;
end;
Lab1Ed1But2Form. Close;
MainForm. RefreshPlayersBox;
end
else
MainForm. ErrorMessage ('Ошибка!!! ','Нельзя использовать пустое название');
end;
procedure TMainForm. DelTeamExecute (Sender: TObject); // процедура удаления команды
var i: integer;
begin
Lab1Ed1But2Form. Caption: ='Удаление команды';
Lab1Ed1But2Form. Label1. Caption: ='Введите название удаляемой команды';
if TeamsBox. ItemIndex>=0 then
Lab1Ed1But2Form. Edit1. Text: =TeamsBox. Items. Strings [TeamsBox. ItemIndex]
else
Lab1Ed1But2Form. Edit1. Text: ='';
TeamsBox. ItemIndex: =-1;
if (Lab1Ed1But2Form. ShowModal=mrOK) then
if Lab1Ed1But2Form. Edit1. Text<>'' then
begin
if League1. DeleteTeam (Lab1Ed1But2Form. Edit1. Text) then
for i: =0 to TeamsBox. Count-1 do
if TeamsBox. Items. Strings [i] =Lab1Ed1But2Form. Edit1. Text then
begin
TeamsBox. Items. Delete (i);
break;
end;
Lab1Ed1But2Form. Close;
MainForm. RefreshTeamsBox;
MainForm. RefreshPlayersBox;
end
else
MainForm. ErrorMessage ('Ошибка!!! ','Нельзя использовать пустое название');
RefreshEnables;
end;
// процедуры работы с игроками
procedure TMainForm. AddPlayerToTeamExecute (Sender: TObject); // процедура добавления игрока
begin
if TeamsBox. ItemIndex>=0 then
begin
Lab3Ed2But2Form. Caption: ='Добавление игрока';
Lab3Ed2But2Form. Label1. Caption: ='Введите данные игрока';
Lab3Ed2But2Form. Edit1. Text: ='';
Lab3Ed2But2Form. MaskEdit1. Text: ='';
if (Lab3Ed2But2Form. ShowModal=mrOK) then
if (Lab3Ed2But2Form. Edit1. Text<>'') and (Lab3Ed2But2Form. MaskEdit1. Text<>' ') then
begin
League1. GetTeam (League1. SearchTeam (TeamsBox. Items. Strings [TeamsBox. ItemIndex])). AddPlayer (Lab3Ed2But2Form. Edit1. Text,StrToInt (Trim (Lab3Ed2But2Form. MaskEdit1. Text)));
Lab3Ed2But2Form. Close;
MainForm. RefreshPlayersBox;
end
else
MainForm. ErrorMessage ('Ошибка!!! ','Нельзя использовать пустое название');
end
else
MainForm. ErrorMessage ('Ошибка!!! ','Выберите команду из списка');
RefreshEnables;
end;
procedure TMainForm. FindPlayerExecute (Sender: TObject); // процедура поиска игрока
var
i: integer;
TempSN,TempNM: TPlayerInfo;
begin
if TeamsBox. ItemIndex>=0 then
begin
Lab3Ed2But2Form. Caption: ='Поиск игрока';
Lab3Ed2But2Form. Label1. Caption: ='Введите данные игрока';
Lab3Ed2But2Form. Edit1. Text: ='';
Lab3Ed2But2Form. MaskEdit1. Text: ='';
PlayersBox. ItemIndex: =-1;
if (Lab3Ed2But2Form. ShowModal=mrOK) then
if (Lab3Ed2But2Form. Edit1. Text<>'') and (Lab3Ed2But2Form. MaskEdit1. Text<>' ') then
begin
TempSN: =League1. GetTeam (League1. SearchTeam (TeamsBox. Items. Strings [TeamsBox. ItemIndex])). SearchPlayer (Lab3Ed2But2Form. Edit1. Text);
TempNM: =League1. GetTeam (League1. SearchTeam (TeamsBox. Items. Strings [TeamsBox. ItemIndex])). SearchPlayer (StrToInt (Trim (Lab3Ed2But2Form. MaskEdit1. Text)));
if TempSN=TempNM then
for i: =0 to PlayersBox. Count-1 do
if PlayersBox. Items. Strings [i] =TempSN. GetSurname+^I+IntToStr (TempNM. GetNumber) then
begin
PlayersBox. ItemIndex: =i;
break;
end;
Lab3Ed2But2Form. Close;
end
else
MainForm. ErrorMessage ('Ошибка!!! ','Нельзя использовать пустое название');
end
else
MainForm. ErrorMessage ('Ошибка!!! ','Выберите команду из списка');
end;
procedure TMainForm. DelPlayerFromTeamExecute (Sender: TObject); // процедура удаления игрока
begin
if TeamsBox. ItemIndex>=0 then
begin
Lab1But2Form. Caption: ='Удаление игрока';
Lab1But2Form. Label1. Caption: ='Вы уверены, что хотите удалить игрока? ';
if (Lab1But2Form. ShowModal=mrYES) then
begin
League1. GetTeam (League1. SearchTeam (TeamsBox. Items. Strings [TeamsBox. ItemIndex])). DeletePlayer;
Lab3Ed2But2Form. Close;
MainForm. RefreshPlayersBox;
end
end
else
MainForm. ErrorMessage ('Ошибка!!! ','Выберите команду из списка');
RefreshEnables;
end;
end.
Модуль Error
unit Error;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TErrorForm = class (TForm)
ErrorMes: TLabel;
OKButton: TButton;
procedure OKButtonClick (Sender: TObject);
end;
var
ErrorForm: TErrorForm;
implementation
{$R *. dfm}
procedure TErrorForm. OKButtonClick (Sender: TObject);
begin
ErrorForm. Close;
end;
end.
Модуль Lab1But2
unit Lab1But2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Main;
type
TLab1But2Form = class (TForm)
Label1: TLabel;
YesButton: TButton;
NoButton: TButton;
end;
var
Lab1But2Form: TLab1But2Form;
implementation
{$R *. dfm}
end.
Модуль Lab1Ed1But1
unit Lab1Ed1But1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Main;
type
TLab1Ed1But2Form = class (TForm)
Label1: TLabel;
Edit1: TEdit;
OKButton: TButton;
CancelButton: TButton;
end;
var
Lab1Ed1But2Form: TLab1Ed1But2Form;
implementation
{$R *. dfm}
end.
Модуль Lab2Ed2But2
unit Lab2Ed2But2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Main;
type
TLab2Ed2But2Form = class (TForm)
Label1: TLabel;
Edit1: TEdit;
OKButton: TButton;
CancelButton: TButton;
Label2: TLabel;
Edit2: TEdit;
end;
var
Lab2Ed2But2Form: TLab2Ed2But2Form;
implementation
{$R *. dfm}
end.
Модуль Lab3Ed2But2
unit Lab3Ed2But2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Mask, StdCtrls, Main;
type
TLab3Ed2But2Form = class (TForm)
Label1: TLabel;
Edit1: TEdit;
OKButton: TButton;
CancelButton: TButton;
Label2: TLabel;
Label3: TLabel;
MaskEdit1: TMaskEdit;
end;
var
Lab3Ed2But2Form: TLab3Ed2But2Form;
implementation
{$R *. dfm}
end.
Вывод
Список - это набор однотипных элементов, в котором каждый элемент имеет указатель на следующий за ним элемент (в двухсвязных списках элементы списка указывают еще и на предыдущий элемент). Отличие списков от очередей и стеков состоит в том, что в список элементы добавляются в любое заданное место и удаляются тоже из любого места списка.
Существуют разные способы реализации списка. Рассмотрим статическую реализацию списка. Идея этого способа состоит в том, что номер ячейки массива, в которой хранится элемент списка, равен логическому номеру этого элемента. Преимуществом данного метода является то, что все элементы списка находятся в памяти друг за другом в логическом порядке. Недостатком этого метода является то, что при добавлении или удалении элемента из списка, приходится сдвигать некоторую часть списка, что, при большом количестве полей в списке, сильно замедляет работу. Компромиссным решением является хранение в массиве вместо элементов списка, указатели на эти элементы.
Основные операции со списком: добавление элемента перед или после заданного элемента, поиск элемента и удаление элемента. В некоторой целочисленной переменной содержится количество введенных элементов.
Список литературы
1. Культин, Н.Б. "Программирование в Turbo Pascal 7.0 и Delphi" / Н.Б. Культин - СПб.: БХВ-Петербург, 2007. - 400 с.
2. Кнут, Д.Э. "Искусство программирования" / Д.Э. Кнут - Вильямс, 2000. - 682 с.
3. Бакнелл, Дж. Фундаментальные алгоритмы и структуры данных в Delphi / Дж. Бакнелл - Diasoft, 2003. - 557 с.
4. Вирт, Н. Алгоритмы и структуры данных / Н. Вирт - Мир, 1989. - 360 с.
5. Фленов, М.Е. "Библия Delphi" / М.Е. Фленов - СПб.: БХВ-Петербург, 2007. - 880 с.
6. Кормен, Т. Алгоритмы: построение и анализ / Т. Кормен, Ч. Лейзерсон, Р. Ривест; Вильямс, 2007. - 1296 с.
Размещено на Allbest.ru
Подобные документы
Теоретическое описание линейного списка с алгоритмами реализации основных операций. Понятия, механизмы объектно-ориентированного программирования. Возможности проектируемого контейнера пользователей, его реализация на основе линейного списка с заголовком.
курсовая работа [475,2 K], добавлен 26.02.2015Основные понятия объектно-ориентированного программирования, особенности описания функций и классов. Разработка программы для работы с универсальной очередью установленного типа, добавления и удаления ее элементов и вывода содержимого очереди на экран.
курсовая работа [187,2 K], добавлен 27.08.2012Особенности реализации главных элементов разрабатываемой программы (цифровые элементы) с помощью объектно-ориентированного подхода. Применение принципа инкапсуляции для защиты данных. Конструирование классов, описание и тестирование программного продукта.
курсовая работа [2,3 M], добавлен 10.05.2015Общая характеристика объектно-ориентированного подхода в программировании, его основные свойства и принципы. Разработка программы для автоматизация деятельности кафе на основе объектно-ориентированного подхода, проектирования и реализации схемы данных.
курсовая работа [1,2 M], добавлен 22.01.2012Разработка набора взаимосвязанных классов для реализации Hash-поиска как специализированного контейнера. Поиск с использованием Хэш-функций. Объектная технология. Описание пользовательского интерфейса. Листинг и описание всех классов библиотеки на DP.
курсовая работа [231,2 K], добавлен 15.10.2008Понятие объектно-ориентированного программирования, характеристика используемых языков. Практическая разработка средств объектно-ориентированного программирования в задачах защиты информации: программная реализация на языке С++, а также Turbo Pascal.
курсовая работа [275,9 K], добавлен 22.12.2011Исследование принципов объектно-ориентированного программирования на базе языка программирования С++. Разработка программного комплекса для ведения учёта памятников города. Описание процессов сортировки, поиска, формирования статистики по памятникам.
курсовая работа [782,4 K], добавлен 26.05.2014Анализ предметной области "Конкурс поэтов" на основе объектно-ориентированного подхода. Разработка оконного приложения и описание информационной модели предметной области. Описание разработанных процедур С++ и результатов тестирования приложения.
курсовая работа [355,9 K], добавлен 18.06.2013Особенности разработки приложений для операционной системы с помощью императивного, структурированного, объектно-ориентированного языка программирования Delphi. Формальное начало программы. Выделение конца программного блока. Листинг и описание программы.
курсовая работа [1,2 M], добавлен 04.08.2014Порядок проектирования программы, демонстрирующей принцип заполнения очереди и стека и принцип удаления элементов из очереди и стека. Определение класса и всех необходимых функций. Программа на языке С, описание возможностей, используемых для алгоритма.
курсовая работа [254,3 K], добавлен 20.05.2013