Программная реализация курьерского заказа

 

СОДЕРЖАНИЕ


Введение

1. Аналитический обзор литературы

1.1 Динамические структуры

1.2 Постановка задачи

2. Разработка алгоритма

3. Разработка программного средства

4. Руководство пользователя

Список литературы

Приложение



ВВЕДЕНИЕ


В современном обществе курьерские услуги перестали быть роскошью, превратившись в суровую необходимость. При нынешнем темпе жизни все чаще возникают ситуации, когда важные документы или товары требуется срочно переправить в другой город или даже страну. Но у современных курьерских служб огромное количество времени уходит на распределение заказов между курьерами. В данной работе я постаралась создать программное средство, способное помочь курьерским службам экономить свое время на действия такого характера.

На добавление курьеру конкретного заказа может влиять огромное количество различных факторов. Так в своей работе я выделила следующие причины их распределения:

·Время доставки заказа и время работы курьера;

·Объем заказа и максимальный объем, который может доставить курьер;

·Вес заказа и грузоподъемность автомобиля курьера;

Соответственно, исходя из заданных параметров, будут формироваться два списка: список курьеров и для каждого из них список заказов. Данная работа посвящена программной реализации такой структуры на языке Delphi.

В работе задействованы динамические списки записей и типизированные файлы. Так же организован удобный пользовательский интерфейс для просмотра и редактирования информации. Этому способствовали методы, используемые средой разработки Delphi7.

список программный пользовательский интерфейс


1. АНАЛИТИЧЕСКИЙ ОБЗОР ЛИТЕРАТУРЫ


1.1 Динамические структуры данных


Динамические структуры данных - данные, размер которых может меняться во время работы программы.

Обычно переменная хранит некоторые данные. Однако помимо обычных, существуют переменные, которые ссылаются на другие переменные. Такие переменные называются указателями. Указатель - это переменная, значением которой является адрес другой переменной или структуры данных. Графически указатель может быть изображен так, как на рисунке 1.


Рисунок 1. Переменная-указатель


Указатель, как и любая другая переменная программы, должна быть объявлена в разделе объявления. В общем виде объявление указателя выглядит следующим образом: Имя: ^ Тип;

где: имя - имя переменной-указателя; Тип - тип переменной, на которую указывает переменная-указатель; ^ - объявляемая переменная является указателем.

Примеры объявления указателей: p1: ^integer; р2: ^real;- это указатель на переменную типа integer, a p2 - указатель на переменную типа real.

Тип переменной, на которую ссылается указатель, называют типом указателя. Например, если в программе объявлен указатель р: ^integer, то говорят: ^р - "указатель целого типа" или "р - это указатель на целое".

В начале работы программы переменная-указатель "ни на что не указывает". В этом случае говорят, что значение указателя равно NIL. Зарезервированное слово NIL соответствует значению указателя, который ни на что не указывает.

Идентификатор NIL можно использовать в инструкциях присваивания и в условиях. Например, если переменные p1 и р2 объявлены как указатели, то инструкция p1 := NIL;

устанавливает значение переменной, а инструкция if р2 = NIL then ShowMessage('Указатель р2 не инициализирован!');

проверяет, инициализирован ли указатель р2.

Указателю можно присвоить значение - адрес переменной соответствующего типа (в тексте программы адрес переменной - это имя переменной, перед которым стоит оператор @). Ниже приведена инструкция, после выполнения которой переменная р будет содержать адрес переменной n, р := @n;

Помимо адреса переменной, указателю можно присвоить значение другого указателя при условии, что они являются указателями на переменную одного типа. Например, если переменные p1 и р2 являются указателями типа integer, то в результате выполнения инструкции: p2 := p1;

Указатель можно использовать для доступа к переменной, адрес которой содержит указатель. Например, если р указывает на переменную i, то в результате выполнения инструкции: р^ : = 5;

значение переменной i будет равно пяти. В приведенном примере значок ^ показывает, что значение пять присваивается переменной, на которую указывает переменная-указатель.

Динамической переменной называется переменная, память для которой выделяется во время работы программы.

Выделение памяти для динамической переменной осуществляется вызовом процедуры new. У процедуры new один параметр - указатель на переменную того типа, память для которой надо выделить. Например, если р является указателем на тип real, то в результате выполнения процедуры new(p); будет выделена память для переменной типа real (создана переменная типа real), и переменная-указатель р будет содержать адрес памяти, выделенной для этой переменной.

У динамической переменной нет имени, поэтому обратиться к ней можно только при помощи указателя.

Процедура, использующая динамические переменные, перед завершением своей работы должна освободить занимаемую этими переменными память или, как говорят программисты, "уничтожить динамические переменные". Для освобождения памяти, занимаемой динамической переменной, используется процедура Dispose, которая имеет один параметр - указатель на динамическую переменную.

Например, если р - указатель на динамическую переменную, память для которой выделена инструкцией new(p), то инструкция dispose (р) освобождает занимаемую динамической переменной память.

Создание, использование и уничтожение динамических переменных

p1,p2,p3:^ Integer; // указатели на переменные типа integer

// создание динамических переменных типа integer

// выделение памяти для динамических переменных

New(p1);

New(p2);(p3);

р1^ := 5;

р2^ := 3;

р3^ := р1^ + р2^;('Суммачиселравна ' + IntToStr(р3^));

// уничтожение динамических переменных, освобождение памяти

Dispose(p1);

Dispose(р2);(р3);;


В начале работы процедура создает три динамические переменные. Две переменные, на которые указывают p1 и р2, получают значение в результате выполнения инструкции присваивания. Значение третьей переменной вычисляется как сумма первых двух.

Списки

Указатели и динамические переменные позволяют создавать сложные динамические структуры данных, такие как списки и деревья.

Список можно изобразить графически, как показано на рисунке 2.


Рисунок 2. Графическое изображение списка.


