Реализация специализированного контейнера на базе списка на основе массива со сдвигом элементов и очереди на основе адресных указателей

Описание используемых понятий и механизмов объектно-ориентированного программирования. Разработка и описание необходимых классов. Демонстрационный модуль с кратким описанием использованных стандартных компонентов. Внешний вид и листинг программы.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 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


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.