/>Белорусский национальный техническийуниверситет
Международныйинститут дистанционного образования
Кафедра ПОВТи АС
КУРСОВОЙ ПРОЕКТ
по курсу « Структурыи организация данных в ЭВМ »
На тему
« Информационнаясистема расчетов по договорам »
Исполнитель ст. гр.417313 Я
Руководитель Романов А.В.Минск 2005г.
/>/>Введение
Без использования данныхи структур, образованных элементами данных, не обходится ни одна программа дляэлектронных вычислительных машин. Любые конструкции программы – нотации,операторы и т. д. – обязательно включают в себя идентификаторы некоторыхданных и их совокупностей. Логическая схема структуры данных, представляющейсобой совокупность взаимосвязанных данных, определяет не только внутреннеепредставление в памяти компьютера информационной модели некоторой предметнойобласти (или ее составной части), но и, что самое главное, построениеалгоритма, применяемого для обработки этой структуры. Так, например, алгоритмвключения нового элемента в таблицу, организованную в памяти как векторзаписей, не может быть использован для включения в иерархически организованныйсписок. Как указывает Н. Вирт, определяющую роль в программировании играютне алгоритмы, а именно структуры данных, логическое и физическое построениекоторых являются главными факторами, влияющими на реализацию программируемойпроцедуры обработки.
Значимость той роли,которую играют структуры данных в процессе конструирования и кодированияпрограмм для ЭВМ, послужила причиной появления в специальной «компьютерной»литературе множества работ, посвященных структурному подходу к организацииданных. Было разработано значительное количество программных компонентов (многиеиз них получили название «стандартных»), применение которых существеннооблегчило работу по обработке тех взаимосвязанных совокупностей данных, которыевыбирают программисты для использования в своих программах. В учебныхпрограммах высших учебных заведений появилась специальная дисциплина «Структурыи организация данных в ЭВМ», в рамках которой изучаются не только логическиесхемы различных структур данных и способы их физической организации, но ипостроение алгоритмов обработки таких структур (формирования, просмотр ит. д.). Важность такой дисциплины для специалистов по программномуобеспечению трудно переоценить.
Тема данного курсовогопроекта – «Информационная система расчётов по договорам». При этом по заданию ккурсовому проекту необходимо использовать структуру данных типа вектор и пирамидальнуюсортировку данных.
Базовым была взята ИСР Delphi, так как он позволяет с большойгибкостью оперировать различными данными, а также предоставляет практическинеограниченные возможности по созданию пользовательских интерфейсов.
Ниже я приведу некоторыеобоснования использования среды Delphiдля разработки данного программного продукта.
Delphi — это комбинация несколькихважнейших технологий:
· Высокопроизводительныйкомпилятор в машинный код.
· Объектно-ориентированнаямодель компонент.
· Визуальное (а,следовательно, и скоростное) построение приложений из программных прототипов.
Проект данной курсовой работыпредставляет собой инструмент для управления информационной системой расчетовпо договорам для коммерческой научно-производственной организации.
1. СоставDELPHI-проекта
1.1. Состав проекта
Данный проектсостоит из одной формы Form1.На форме расположены следующие компоненты (см. рис1):
— компонент MainMenu1 – осуществляет общее управлениепрограммой, в частности сохранение файлов с данными, обновление данных изфайлов, выход из программы.
— компонент BtnDel – кнопка в нижней части формы дляудаления записей данных.
— компонент txtSearch – поле ввода искомых данных.
— компонент btnSearch – кнопка для начала поиска введенныхданных в поле txtSearch.
— компонент CheckBox1 – соответственно для разрешенияредактирования данных.
— компонент PageControl1 – содержит вкладки TabSheet 1÷4 на которых отраженыданные (соответственно “ХД”, “ВТК”, “БАНК” и “Незавершенные договора”).
Компоненты TabSheet 1÷4 содержат в себе элементытаблицы (соответственно “XDgrid”,“WTKgrid”, “BANKgrid” и “NDgrid”). Кроме того, TabSheet 4 содержит ещё компонент GroupBox1 c кнопками btnSort1и btnSort2 для сортировки списка незавершенныхдоговоров по возрастанию и по убыванию количества членов ВТК.
/>Рис.1 – Главная форма программы.
1.2 Основные модули ипроцедуры, входящие в состав программного комплекса
Список модулей:
Программасодержит модуль Unit1 – модульинтерфейсной формы проекта.
Список основных процедур, входящих в состав программного комплекса:
— procedure LoadFromFiles – процедура загрузки данных изфайлов в одномерные массивы.
— procedure InitGrids – процедура инициализации таблиц изаполнения их в соответствии с массивами.
— procedure FillArrays – процедура заполнения массивов всоответствии с данными в таблицах.
— procedure SaveInFiles – процедура сохранения данных измассивов в файлы.
— procedure FillNDgrid – заполнение таблицы незавершенныхдоговоров.
— procedure Sort – пирамидальная сортировка таблицы незавершенныхдоговоров NDgrid по возрастанию.
— procedure Sort2– пирамидальная сортировка таблицы незавершенныхдоговоров NDgrid по убыванию.
— procedure SweepRows(r1,r2:word) — замена местами строк в таблиценезавершенных договоров NDgridпри сортировке.
— procedure SaveRow(var sr:SRow;r:word) – сохранениезамененной строки.
2. Статическиеданные и структуры
В программе для храненияданных объявлено 5 одномерных строковых массива типа String[N],где N≤255.
XDar: array[1..70] of String[30];
WTKar: array[1..150] of String[30];
BANKar: array[1..50] of String[30];
SRow=array[0..5] of String[30];
s: array[0..5] of String[30];Имя массива Тип Размер в байтах XDar String[N] (30+1)*70=2170 WTKar String[N] (30+1)*150=4650 BANKar String[N] (30+1)*50=1550 SRow String[N] (30+1)*6=186 S String[N] (30+1)*6=186
Кроме того, в программедля временных нужд объявляются переменные:
nCol, i, j, y, x, n, n1, n2, c типаinteger (каждая по 4 байта);
l, r типа word(каждая по 2 байта);
st, code, s импа string[30] (каждая по30+1=31 байт).
3. Логическиеструктуры данных
Главным элементом и базовойструктурой данного проекта являются обычные одномерные строковые массивы XDar,WTKar и BANKar размерностью 70, 150 и 50 соответственно.
Объявление массивавыглядит следующим образом:
XDar: array[1..70] of String[30];
WTKar: array[1..150] of String[30];
BANKar: array[1..50] of String[30];
Массив (array) – это структура данных. Общим признакомвсех массивов всех типов является возможность прямого доступа к их элементам состороны программы. Эта возможность обеспечивается нумерацией элементов спомощью индекса, который обычно имеет целый тип.
Для логическогоопределения массива ему необходимо происвоить имя, указать пару ограниченыхзначений индекса (или несколько пар граничных значений индексов), а такжеуказать тип элементов.
Логическая схемаструктуры массива XDar: 1 2 … 30 1 2 3 … 70
Каждыйэлемент массива занимает 1 байт памяти. Соответственно массив XDar будет занимать (30+1)*70=2170 байт.
Логическая схемаструктуры массива WTKar: 1 2 … 30 1 2 3 … 150
Каждыйэлемент массива занимает 1 байт памяти. Соответственно массив WTKar будет занимать (30+1)*150=4650 байт.
Логическая схемаструктуры массива BANKar: 1 2 … 30 1 2 3 … 50
Каждыйэлемент массива занимает 1 байт памяти. Соответственно массив BANKar будет занимать (30+1)*50=1550 байт.
4. Алгоритмыобработки основных структур
Основнойоперацией обработки структуры в данном программном обеспечении являетсяпирамидальная сортировка (по заданию на курсовое проектирование).
Данный видсортировки не рекомендуется для небольшого числа элементов, как, скажем, внашем программном обеспечении. Однако для большого количества элементовпирамидальная сортировка оказывается очень эффективной, и чем больше числоэлементов, тем эффективнее.
Пирамидальнаясортировка требует N∙Log2N шагов даже в худшем случае. Такие отлиные характеристики дляхудшего случая – одно из самых выгодных качеств пирамидальной сортировки.
Но в принципедля данного вида сортиовки, видимо, больше всего подходят случаи, когда элементыболее или менее рассортированы в обратном порядке, т.е. для нее характернонеестественное поведение. Очевидно, что при обратном порядке фаза построенияпирамиды не требует никаких пересылок.
Пирамида определяется как некоторая последовательность ключей
K[L], ..., K[R], такая, что
K[i] ≤ K[2i] & K[i] ≤ K[2i + 1], (1)
для всякого i = L, ..., R/2.Если имеется массив К[1], К[2], ..., К[R], который индексируется от 1, то этот массив можнопредставить в виде двоичного дерева. Пример такого представления при R=10 показан на рисунке 2.
/>Рис.2 – Массив ключей, представленный в виде двоичногодерева
Дерево,изображенное на рисунке 2, представляет собой пирамиду, поскольку для каждого i = 1, 2, ..., R/2 выполняется условие (1). Очевидно,последовательность элементов с индексами i = R/2+1,R/2+2, ...., R (листьев двоичного дерева), является пирамидой, посколькудля этих индексов в пирамиде нет сыновей.
Способпостроения пирамиды «на том жеместе» был предложен Р. Флойдом. В нем используется процедура просеивания (sift), которую рас-смотрим на следующемпримере.
Предположим,что дана пирамида с элементами К[3], К[4], ..., К[10] нужно добавить новыйэлемент К[2] для того, чтобы сформировать расши-ренную пирамиду К[2], К[3], К[4],..., К[10]. Возьмем, например, исходную пирамиду К[3], ..., К[10], покачаннуюна рисунке 3, и расширим эту пирамиду «влево», добавив элемент К[2] =44.
/>Рис.3 – Пирамида, в которую добавляется ключ К[2]=44
Добавляемыйключ К[2] просеивается в пирамиду: его значение сравнивается с ключамиузлов-сыновей, т.е. со значениями 15 и 28. Если бы оба слюча-сына были больше,чем просеиваемый ключ, то последний остался бы на месте, и просеивание было бызавершено. В нашем случае оба ключа-сына меньше, чем 44, следовательно,вставляемый ключ меняется местами с наименьшим ключом в этой паре, т.е. сключом 15. Ключ 44 записывается в элемент К[4], а ключ 15 — в элемент К[2].Просеивание продолжается, поскольку ключи-сыновья нового элемента К[4]оказываются меньше его — происходит обмен ключей 44 и 18. В результате получаемновую пирамиду, показанную на рисунке 4.
В нашемпримере получалось так, что оба ключа-сына просеиваемого
элемента оказывались меньше его. Это не обязательно: для инициализации
обмена достаточно того, чтобы оказался меньше хотя бы один сыновей
ключ, с которым и производится обмен.
Просеиваниеэлемента завершается при выполнении любого из двух условий: либо у него неоказывается потомков в пирамиде, либо значение его ключа не превышает значенийключей обоих сыновей.
/>Рис.4 – Просеивание ключа 44 в пирамиду.
Алгоритмпросеивания в пирамиду допускает рекурсивную формулировку:
1) просеивание элемента с индексом temp,
2) при выполнении условий остановки — выход,
3) определение индекса q элемента, с которым выполняетсяобмен,
4) обмен элементов с индексами temp и q,
5) temp:= q,
6) перейти к п. 1.
Этоталгоритм в применении к нашему массиву а реализован в подпрограмме Sift, которая выполняет просеивания впирамиду с максимальным индексом R:
Procedure Sift (temp, R: Integer);
Var q:integer;
x: TElement;
Begin
q:==2*t;
If q > R Then Exit;
If q
If a[q-l].Key> a[q].Key Then q:= q + 1;
If a[temp-1].Key
x:= a[temp-1];
a [temp-1] := a[q-l];
a[q-l]:= x;
temp:= q;
Shift (temp, R);
End;
ПроцедураShift учитывает индексацию вектора а отнуля.
Теперьрассмотрим процесс создания пирамиды из массива а[0], а[1], a[Highlndex]. Элементы этого массиваиндексируются от 0, а пирамида от 1. Ясно, что элементы a[N/2], a[N/2+1], ..., a[Highlndex] ужеобразуют пирамиду, поскольку не существует двух индексов i (i= N/2+1, N/2+2, …) и j, таких, что, j=2i (или j=2i+l). Эти элементы составляютпоследовательность, которую можно рассматривать как листья соответствующегодвоичного дерева. Теперь пирамида расширяется влево: на каждом шаге добавляетсяновый элемент и при помощи просеивания помещается на соответствующее место.Этот процесс иллюстрируется следующим примером.
Процесспостроения пирамиды
44 55 1242 94 18 06 67
44 55 1242 94 18 06 67
44 55 0642 94 18 12 67
44 42 0655 94 18 12 67
06 42 1255 94 18 44 67
Примечание- жирным шрифтом отмечены ключи, образующие пирамиду на текущем шаге еепостроения
Следовательно,процесс построения пирамиды из N элементов «на том же месте» можно описатьследующим образом:
R:= N;
For i:= N Div 2 Downto 1 Do
Sift(i, R);
Длятого, чтобы получить не только частичную, но и полную упорядоченность элементовнужно проделать N сдвигающих шагов, причем после каждого шага на вершину деревавыталкивается очередной (наименьший элемент). Возникает вопрос, где хранить«всплывающие» верхние элементы? Существует такой выход: каждый раз братьпоследнюю компоненту пирамиды (скажем, это будет х), прятать верхний элемент наместо х, а х посылать в начало пирамиды в качестве элемента а[0] и просеиватьего в нужное место. В следующей таблице приводятся необходимые в этом случаешаги:
Примерпреобразования пирамиды в упорядоченную последовательность
06 42 12 55 94 18 44 67
12 42 1855 94 67 44 06
18 42 4455 94 67 12 06
42 55 4467 94 18 12 06
44 55 94 67 42 18 12 06
55 67 9444 42 18 12 06
67 94 5544 42 18 12 0б
94 67 5544 42 18 12 06 — Результат
Этотпроцесс описывается с помощью процедуры Sift следующим образом:
For R:=Highlndex Downto 1 Do Begin
x:=a[0]; a[0]:=a[R]; a[R]:=x;
Sift(1, R);
End;
Изпримера сортировки видно, что на самом деле в результате мы получаемпоследовательность в обратном порядке. Но это легко можно исправить, изменивнаправление отношения порядка в процедуре Sift (в третьем и четвертом операторах If текста процедуры Sift, приведенного выше). В результатеполучаем следующую процедуру PyramidSort, учитывающую специфику индексации вектора а:
Procedure PyramidSort;
Var R, i:integer;
x: TElement;
Begin
R:= N;
For i:=N Div 2 Downto 1 Do
Sift(i, R);
For R:=Highlndex Downto 1 Do Begin
x:=a[0]; a[0]:= a[R]; a[R]:= x;
Sift(l, R);
End;Алгоритм просеивания для некоторого массива а можнопредставить в следующей блок-схеме:/> /> /> /> />
Да /> /> />
/>
5. Руководство пользователя
Данноепрограмное обеспечение имеет интуитивно понятный интерфейс и использует всебогатейшие возможности пакета Borland Delphi.
Программаимеет четыре вкладки. При первоначальном запуске активируется первая – вкладкахозяйственных договоров “ХД” (см. рис.5).
/>Рис.5 – Вкладка ходяйственных договоровЗдесь же можно внести изменения (предварительно отметивчекбокс «редактирование»), добавить или удалить новые записи.Перейдя на вкладку временных трудовых коллективов “ВТК”(см. рис.6), мы попадем на список атрибутов исполнителей всех хоздоговоров,являющиеся членами соответствующих ВТК.
/>Рис.6 – Вкладка списков атрибутов исполнителей всеххоздоговоровЗдесь также можно редактировать списки, удалять их идобавлять новые. Нужно отметить, что “Код ХД” составляется из номера договора игода заключения договора.Третья вкладка “Банк” содержит атрибуты отделений банковсбербанка, где имеются счета исполнителя договоров (см. рис.7).
/>Рис.7 – Вкладка атрибутов отделений банков сбербанка.В данной вкладке как и в прдедыдущих можно радактироватьатрибуты, удалять их, добавлять новые.И в четвертой вкладке находится упорядоченный по количествучленов ВТК (по возрастанию или по убыванию) всех незавершенных договоров суказанием части их атрибутов (согласно заданию к курсовому проектированию).Скриншот данной вкладки представлен на рис. 8.
/>Рис.8 – Вкладка атрибутов незавершенных договоровСортировка незавершенных договоров происходит или поубыванию, или по возрастанию количества членов ВТК пирамидальным методом(согласно заданию к курсовому проектированию).Из всех вкладок доступно меню “Файл”, в которм можносохранить файлы с записями всей информации, обновить данную информацию иливыйти из программы. Также доступен поиск отдельных элементов атрибутов.
Заключение
В процессеразработки данного курсового проекта были изучены и закреплены знания пофизическим размещениям структур данных и методам их обработки (сортировки). ВИСР DELPHI была разработана инормационнаясистема расчётов по договорам. При создании программы не использовалиськомпоненты баз данных данной ИСР.
Тестированиеданного продукта показало хорошую работоспособность и отсутствие ошибок инедочётов в программе, а также в выполнении требований задания курсовогопроекта. Были изучены базовая структура данных типа вектор и пирамидальныйметод сортировки.
Литература
1 Структуры и организация данных в компьютере. Учебное пособие / ЛакинВ.И., Романов А.В. – Мн.: БНТУ, 2004 – 176 с.
2 Архангельский А.Я. Delphi 6. Справочное пособие. — М.: ЗАО «Издательсво БИНОМ», 2001. — 1024 с.
3 Вирт Н. Алгоритмы и структуры данных. — СПб: Невский диалект, 2001. 352 с.
4 Гук М. Аппаратные средства IBM PC. Энциклопедия. — СПб: Питер, 2003. — 928 с.
5 Кнут Д.Э. Искусство программирования, том 1. Основные алгоритмы. — М.: Издательский дом «Вильямс»,2002. -720 с.
6 Кнут Д.Э. Искусство программирования, том 3. Сортировка и поиск. — М.: Издательский дом «Вильямс»,2001. - 832 с.
7 Лэнгсам Й., Огенстайн М., Тененбаум А. Структура данных для персональныхЭВМ. – М.: Мир, 1989. – 475 с.
8 Фаронов В. Система программирования DELPHI. -СПб.: «БВХ-Петербург», 2004. — 887 с.
Приложение 1Листинг программы
unit Unit1;
interface
uses
Windows,Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls,Grids, Menus, StdCtrls, ExtCtrls;
type
// тип для хранениястроки таблицы NDgrid
SRow=array[0..5] of String[30];
TForm1 =class(TForm)
PageControl1:TPageControl;
TabSheet1:TTabSheet;
XDgrid:TStringGrid;
TabSheet2:TTabSheet;
WTKgrid:TStringGrid;
TabSheet3:TTabSheet;
BANKgrid:TStringGrid;
MainMenu1:TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
btnSearch:TButton;
txtSearch:TEdit;
TabSheet4:TTabSheet;
NDgrid:TStringGrid;
N4: TMenuItem;
CheckBox1:TCheckBox;
btnDel:TButton;
GroupBox1:TGroupBox;
btnSort1:TButton;
btnSort2:TButton;
procedureFormCreate(Sender: TObject);
procedureN2Click(Sender: TObject);
procedureN3Click(Sender: TObject);
procedurebtnSearchClick(Sender: TObject);
procedureN4Click(Sender: TObject);
procedureCheckBox1Click(Sender: TObject);
procedurebtnDelClick(Sender: TObject);
procedurebtnSort2Click(Sender: TObject);
procedurebtnSort1Click(Sender: TObject);
private
{ Privatedeclarations }
XDar: array[1..70] of String[30]; {массив для ХД}
WTKar: array[1..150] of String[30]; {массив для ВТК}
BANKar: array[1..50] of String[30]; {массив для БА}
public
{ Publicdeclarations }
procedureLoadFromFiles;
procedureInitGrids;
procedureFillArrays;
procedureSaveInFiles;
procedureFillNDgrid;
procedureSort;
procedureSort2;
procedureSweepRows(r1,r2:word);
procedureSaveRow(var sr:SRow;r:word);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{Процедура загрузкифайлоы в массивы}
procedureTForm1.LoadFromFiles;
var
F:TextFile;
i:integer;
begin
{Файл — 'XD.txt'}
// открываемфайл для чтения
AssignFile(F,'XD.txt');
Reset(F);
if IOResult 0 then
// ошибкаоткрытия файла!
begin
{$I+}
MessageBox(0,'Ошибка!','Невозможно открыть файл XD.txt!',MB_OK);
exit;
end;
{$I+}
// считываем файлпострочно до конца и заполняем массив XDar
i:=1;
whilenot(SeekEof(F))do
begin
ReadLn(F,XDar[i]);
inc(i);
end;
CloseFile(F);// закрыть файл
{Файл — 'WTK.txt'}
{$I-}
// открываем файл длячтения
AssignFile(F,'WTK.txt');
Reset(F);
if IOResult 0 then
// ошибкаоткрытия файла!
begin
{$I+}
MessageBox(0,'Ошибка!','Невозможно открыть файл WTK.txt!',MB_OK);
exit;
end;
{$I+}
// считываем файлпострочно до конца и заполняем массив XDar
i:=1;
whilenot(SeekEof(F))do
begin
ReadLn(F,WTKar[i]);
inc(i);
end;
CloseFile(F);// закрыть файл
{Файл — 'BANK.txt'}
{$I-}
// открываем файл длячтения
AssignFile(F,'BANK.txt');
Reset(F);
if IOResult 0 then
// ошибкаоткрытия файла!
begin
{$I+}
MessageBox(0,'Ошибка!','Невозможно открыть файл BANK.txt!',MB_OK);
exit;
end;
{$I+}
// считываем файлпострочно до конца и заполняем массив XDar
i:=1;
whilenot(SeekEof(F))do
begin
ReadLn(F,BANKar[i]);
inc(i);
end;
CloseFile(F);// закрыть файл
end;
{Процедура инициализациитаблицы и заполнение ее в соответсвии с массивами}
procedureTForm1.InitGrids;
vari,j:integer;
begin
XDgrid.Cells[0,0]:='Номердоговора';
XDgrid.Cells[1,0]:='Дата заключения';
XDgrid.Cells[2,0]:='Дата завершения';
XDgrid.Cells[3,0]:='Тема договора';
XDgrid.Cells[4,0]:='Организация';
XDgrid.Cells[5,0]:='Признак завершения';
XDgrid.Cells[6,0]:='Cтоимость';
WTKgrid.Cells[0,0]:='Фамилия';
WTKgrid.Cells[1,0]:='Имя';
WTKgrid.Cells[2,0]:='Отчество';
WTKgrid.Cells[3,0]:='Год рождения ';
WTKgrid.Cells[4,0]:='Код ХД ';
WTKgrid.Cells[5,0]:='Признак';
WTKgrid.Cells[6,0]:='Сумма вознаграждения ';
WTKgrid.Cells[7,0]:='Домашний адрес ';
WTKgrid.Cells[8,0]:='Номер сбербанка';
WTKgrid.Cells[9,0]:='Расчетный счет ';
BANKgrid.Cells[0,0]:='Номер отделения';
BANKgrid.Cells[1,0]:='Город';
BANKgrid.Cells[2,0]:='Адрес ';
BANKgrid.Cells[3,0]:='Наименование отделения ';
BANKgrid.Cells[4,0]:='Банковский код ';
NDgrid.Cells[0,0]:='Номер договора';
NDgrid.Cells[1,0]:='Дата заключения';
NDgrid.Cells[2,0]:='Дата завершения';
NDgrid.Cells[3,0]:='Тема договора';
NDgrid.Cells[4,0]:='Организация';
NDgrid.Cells[5,0]:= 'Кол-во членов ВТК';
for i:=1 to 10do
begin
for j:=1 to 7do
XDgrid.Cells[j-1,i]:=XDar[(i-1)*7+j];
end;
for i:=1 to 15do
begin
for j:=1 to 10do
WTKgrid.Cells[j-1,i]:=WTKar[(i-1)*10+j];
end;
for i:=1 to 10do
begin
for j:=1 to 5do
BANKgrid.Cells[j-1,i]:=BANKar[(i-1)*5+j];
end;
end;
{Заполним массивы всоответсвии с данными в таблице}
procedureTForm1.FillArrays;
var i:integer;
begin
for i:=0 to 69do
begin
XDar[i+1]:=XDgrid.Cells[(imod 7),(i div 7)+1];
end;
for i:=0 to149 do
begin
WTKar[i+1]:=WTKgrid.Cells[(imod 10),(i div 10)+1];
end;
for i:=0 to 49do
begin
BANKar[i+1]:=BANKgrid.Cells[(imod 5),(i div 5)+1];
end;
end;
{Сохраним данные измассивов в файл}
procedureTForm1.SaveInFiles;
var
F:TextFile; //текстовый файл
i:integer;
begin
{XD.txt}
// открываем файл длязаписи
AssignFile(F,'XD.txt');
Rewrite(F);
// построчно записываемиз массива в файл
for i:=1 to 70do
WriteLn(F,XDar[i]);
CloseFile(F);// закрыть файл
{WTK.txt}
// открываем файл длязаписи
AssignFile(F,'WTK.txt');
Rewrite(F);
// построчно записываемиз массива в файл
for i:=1 to150 do
WriteLn(F,WTKar[i]);
CloseFile(F);// закрыть файл
{BANK.txt}
// открываем файл длязаписи
AssignFile(F,'BANK.txt');
Rewrite(F);
// построчно записываемиз массива в файл
for i:=1 to 50do
WriteLn(F,BANKar[i]);
CloseFile(F);// закрыть файл
end;
procedureTForm1.FormCreate(Sender: TObject);
begin
LoadFromFiles; // загрузка данных из файла вмассивы
InitGrids; // инициализация таблицы
FillNDgrid; // заполнить таблицу незавершенныхдоговоров
end;
{Выход}
procedureTForm1.N2Click(Sender: TObject);
begin
Halt;
end;
{Сохранить}
procedureTForm1.N3Click(Sender: TObject);
begin
FillArrays; // сначала заполним массивы всоответсвии с таблицами
SaveInFiles; // теперь сохраним в файл
end;
{Поиск}
procedureTForm1.btnSearchClick(Sender: TObject);
var
myRect:TGridRect;
Grid:TStringGrid;
nCol,i,j:integer;
st:String;
begin
st:=txtSearch.Text; // строка для поиска
// определяем активнуюзакладку
casePageControl1.ActivePageIndex of
0: beginGrid:= XDgrid; nCol:=7; end;
1: beginGrid:=WTKgrid; nCol:=10; end;
2: beginGrid:=BANKgrid; nCol:=5; end;
end;
myRect.Left :=11;
myRect.Top :=11;
myRect.Right:= 11;
myRect.Bottom:= 11;
Grid.Selection:=myRect;
if(st=' ') or(st='') then exit;
// поиск
for i:=1 to 10do
for j:=0 tonCol-1 do
ifGrid.Cells[j,i]=st then
begin
myRect.Left :=j;
myRect.Top :=i;
myRect.Right:= j;
myRect.Bottom:= i;
Grid.Selection:= myRect;
exit;
end;
end;
{Заполнить таблицунезавершенных договоров в соответсвии с
XDgrid,WTKgrid, BANKgrid}
procedureTForm1.FillNDgrid;
vari,j,y,n:integer;
code:string;
st:string;
begin
j:=1;
for i:=1 to 10do
if(XDGrid.Cells[5,i]='незавершен')then
begin
NDgrid.Cells[0,j]:=XDGrid.Cells[0,i];
NDgrid.Cells[1,j]:=XDGrid.Cells[1,i];
NDgrid.Cells[2,j]:=XDGrid.Cells[2,i];
NDgrid.Cells[3,j]:=XDGrid.Cells[3,i];
NDgrid.Cells[4,j]:=XDGrid.Cells[4,i];
// составимкод договора
code:=NDgrid.Cells[0,j]+'/'+ NDgrid.Cells[1,j][9]+ NDgrid.Cells[1,j][10];
// найдем сколько человексостоит именно в этом ВТК
n:=0;
for y:=1 to 15do
if(WTKgrid.Cells[4,y]=code)then inc(n);
str(n,st);
NDgrid.Cells[5,j]:=st;
inc(j);
end;
end;
{Обновить — обновитьтаблицу незавершенных договоров}
procedureTForm1.N4Click(Sender: TObject);
vari,j:integer;
begin
for i:=1 to 10do
for j:=0 to 5do
NDgrid.Cells[j,i]:='';
FillNDgrid;
end;
{Переключение флагаредактирования}
procedureTForm1.CheckBox1Click(Sender: TObject);
varopt:TGridOptions;
begin
opt:=XDgrid.Options;
if CheckBox1.Checked=falsethen
begin
Include(opt,goRowSelect);
Exclude(opt,goEditing);
btnDel.Enabled:= true;
end
else
begin
Exclude(opt,goRowSelect);
Include(opt,goEditing);
btnDel.Enabled:= false;
end;
XDgrid.Options:= opt;
WTKgrid.Options:= opt;
BANKgrid.Options:= opt;
end;
{Удалить}
procedureTForm1.btnDelClick(Sender: TObject);
var
myRect:TGridRect;
Grid:TStringGrid;
nCol,i,j:integer;
begin
// определяем активнуюзакладку
casePageControl1.ActivePageIndex of
0: beginGrid:= XDgrid; nCol:=7; end;
1: beginGrid:=WTKgrid; nCol:=10; end;
2: beginGrid:=BANKgrid; nCol:=5; end;
end;
if(Grid.Row>0)and (Grid.Row
for i:=Grid.Rowto 10 do
begin
for j:=0 tonCol-1 do
Grid.Cells[j,i]:=Grid.Cells[j,i+1];
end;
end;
{пирамидальная сортировкатаблицы NDgrid по возростанию}
procedureTForm1.Sort;
var
l,r:word;
x,n,n1,n2,c,y:integer;
s:string;
sr:SRow;
procedureSift;
label l3;
vari,j,y:word;
begin
i:=l;j:=2*i;s:=NDgrid.Cells[5,i];SaveRow(sr,i);
while j
begin
if j
begin
Val(NDgrid.Cells[5,j],n1,c);
Val(NDgrid.Cells[5,j+1],n2,c);
if n1
end;
Val(s,n1,c);
Val(NDgrid.Cells[5,j],n2,c);
if n1>=n2then goto l3;
for y:=0 to 5do
NDgrid.Cells[y,i]:=NDgrid.Cells[y,j];
i:=j; j:=2*i;
end;
l3:
for y:=0 to 5do
begin
NDgrid.Cells[y,i]:=sr[y];
end;
end; // Sift
begin
n:=0;
for y:=1 to 10do
if(NDgrid.Cells[5,y]'') and (NDgrid.Cells[5,y]' ') then
inc(n);
l:=(n div2)+1;r:=n;
while l>1do
begin
l:=l-1; Sift;
end;
while r>1do
begin
SaveRow(sr,1);
s:=NDgrid.Cells[5,1];
SweepRows(1,r);
r:=r-1; Sift;
end;
end; // Sort
{пирамидальная сортировкатаблицы NDgrid по убыванию}
procedureTForm1.Sort2;
var
l,r:word;
x,n,n1,n2,c,y:integer;
s:string;
sr:SRow;
procedureSift;
label l3;
vari,j,y:word;
begin
i:=l;j:=2*i;s:=NDgrid.Cells[5,i];SaveRow(sr,i);
while j
begin
if j
begin
Val(NDgrid.Cells[5,j],n1,c);
Val(NDgrid.Cells[5,j+1],n2,c);
if n1>n2then j:=j+1;
end;
Val(s,n1,c);
Val(NDgrid.Cells[5,j],n2,c);
if n1
for y:=0 to 5do
NDgrid.Cells[y,i]:=NDgrid.Cells[y,j];
i:=j; j:=2*i;
end;
l3:
for y:=0 to 5do
begin
NDgrid.Cells[y,i]:=sr[y];
end;
end; // Sift
begin
n:=0;
for y:=1 to 10do
if(NDgrid.Cells[5,y]'') and (NDgrid.Cells[5,y]' ') then
inc(n);
l:=(n div2)+1;r:=n;
while l>1do
begin
l:=l-1; Sift;
end;
while r>1do
begin
SaveRow(sr,1);
s:=NDgrid.Cells[5,1];
SweepRows(1,r);
r:=r-1; Sift;
end;
end; // Sort2
{поменять местами строки r1 и r2 в таблице NDgrid}
procedureTForm1.SweepRows(r1,r2:word);
var s: array[0..5] of String[30];
i:integer;
begin
for i:=0 to 5do
s[i]:=NDgrid.Cells[i,r1];
for i:=0 to 5do
NDgrid.Cells[i,r1]:=NDgrid.Cells[i,r2];
for i:=0 to 5do
NDgrid.Cells[i,r2]:=s[i];
end;
{сохранить строку номер r таблицы NDgrid в sr}
procedureTForm1.SaveRow(var sr:SRow;r:word);
var i:integer;
begin
for i:=0 to 5do
sr[i]:=NDgrid.Cells[i,r];
end;
procedureTForm1.btnSort2Click(Sender: TObject);
begin
Sort;
end;
procedureTForm1.btnSort1Click(Sender: TObject);
begin
Sort2;
end;
end.