Каждый элемент списка (узел) представляет собой запись, состоящую из двух частей. Первая часть - информационная. Вторая часть отвечает за связь со следующим и, возможно, с предыдущим элементом списка. Список, в котором обеспечивается связь только со следующим элементом, называется односвязным.

Для того чтобы программа могла использовать список, надо определить тип компонентов списка и переменную-указатель на первый элемент списка. Ниже приведен пример объявления компонента списка студентов:


type= ^TStudent; // указатель на переменную типа TStudent

// описание типа элемента списка= record

FIO: string[60]; // фамилия: integer; // номергруппы: string[60]; // домашний адрес: TPStudent; // указатель на следующий элемент списка;head: TPStudent; // указатель на первый элемент списка


Добавлять данные можно в начало, в конец или в нужное место списка. Во всех этих случаях необходимо корректировать указатели. На рисунке 3 изображен процесс добавления элементов в начало списка.

Добавление элемента в начало динамического списка

=^TStudent; // указательнатип TStudent= record_name:string[20]; // фамилия_name: string[20]; // имя: TPStudent; // следующийэлементсписка

end;head: TPStudent; // начало (голова) списка, добавить элемент в начало списка

procedure add;: TPStudent; // новыйэлементсписка

begin(curr); // выделить память для элемента списка

curr^.f_name := Сидоров;^. l _ name := Иван;

// добавление в начало списка

curr^.next := head; head := curr;

end;


Рисунок 3. Добавление элементов в список


Вывод целого списка:


var: TPStudent; // текущий элемент списка:integer; // длина (кол-во элементов) списка:string; // строковое представление списка:= 0; st := '';:= head; // указатель на первый элемент списка

while curr <> NIL do begin:= n + 1;:= st + curr^.f_name + ' ' + curr^.1_name+#13; := curr^.next; // указатель на следующий элемент;


Добавление элемента в список выполняет процедура add, которая создает динамическую переменную-запись, присваивает ее полям значения, соответствующие содержимому полей ввода диалогового окна, и корректирует значение указателя head.

Удаление элемента из списка

Для того чтобы удалить узел, необходимо скорректировать значение указателя узла, который находится перед удаляемым узлом (рисунок 4).


Рисунок 4. Удаление элемента из списка.


Поскольку узел является динамической переменной, то после исключения узла из списка занимаемая им память должна быть освобождена. Освобождение динамической памяти, или, как иногда говорят, "уничтожение переменной", выполняется вызовом процедуры dispose. У процедуры dispose один параметр - указатель на динамическую переменную. Память, занимаемая этой динамической переменной, должна быть освобождена. Для примера:



Var р: ^integer;

begin

new(p);

{ инструкции программы }(p);


.2 Постановка задачи


Разработать программное средство, которое имеет список заказов на покупку товаров на следующие сутки. Каждая запись списка содержит: номер заказа, адрес доставки, время доставки (от… ,до …), объем заказа в м3, вес в кг. Также имеется список курьеров. Каждая запись списка содержит: номер курьера, ФИО курьера, время работы (от… ,до …), грузоподъемность автомобиля, max объем груза за одну перевозку. Требуется:

·Наиболее эффективно распределить заказы между курьерами;

·Выдать список всех заказов курьера;

·Предусмотреть возможность добавлять, удалять и корректировать записи из списков, а так же просматривать списки полностью



2. РАЗРАБОТКА АЛГОРИТМА


При разработке представленной программы значительное внимание было уделено интерфейсу. Чтобы предоставить пользователю возможность быстрого доступа к данным и комфортного их использования, в программе было задействовано минимальное количество элементов, на которые и возложено все управление программой. В частности такими элементами является таблица ListZakStringGrid, в которую выводится список существующих заказов и информация о них, текстовая область MemoCour, которая используется для вывода заказов текущего курьера, списки FIOCourListBox, OtTimeCourListBox, DoTimeCourListBox, WeightCourListBox и VolumeCourListBox для вывода данных о курьере и панели с несколькими кнопками: кнопки добавления, редактирования и удаления. Все это позволило сделать программу очень наглядной и простой, не в ущерб ее функциональности.

Условно программу можно разделить на 3 этапа:

) Первый этап заключается в загрузке в таблицу и списки из файлов данных о курьерах и заказах, если таковые имеются.

) В качестве второго этапа можно принять этап распределения заказов между курьерами.

) На третьем этапе, этапе завершения, происходит сохранение данных обратно в текстовые файлы.

Работу процедуры сохранения данных в файл отображает рисунок 4.1.





. РАЗРАБОТКА ПРОГРАММНОГО СРЕДСТВА


Для работы с информацией, полученной из текстовых файлов, используются односвязные списки, такие как списки заказов и курьеров.

В записи zakaz определены следующие поля, содержащие данные о заказе:

-name:string; - название товара;

number:integer; - номер товара;

adress:string; - адрес доставки заказа;

-othour:time; - с какого времени осуществляется доставка;

-dohour:time; - до какого времени необходимо доставить заказ;

-ves:integer; - вес товара;

volume:integer; - объем товара;

next:Tzakaz; - указатель на следующий элемент списка;

-addToCour:boolean; - логический элемент, отображающий добавление заказа какому-либо курьеру;

В записи courier определены следующие поля, характеризующие курьера:

-number:integer; - номер курьера;

fiocour:string; - ФИО курьера;

ottime:time; - с какого времени работает курьер;

-dotime:time; - до которого времени работает курьер;

-Volume:integer; - максимальный объем заказа, перевозимого курьером;

-weight:integer; - грузоподъемность автомобиля курьера;

-next:Tcourier; - указатель на следующий элемент списка;

-NowWeight:integer; - текущий вес заказов, добавленных курьеру;

NowVolume:integer; - текущий объем, добавленный курьеру;

PointZak:TCurZakaz; - указатель на список заказов данного курьера;

Поле PointZak записи courier содержит следующие поля:

zak:Tzakaz; - указатель заказ данного курьера;

