Реферат: Информационная система расчетов по договорам

/>Белорусский национальный техническийуниверситет

Международныйинститут дистанционного образования

Кафедра ПОВТи АС

КУРСОВОЙ ПРОЕКТ

по курсу « Структурыи организация данных в ЭВМ »

На тему

« Информационнаясистема расчетов по договорам »

Исполнитель ст. гр.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< R Then

If a[q-l].Key> a[q].Key Then q:= q + 1;

If a[temp-1].Key<= a[q-l].Key Then Exit;

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;

Алгоритм просеивания для некоторого массива а можнопредставить в следующей блок-схеме:/> /> /> /> /> <td/>

Да

  /> /> />
/> 

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<10) then

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<=rdo

begin

if j<r then

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>=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<=rdo

begin

if j<r then

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<=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; // 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.

еще рефераты
Еще работы по информатике, программированию