next:TCurZakaz; - указатель на следующий элемент списка;

В программе используются следующие переменные:, listCour - указатели на начало списков курьеров и заказов;, current, prev - указатели для работы со списками

Все остальные переменные являются вспомогательными или производными от выше изложеных.

В таблице 1 приведены основные процедуры и функции, используемые в программе.


Таблица 1 "Основные процедуры и функции"

ПодпрограммаНазначениеTMainWind.FormCreate(Sender: TObject);Считывание данных с файлов, создание списков курьеров и заказов.TMainWind.AddZakButtonClick(Sender: TObject);Добавление нового заказа.TMainWind.AddCourButtonClick;Добавление нового курьера.TMainWind.FormClose;Сохранение данных в файлы.TMainWind.DisplayCourList;Вывод списка курьеров в форму.TMainWind.DisplayZakList;Вывод списка заказов в таблицу.TMainWind.GetCourierByIndex;Нахождение записи выделенного курьера.TMainWind.FIOCourListBoxClickВывод в форму всех заказов курьера.TMainWind.AddZakazToCur(zak:TZakaz):boolean;Распределение заказов по курьерам.TMainWind.ChangeCourButtonClick(Sender: TObject);Редактирование записи курьера.TMainWind.DeleteCourButtonClick(Sender: TObject);Удаление записи курьера.TMainWind.ChangeZakButtonClick(Sender: TObject);Редактирование записи заказа.TMainWind.DeleteZakButtonClick(Sender: TObject);Удаление заказа.


4. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ


При запуске программы пользователь увидит окно с управляющими элементами (кнопками), таблицей и несколькими списками (рисунок 5.1).


Рисунок 5.1


Перемещение между кнопками осуществляется курсором. Выбор конкретной функции происходит по нажатию на кнопку.

Для добавления заказа необходимо нажать на пункт Добавление, после чего в появившемся окне (Рисунок 5.2.) ввести нужную информацию и нажать кнопку подтверждения. Далее произойдет добавление новой записи и ее распределение курьеру. После нажатия кнопки Сохранить окно автоматически закроется.

Таким же методом происходит и добавление нового курьера. После сохранения результата данные о нем выводятся в список формы.

При редактировании вызываются формы такого же типа, что и при добавление курьера/заказа. После подтверждения выполнения данные сохраняются в новом виде.


Рисунок 5.2.


Удаление. Для того, чтобы удалить нужный элемент, предварительно выделяется нужное поле, а затем по нажатию кнопки удалить происходит перезапись существующих форм.

Выход из программы. Для осуществления выхода из программы достаточно закрыть окно главной формы.

Прочее. Для корректной работы программного средства в папке с программой должны находиться файлы courierи zakaz с символьным представлением данных записей.



СПИСОК ЛИТЕРАТУРЫ


1.Бобровский, С.И., Delphi 7. Учебный курс. - СПб.: Питер, 2004.- 736с.

.Фаронов, В.В. Турбо Паскаль 7.0. Начальный курс. Учебное пособие / В.В.Фаронов. М. : Издательство "ОМД групп", 2003. - 616с.

.Глухова Л. А., ФадееваЕ.П., ФадееваЕ.Е. Основы алгоритмизации программирования: Лаб. Практикум для студ. спец. I-40 01 01 "Программное обеспечение информационных технологий" дневной формы обуч. В 4 ч. Ч.2. -Мн.: БГУИР, 2005.



ПРИЛОЖЕНИЕ


ТЕКСТ ПРОГРАММЫ


unit MainWindowUnit;, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, ExtCtrls, NewOrderUnit, GlobalTypes, NewCourierUnit,, Grids, EditZakUnit;= class(TForm): TGroupBox;: TGroupBox;: TGroupBox;: TButton;: TButton;: TButton;: TButton;: TButton;: TButton;: TMemo;: TListBox;: TListBox;: TListBox;: TListBox;: TListBox;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TStringGrid;AddZakButtonClick(Sender: TObject);AddCourButtonClick(Sender: TObject);FormClose(Sender: TObject; var Action: TCloseAction);FormCreate(Sender: TObject);DisplayCourList;DisplayZakList;Number;NumberZak;FIOCourListBoxClick(Sender: TObject);OtTimeCourListBoxClick(Sender: TObject);DoTimeCourListBoxClick(Sender: TObject);VolumeCourListBoxClick(Sender: TObject);WeightCourListBoxClick(Sender: TObject);AddZakazToCur(zak:TZakaz):boolean;GetCourierByIndex(index:integer;var prevCour:Tcourier):TCourier;ChangeCourButtonClick(Sender: TObject);DeleteCourButtonClick(Sender: TObject);ChangeZakButtonClick(Sender: TObject);DeleteZakButtonClick(Sender: TObject);

{ Private declarations }

{ Public declarations };: TMainWind;:zakaz;:courier;:Tzakaz;:TCourier;

{$R *.dfm}

{Добавление нового заказа}TMainWind.AddZakButtonClick(Sender: TObject);,current,prev:Tzakaz;:integer;.ShowModal;(NewOrderUnit.ifAddButClick=true) then:=NewOrderUnit.newZak;.addToCour:=false;(temp);ListZak=nil then:=temp;.number:=1;.next:=nil;:=1;:=ListZak;current<>nil docurrent.dohour.hour>temp.dohour.hour thencurrent.dohour.hour=temp.dohour.hour thencurrent.dohour.min>=temp.dohour.min then;:=current;:=current.next;(i);;i=1 then.next:=listZak;:=temp;.next:=current;.next:=temp;;;;;;;

{Добавление нового курьера}TMainWind.AddCourButtonClick(Sender: TObject);,CurrCour,PrevCour:TCourier;:integer;.ShowModal;(NewCourierUnit.ifAddButClick=true) then:=NewCourierUnit.NewCour;ListCour=nil then:=tempCour;.number:=1;.next:=nil;:=1;:=ListCour;currCour<>nil docurrCour.dotime.hour>tempCour.dotime.hour thencurrCour.dotime.hour=tempCour.dotime.hour thencurrCour.dotime.min>=tempCour.dotime.min then;:=currCour;:=currCour.next;(j);;j=1 then.next:=ListCour;:=tempCour;.next:=currCour;.next:=tempCour;;;;;;;

{Сохранение данных в файл}TMainWind.FormClose(Sender: TObject; var Action: TCloseAction);:textfile;:Tzakaz;:TCourier;(f1,'zakaz.txt');(f1);:=listZak;currZak<>nil do(f1,currZak.number);(f1,currZak.name);(f1,currZak.adress);(f1,currZak.othour.hour);(f1,currZak.othour.min);(f1,currZak.dohour.hour);(f1,currZak.dohour.min);(f1,currZak.volume);(f1,currZak.ves);:=currZak.next;;(f1);(f1,'courier.txt');(f1);:=listCour;currCur<>nil do(f1,currCur.number);(f1,currCur.fiocour);(f1,currCur.ottime.hour);(f1,currCur.ottime.min);(f1,currCur.dotime.hour);(f1,currCur.dotime.min);(f1,currCur.volume);(f1,currCur.weight);:=currCur.next;;(f1);;

{Считывание данных при открытии}TMainWind.FormCreate(Sender: TObject);:textfile;,prevZak:Tzakaz;,prevCur:TCourier;(f1,'zakaz.txt');(f1);:=nil;not eof(f1) do(currZak);(f1,currZak.number);(f1,currZak.name);(f1,currZak.adress);(f1,currZak.othour.hour);(f1,currZak.othour.min);(f1,currZak.dohour.hour);(f1,currZak.dohour.min);(f1,currZak.volume);(f1,currZak.ves);.addToCour:=false;(prevzak=nil) then:=currZak.next:=currZak;:=currZak;;(prevZak<>nil) then.next:=nil;(f1);;;(f1,'courier.txt');(f1);:=nil;not eof(f1) do(currCur);(f1,currCur.number);(f1,currCur.fiocour);(f1,currCur.ottime.hour);(f1,currCur.ottime.min);(f1,currCur.dotime.hour);(f1,currCur.dotime.min);(f1,currCur.volume);(f1,currCur.weight);.NowWeight:=0;.NowVolume:=0;.PointZak:=nil;(prevCur=nil) then:=currCur.next:=currCur;:=currCur;;(prevCur<>nil) then.next:=nil;(f1);:=listZak;(currZak<>nil) do(currZak);:=currZak.next;;;;;

{Вывод списка курьеров в форму}

procedure TMainWind.DisplayCourList;:TCourier;.Clear;.Clear;.Clear;.Clear;.Clear;:=ListCour;CurrCourList<>nil do.Items.Add(IntToStr(CurrCourList.number)+')'+CurrCourList.fiocour);.Items.Add('Hour:'+IntToStr(CurrCourList.ottime.hour)+' Min:'+IntToStr(CurrCourList.ottime.min));.Items.Add('Hour:'+IntToStr(CurrCourList.dotime.hour)+' Min:'+IntToStr(CurrCourList.dotime.min));.Items.Add(IntToStr(CurrCourList.Volume));.Items.Add(IntToStr(CurrCourList.Weight));:=CurrCourList.next;;;

//вывод списка заказов в таблицу//

Procedure TMainWind.DisplayZakList;:TZakaz;:integer;i:=0 to ListZakStringGrid.RowCount-1 do.Rows[i].Clear;ListZakStringGrid do[0,0]:='¹';[1,0]:='Èìÿ';[2,0]:='àäðåñ';[3,0]:='âðåìÿ ';[4,0]:='äîñòàâêè ñ:';[5,0]:='äî:';[7,0]:='âåñ';[8,0]:='îáúåì';;:=ListZak;currZak<>nil doListZakStringGrid do[0,currZak.number]:=IntToStr(currZak.number);[1,currZak.number]:=currZak.name;[2,currZak.number]:=currZak.adress;[3,currZak.number]:=IntToStr(currZak.othour.hour);[4,currZak.number]:=IntToStr(currZak.othour.min);[5,currZak.number]:=IntToStr(currZak.dohour.hour);[6,currZak.number]:=IntToStr(currZak.dohour.min);[7,currZak.number]:=IntToStr(currZak.ves);[8,currZak.number]:=IntToStr(currZak.volume);;:=currZak.next;;;

{Присваивание номеров курьерам}TMainWind.Number;:Tcourier;:integer;:=1;:=ListCour;CurrCourList<>nil do.number:=i;:=CurrCourList.next;(i);;;

{Присваивание номеров заказам}TMainWind.NumberZak;:TZakaz;:integer;:=1;:=ListZak;CurrZakList<>nil do.number:=i;:=CurrZakList.next;(i);;;TMainWind.FIOCourListBoxClick(Sender: TObject);:TCurZakaz;:Tcourier;FIOCourListBox.ItemIndex>=0 then.ItemIndex:=FIOCourListBox.ItemIndex;.ItemIndex:=FIOCourListBox.ItemIndex;.ItemIndex:=FIOCourListBox.ItemIndex;.ItemIndex:=FIOCourListBox.ItemIndex;.Clear;:=GetCourierByIndex(FIOCourListBox.ItemIndex,prev).PointZak;(curZak<>nil)do.Lines.Add(curZak.zak.name+' '+curZak.zak.adress+' ñ:'+IntToStr(curZak.zak.othour.hour)+'.'+IntToStr(curZak.zak.othour.min)+' äî:'+IntToStr(curZak.zak.dohour.hour)+'.'+IntToStr(curZak.zak.dohour.min)+' âåñ:'+IntToStr(curZak.zak.ves)+' îáúåì:'+IntToStr(curZak.zak.volume));:=curZak.next;;;;

{нахождение записи выделенного курьера}TMainWind.GetCourierByIndex(index:integer;var prevCour:Tcourier):TCourier;, curCour:Tcourier;:integer;:=listCour;:=0;(i<index) and (curCour<>nil) do:=CurCour;:=curCour.next;(i);;:=curCour;;TMainWind.OtTimeCourListBoxClick(Sender: TObject);:TCurZakaz;:Tcourier;OtTimeCourListBox.ItemIndex>=0 then.ItemIndex:=OtTimeCourListBox.ItemIndex;.ItemIndex:=OtTimeCourListBox.ItemIndex;.ItemIndex:=OtTimeCourListBox.ItemIndex;.ItemIndex:=OtTimeCourListBox.ItemIndex;.Clear;:=GetCourierByIndex(OtTimeCourListBox.ItemIndex,prev).PointZak;(curZak<>nil)do.Lines.Add(curZak.zak.name+' '+curZak.zak.adress+' ñ:'+IntToStr(curZak.zak.othour.hour)+'.'+IntToStr(curZak.zak.othour.min)+' äî:'+IntToStr(curZak.zak.dohour.hour)+'.'+IntToStr(curZak.zak.dohour.min)+' âåñ:'+IntToStr(curZak.zak.ves)+' îáúåì:'+IntToStr(curZak.zak.volume));:=curZak.next;;;;TMainWind.DoTimeCourListBoxClick(Sender: TObject);:TCurZakaz;:Tcourier;DoTimeCourListBox.ItemIndex>=0 then.ItemIndex:=DoTimeCourListBox.ItemIndex;.ItemIndex:=DoTimeCourListBox.ItemIndex;.ItemIndex:=DoTimeCourListBox.ItemIndex;.ItemIndex:=DoTimeCourListBox.ItemIndex;.Clear;:=GetCourierByIndex(DoTimeCourListBox.ItemIndex,prev).PointZak;(curZak<>nil)do.Lines.Add(curZak.zak.name+' '+curZak.zak.adress+' ñ:'+IntToStr(curZak.zak.othour.hour)+'.'+IntToStr(curZak.zak.othour.min)+' äî:'+IntToStr(curZak.zak.dohour.hour)+'.'+IntToStr(curZak.zak.dohour.min)+' âåñ:'+IntToStr(curZak.zak.ves)+' îáúåì:'+IntToStr(curZak.zak.volume));:=curZak.next;;;;TMainWind.VolumeCourListBoxClick(Sender: TObject);:TCurZakaz;:Tcourier;VolumeCourListBox.ItemIndex>=0 then.ItemIndex:=VolumeCourListBox.ItemIndex;.ItemIndex:=VolumeCourListBox.ItemIndex;.ItemIndex:=VolumeCourListBox.ItemIndex;.ItemIndex:=VolumeCourListBox.ItemIndex;.Clear;:=GetCourierByIndex(VolumeCourListBox.ItemIndex,prev).PointZak;(curZak<>nil)do.Lines.Add(curZak.zak.name+' '+curZak.zak.adress+' ñ:'+IntToStr(curZak.zak.othour.hour)+'.'+IntToStr(curZak.zak.othour.min)+' äî:'+IntToStr(curZak.zak.dohour.hour)+'.'+IntToStr(curZak.zak.dohour.min)+' âåñ:'+IntToStr(curZak.zak.ves)+' îáúåì:'+IntToStr(curZak.zak.volume));:=curZak.next;;;;TMainWind.WeightCourListBoxClick(Sender: TObject);:TCurZakaz;:Tcourier;WeightCourListBox.ItemIndex>=0 then.ItemIndex:=WeightCourListBox.ItemIndex;.ItemIndex:=WeightCourListBox.ItemIndex;.ItemIndex:=WeightCourListBox.ItemIndex;.ItemIndex:=WeightCourListBox.ItemIndex;.Clear;:=GetCourierByIndex(WeightCourListBox.ItemIndex,prev).PointZak;(curZak<>nil)do.Lines.Add(curZak.zak.name+' '+curZak.zak.adress+' ñ:'+IntToStr(curZak.zak.othour.hour)+'.'+IntToStr(curZak.zak.othour.min)+' äî:'+IntToStr(curZak.zak.dohour.hour)+'.'+IntToStr(curZak.zak.dohour.min)+' âåñ:'+IntToStr(curZak.zak.ves)+' îáúåì:'+IntToStr(curZak.zak.volume));:=curZak.next;;;;

{Добавление заказов курьерам}TMainWind.AddZakazToCur(zak:TZakaz):boolean;:Tcourier;,prevCurZak,temp:TCurZakaz;(zak = nil) then exit;:=listCour;(curCur<>nil)do(zak.addToCour) then break;(curCur.Volume-curCur.NowVolume>=zak.volume) then(curCur.weight-curCur.NowWeight>=zak.ves) then(((curCur.ottime.hour<zak.othour.hour) or((curCur.ottime.hour=zak.othour.hour) and (curCur.ottime.min<=zak.othour.min))) and

((curCur.dotime.hour>zak.othour.hour) or (( curCur.dotime.hour=zak.othour.hour) and (curCur.dotime.min>=zak.othour.min)))) or

(((curCur.ottime.hour<zak.dohour.hour) or((curCur.ottime.hour=zak.dohour.hour) and (curCur.ottime.min<=zak.dohour.min))) and

((curCur.dotime.hour>zak.dohour.hour) or (( curCur.dotime.hour=zak.dohour.hour) and (curCur.dotime.min>=zak.dohour.min)))) or

(((curCur.ottime.hour>zak.othour.hour) or((curCur.ottime.hour=zak.othour.hour) and (curCur.ottime.min>=zak.othour.min))) and

((curCur.dotime.hour<zak.othour.hour) or (( curCur.dotime.hour=zak.othour.hour) and (curCur.dotime.min<=zak.othour.min))))(temp);.zak:=zak;.next:=curCur.PointZak;.PointZak:=temp;.NowWeight:=curCur.NowWeight+zak.ves;.NowVolume:=CurCur.NowVolume+zak.volume;.addToCour:=true;;;:=curCur.next;;:=zak.addToCour;;

{Редактирование курьеров}TMainWind.ChangeCourButtonClick(Sender: TObject);:TCurZakaz;:TZakaz;:Tcourier;:=GetCourierByIndex(FIOCourListBox.ItemIndex,prev);.ShowModal;EditCourUnit.ifEditButClick=true then:=tempBuffer.PointZak;.PointZak:=nil;CurrListZak<>nil do.zak.addToCour:=false;:=CurrListZak.next;;:=ListZak;currZak<>nil do(currZak);:=currZak.next;;;;;

{Удаление курьеров}TMainWind.DeleteCourButtonClick(Sender: TObject);,PrevCour:TCourier;:TCurZakaz;:=nil;:=GetCourierByIndex(FIOCourListBox.ItemIndex,prevCour);FIOCourListBox.ItemIndex=0 then:=DelCour.PointZak;:=DelCour.next;(DelCour);:=DelCour.PointZak;.next:=DelCour.next;;courZakBuff<>nil do.zak.addToCour:=false;(CourZakBuff.zak);:=CourZakBuff.next;;;;;

{Редактирование заказов}TMainWind.ChangeZakButtonClick(Sender: TObject);,temp:Tzakaz;ListZakStringGrid.Row>=0 then:=listZak;currZak.number<>ListZakStringGrid.Row do:=currZak.next;:=currZak;.ShowModal;;;(tempBufZak);;

{Удаление заказов}TMainWind.DeleteZakButtonClick(Sender: TObject);,DelZak,curZakCour:Tzakaz;,CurrZak:TCurZakaz;:Tcourier;:boolean;:=false;:=ListZak;:=nil;DelZak.number<>ListZakStringGrid.Row do:=delZak;:=DelZak.next;;:=ListCour;CurrCour<>nil do:=nil;:=CurrCour.PointZak;currZak<>nil docurrZak.zak.number=DelZak.number thenprevZak=nil then.PointZak:=CurrZak.next;(currZak);.next:=currZak.next;(currZak);;:=true;;;:=CurrZak;:=currzak.next;;not ifZakDelete then:=CurrCour.next;;prev=nil then:=DelZak.next;(DelZak);.next:=DelZak.next;(DelZak);;;;:=ListZak;curZakCour<>nil do(CurZakCour);:=curZakCour.next;;.Clear;;;

end.

unit GlobalTypes;=record:integer;:integer;;=^zakaz;=record:string;:integer;:string;:time;:time;:integer;:integer;:Tzakaz;:boolean;;=^curZakaz;=record:Tzakaz;:TCurZakaz;;=^courier;=record:integer;:string;:time;:time;

//time:integer;:integer;:integer;:Tcourier;:integer;:integer;:TCurZakaz;;:Tcourier;:Tzakaz;

implementation.

unit NewCourierUnit;, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, GlobalTypes;= class(TForm): TGroupBox;: TEdit;: TEdit;: TEdit;: TEdit;: TEdit;: TEdit;: TEdit;: TButton;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;FormCreate(Sender: TObject);AddCourButtonClick(Sender: TObject);

{ Private declarations }

{ Public declarations };: TNewCourForm;:TCourier;: boolean;

{$R *.dfm}TNewCourForm.FormCreate(Sender: TObject);:=false;;TNewCourForm.AddCourButtonClick(Sender: TObject);:string;,OtMinute,DoHour,DoMinute,Volume,Weight:integer;:=false;:=FIOCourEdit.Text;FIO='' then('Wrong FIO',Left+Width div 2-50,top + Height div 2-50);;;:=StrToInt(OtHourCourEdit.Text);(OtHour<0)or(OtHour>23) thenException.Create('error with hour');;('Îøèáêà â ïîëå ×àñû äëÿ íà÷àëà âðåìåíè ðàáîòû',Left+Width div 2-50,top + Height div 2-50);;;:=StrToInt(OtMinCourEdit.Text);(OtMinute<0)or(OtMinute>59) thenException.Create('error with minute');;('Îøèáêà â ïîëå Ìèíóòû äëÿ íà÷àëà âðåìåíè ðàáîòû',Left+Width div 2-50,top + Height div 2-50);;;:=StrToInt(DoHourCourEdit.Text);(DoHour<0)or(DoHour>23) thenException.Create('error with Hour');;('Îøèáêà â ïîëå ×àñû äëÿ êîíöà âðåìåíè ðàáîòû',Left+Width div 2-50,top + Height div 2-50);;;:=StrToInt(DoMinCourEdit.Text);(DoMinute<0)or(DoMinute>59) thenException.Create('error with minute');;('Îøèáêà â ïîëå Ìèíóòû äëÿ íà÷àëà âðåìåíè ðàáîòû',Left+Width div 2-50,top+Height div 2-50);;;OtHour>DoHour thenException.Create('error with time');;('Îøèáêà ðàçíèöû âðåìåíè',Left+Width div 2-50,top+Height div 2-50);;;(OtHour=DoHour) and (OtMinute>DoMinute) thenException.Create('error with time');;('Îøèáêà ðàçíèöû âðåìåíè',Left+Width div 2-50,top+Height div 2-50);;;VolCourEdit.Text='' thenException.Create('error with volum');;('Îøèáêà â ïîëå Îáúåì',Left+Width div 2-50,top+Height div 2-50);;;:=StrToInt(VolCourEdit.Text);Volume<=0 then('Wrong volume',Left+Width div 2-50,top + Height div 2-50);;;WeightCourEdit.Text='' thenException.Create('error with weight');;('Îøèáêà â ïîëå Âåñ',Left+Width div 2-50,top+Height div 2-50);;;:=StrToInt(WeightCourEdit.Text);Weight<=0 then('Wrong weight',Left+Width div 2-50,top + Height div 2-50);;;:=true;

//создание списка курьеров

new(NewCour);

NewCour.fiocour:=fio;.ottime.hour:=OtHour;.ottime.min:=OtMinute;.dotime.hour:=DoHour;.dotime.min:=DoMinute;.Volume:=volume;.weight:=Weight;.NowWeight:=0;.NowVolume:=0;.PointZak:=nil;

NewCourForm.Close();;.

unit NewOrderUnit;, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, GlobalTypes;= class(TForm): TGroupBox;: TEdit;: TEdit;: TEdit;: TEdit;: TEdit;: TEdit;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TButton;: TEdit;: TEdit;FormCreate(Sender: TObject);NewAddZakButtonClick(Sender: TObject);

{ Private declarations }

{ Public declarations };: TNewZakForm;:Tzakaz;:boolean;

{$R *.dfm}TNewZakForm.FormCreate(Sender: TObject);:=false;;TNewZakForm.NewAddZakButtonClick(Sender: TObject);,adress:string;,OtMinute,DoHour,DoMinute,Volume,Weight:integer;:=false;:=NameZakEdit.Text;name='' then('Wrong name',Left+Width div 2-50,top + Height div 2-50);;;:=AdrZakEdit.Text;adress='' then('Wrong adress',Left+Width div 2-50,top + Height div 2-50);;;:=StrToInt(OtHourEdit.Text);(OtHour<0)or(OtHour>23) thenException.Create('error with hour');;('Îøèáêà â ïîëå ×àñû äëÿ íà÷àëà âðåìåíè äîñòàâêè',Left+Width div 2-50,top + Height div 2-50);;;:=StrToInt(OtMinuteEdit.Text);(OtMinute<0)or(OtMinute>59) thenException.Create('error with minute');;('Îøèáêà â ïîëå Ìèíóòû äëÿ íà÷àëà âðåìåíè äîñòàâêè',Left+Width div 2-50,top + Height div 2-50);;;:=StrToInt(DoHourEdit.Text);(DoHour<0)or(DoHour>23) thenException.Create('error with Hour');;('Îøèáêà â ïîëå ×àñû äëÿ êîíöà âðåìåíè äîñòàâêè',Left+Width div 2-50,top + Height div 2-50);;;:=StrToInt(DoMinuteEdit.Text);(DoMinute<0)or(DoMinute>59) thenException.Create('error with minute');;('Îøèáêà â ïîëå Ìèíóòû äëÿ íà÷àëà âðåìåíè äîñòàâêè',Left+Width div 2-50,top+Height div 2-50);;;OtHour>DoHour thenException.Create('error with time');;('Îøèáêà ðàçíèöû âðåìåíè',Left+Width div 2-50,top+Height div 2-50);;;(OtHour=DoHour) and (OtMinute>DoMinute) thenException.Create('error with time');;('Îøèáêà ðàçíèöû âðåìåíè',Left+Width div 2-50,top+Height div 2-50);;;VolEdit.Text='' thenException.Create('error with volum');;('Îøèáêà â ïîëå Îáúåì',Left+Width div 2-50,top+Height div 2-50);;;:=StrToInt(VolEdit.Text);Volume<=0 then('Wrong volume',Left+Width div 2-50,top + Height div 2-50);;;VesEdit.Text='' thenException.Create('error with weight');;('Îøèáêà â ïîëå Âåñ',Left+Width div 2-50,top+Height div 2-50);;;:=StrToInt(VesEdit.Text);Weight<=0 then('Wrong weight',Left+Width div 2-50,top + Height div 2-50);;;

//ñîçäàíèå ñïèñêà:=true;(NewZak);.name:= name;.adress:=adress;.othour.hour:=othour;.othour.min:=otminute;.dohour.hour:=dohour;.dohour.min:=dominute;.volume:=volume;.ves:=weight;.Close();

end;.

unit EditCourUnit;, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, GlobalTypes;= class(TForm): TGroupBox;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TEdit;: TEdit;: TEdit;: TEdit;: TEdit;: TEdit;: TButton;: TEdit;FormCreate(Sender: TObject);FormActivate(Sender: TObject);EditCourButtonClick(Sender: TObject);

{ Private declarations }

{ Public declarations };: TEditCourForm;:TCourier;: boolean;

{$R *.dfm}TEditCourForm.FormCreate(Sender: TObject);:=false;;TEditCourForm.FormActivate(Sender: TObject);.Text:=GlobalTypes.tempBuffer.fiocour;.Text:=IntToStr(tempBuffer.ottime.hour);.Text:=IntToStr(tempBuffer.ottime.min);.Text:=IntToStr(tempBuffer.dotime.hour);.Text:=IntToStr(tempBuffer.dotime.min);.Text:=IntToStr(tempBuffer.Volume);.Text:=IntToStr(tempBuffer.weight);;TEditCourForm.EditCourButtonClick(Sender: TObject);:string;,OtMinute,DoHour,DoMinute,Volume,Weight:integer;:=false;:=EditFIOCourEdit.Text;FIO='' then('Wrong FIO',Left+Width div 2-50,top + Height div 2-50);;;:=StrToInt(EditOtHourCourEdit.Text);(OtHour<0)or(OtHour>23) thenException.Create('error with hour');;('Îøèáêà â ïîëå ×àñû äëÿ íà÷àëà âðåìåíè ðàáîòû',Left+Width div 2-50,top + Height div 2-50);;;:=StrToInt(EditOtMinCourEdit.Text);(OtMinute<0)or(OtMinute>59) thenException.Create('error with minute');;('Îøèáêà â ïîëå Ìèíóòû äëÿ íà÷àëà âðåìåíè ðàáîòû',Left+Width div 2-50,top + Height div 2-50);;;:=StrToInt(EditDoHourCourEdit.Text);(DoHour<0)or(DoHour>23) thenException.Create('error with Hour');;('Îøèáêà â ïîëå ×àñû äëÿ êîíöà âðåìåíè ðàáîòû',Left+Width div 2-50,top + Height div 2-50);;;:=StrToInt(EditDoMinCourEdit.Text);(DoMinute<0)or(DoMinute>59) thenException.Create('error with minute');;('Îøèáêà â ïîëå Ìèíóòû äëÿ íà÷àëà âðåìåíè ðàáîòû',Left+Width div 2-50,top+Height div 2-50);;;OtHour>DoHour thenException.Create('error with time');;('Îøèáêà ðàçíèöû âðåìåíè',Left+Width div 2-50,top+Height div 2-50);;;(OtHour=DoHour) and (OtMinute>DoMinute) thenException.Create('error with time');;('Îøèáêà ðàçíèöû âðåìåíè',Left+Width div 2-50,top+Height div 2-50);;;EditVolCourEdit.Text='' thenException.Create('error with volum');;('Îøèáêà â ïîëå Îáúåì',Left+Width div 2-50,top+Height div 2-50);;;:=StrToInt(EditVolCourEdit.Text);Volume<=0 then('Wrong volume',Left+Width div 2-50,top + Height div 2-50);;;EditWeightCourEdit.Text='' thenException.Create('error with weight');;('Îøèáêà â ïîëå Âåñ',Left+Width div 2-50,top+Height div 2-50);

exit;;

Weight:=StrToInt(EditWeightCourEdit.Text);Weight<=0 then('Wrong weight',Left+Width div 2-50,top + Height div 2-50);;;:=true;.fiocour:=fio;.ottime.hour:=OtHour;.ottime.min:=OtMinute;.dotime.hour:=DoHour;.dotime.min:=DoMinute;.Volume:=volume;.weight:=Weight;.NowWeight:=0;.NowVolume:=0;();

end;.

unit EditZakUnit;, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, GlobalTypes, Grids;= class(TForm): TGroupBox;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TEdit;: TEdit;: TEdit;: TEdit;: TEdit;: TEdit;: TButton;: TEdit;: TEdit;FormActivate(Sender: TObject);FormCreate(Sender: TObject);ChangeZakButtonClick(Sender: TObject);

{ Private declarations }

{ Public declarations };: TChangeZakForm;: boolean;

{$R *.dfm}TChangeZakForm.FormCreate(Sender: TObject);:=false;;TChangeZakForm.FormActivate(Sender: TObject);.Text:=tempBufZak.name;.Text:=tempBufZak.adress;.Text:=IntToStr(tempBufZak.othour.hour);.Text:=IntToStr(tempBufZak.othour.min);.Text:=IntToStr(tempBufZak.dohour.hour);.Text:=IntToStr(tempBufZak.dohour.min);.Text:=IntToStr(tempBufZak.ves);.Text:=IntToStr(tempBufZak.volume);;TChangeZakForm.ChangeZakButtonClick(Sender: TObject);,adress:string;,OtMinute,DoHour,DoMinute,Volume,Weight:integer;:=false;:=NameChangeZakEdit.Text;name='' then('Wrong name',Left+Width div 2-50,top + Height div 2-50);;;:=AdrChangeZakEdit.Text;adress='' then('Wrong adress',Left+Width div 2-50,top + Height div 2-50);;;:=StrToInt(ChangeOtHourEdit.Text);(OtHour<0)or(OtHour>23) thenException.Create('error with hour');;('Îøèáêà â ïîëå ×àñû äëÿ íà÷àëà âðåìåíè äîñòàâêè',Left+Width div 2-50,top + Height div 2-50);;;:=StrToInt(ChangeOtMinuteEdit.Text);(OtMinute<0)or(OtMinute>59) thenException.Create('error with minute');;('Îøèáêà â ïîëå Ìèíóòû äëÿ íà÷àëà âðåìåíè äîñòàâêè',Left+Width div 2-50,top + Height div 2-50);;;:=StrToInt(ChangeDoHourEdit.Text);(DoHour<0)or(DoHour>23) thenException.Create('error with Hour');;('Îøèáêà â ïîëå ×àñû äëÿ êîíöà âðåìåíè äîñòàâêè',Left+Width div 2-50,top + Height div 2-50);;;:=StrToInt(ChangeDoMinuteEdit.Text);(DoMinute<0)or(DoMinute>59) thenException.Create('error with minute');;('Îøèáêà â ïîëå Ìèíóòû äëÿ íà÷àëà âðåìåíè äîñòàâêè',Left+Width div 2-50,top+Height div 2-50);;;OtHour>DoHour thenException.Create('error with time');;('Îøèáêà ðàçíèöû âðåìåíè',Left+Width div 2-50,top+Height div 2-50);;;(OtHour=DoHour) and (OtMinute>DoMinute) thenException.Create('error with time');;('Îøèáêà ðàçíèöû âðåìåíè',Left+Width div 2-50,top+Height div 2-50);;;ChangeVolEdit.Text='' thenException.Create('error with volum');;('Îøèáêà â ïîëå Îáúåì',Left+Width div 2-50,top+Height div 2-50);;;:=StrToInt(ChangeVolEdit.Text);Volume<=0 then('Wrong volume',Left+Width div 2-50,top + Height div 2-50);;;ChangeVesEdit.Text='' thenException.Create('error with weight');;('Îøèáêà â ïîëå Âåñ',Left+Width div 2-50,top+Height div 2-50);;;:=StrToInt(ChangeVesEdit.Text);Weight<=0 then('Wrong weight',Left+Width div 2-50,top + Height div 2-50);;;:=true;.name:= name;.adress:=adress;.othour.hour:=othour;.othour.min:=otminute;.dohour.hour:=dohour;.dohour.min:=dominute;.volume:=volume;.ves:=weight;.addToCour:=false;

Close();;.


СОДЕРЖАНИЕ Введение 1. Аналитический обзор литературы 1.1 Динамические структуры 1.2 Постановка задачи 2. Разработка алгоритма 3. Разработ

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