Наименование поля
|
Наименование сокращенное
|
Тип
|
Длина
|
Идентификатор записи
|
ID
|
Integer
|
4
|
Идентификатор студента
|
StudentID
|
Integer
|
4
|
Идентификатор предмета
|
ResultsID
|
Integer
|
4
|
Оценки
|
Integer
|
2
|
Каждый файл содержит в себе определенную информацию. Для
информационно-справочных систем характерно то, что вся информация в ней
взаимосвязана. Система, разработанная в данной работе, не является исключением.
Структура связей между файлами, представлена на рисунке 1.
Рисунок 1 - Структура связей между файлами.
3. Описание
логической структуры
3.1
Обоснование выбора программных средств
При решении поставленной задачи оптимально использовать для
представления информационных материалов язык Delphi, который является языком
высокого уровня и позволяет быстро и эффективно создавать приложения.
Для реализации "такой-то программы" была выбрана
система программирования Delphi версии 6.- это продукт Borland International
для быстрого создания приложений. Высокопроизводительный инструмент визуального
построения приложений включает в себя настоящий компилятор кода и предоставляет
средства визуального программирования, несколько похожие на те, что можно
обнаружить в других инструментах визуального проектирования. В основе Delphi
лежит язык Object Pascal, который является расширением
объектно-ориентированного языка Pascal. В Delphi также входят локальный
SQL-сервер, генераторы отчетов, библиотеки визуальных компонентов, и прочее.
Прежде всего Delphi предназначен для профессиональных разработчиков,
желающих очень быстро разрабатывать приложения в архитектуре клиент-сервер.
Delphi производит небольшие по размерам (до 15-30 Кбайт) высокоэффективные
исполняемые модули (. exe и. dll). С другой стороны небольшие по размерам и
быстро исполняемые модули означают, что требования к клиентским рабочим местам
существенно снижаются - это имеет немаловажное значение и для конечных
пользователей.
Преимущества Delphi по сравнению с аналогичными программными
продуктами.
быстрота разработки приложения;
высокая производительность разработанного приложения;
низкие требования разработанного приложения к ресурсам
компьютера;
наращиваемость за счет встраивания новых компонент и
инструментов в среду Delphi;
возможность разработки новых компонент и инструментов собственными
средствами Delphi (существующие компоненты и инструменты доступны в исходных
кодах);
удачная проработка иерархии объектов.
Система программирования Delphi рассчитана на
программирование различных приложений и предоставляет большое количество компонентов
для этого [2].
К тому же работодателей интересует, прежде всего, скорость и
качество создания программ, а эти характеристики может обеспечить только среда
визуального проектирования, способная взять на себя значительные объемы
рутинной работы по подготовке приложений, а также согласовать деятельность
группы постановщиков, кодировщиков, тестеров и технических писателей.
Возможности Delphi полностью отвечают подобным требованиям и подходят для
создания систем любой сложности.
3.2 Описание
используемых методов и обоснование принятых решений
При разработке данной системы использовалась стратегия
структурного программирования "сверху вниз". Это модульное пошаговое
нисходящее проектирование алгоритма и структур данных. Оно включает в себя
составляющие:
1. Нисходящая разработка.
Это подход к разработке программного обеспечения, при котором
оно разбивается на программные модули, образующие многоуровневую структуру.
Каждый модуль - это короткая программа, решающая отдельную задачу. В процессе
разработки модули нижележащих уровней заменяются заглушками. Таким образом, в
любой момент разработки есть действующий вариант программного обеспечения [3].
Основной принцип нисходящей разработки заключен в следующем:
сначала проектируют модуль основной программы, далее подпрограммы, вызываемые
основным модулем, далее подпрограммы, вызываемые этими подпрограммами и т.д.,
двигаясь от блоков высшего уровня к блокам низшего [3].
2. Структурное программирование.
Этот метод программирования, предусматривающий создание
понятных и простых программных модулей на требуемом языке.
3.3 Описание
алгоритма сортировки
Для того, чтобы осуществлялся поиск, необходимо выполнить
сортировку. Используемый метод сортировки - просеивание.
Метод просеивания работает до тех пор, пока не надо выполнять
перестановку. Сравниваемая запись с меньшим ключом перемещается насколько это
возможно к началу списка. Если ее ключ меньше, чем у предшественника, то
выполняется обмен и начинается очередное сравнение.
Рассмотрим этот метод на примере. Осуществим сортировку
студентов по столбцу Идентификатор. Имеем следующие данные: 1221 2212 3434 3245
5657 6565 2235 6576 8756 2345
Первоначально сравниваются 1-й и 2-й элементы. Их порядок
правильный, поэтому они не меняются местами.
Затем сравниваются 2-й и 3-й элементы. Их порядок правильный,
ничего не происходит.
Далее 3-й элемент сравнивается с 4-м. Их порядок
неправильный, происходит перестановка. Данные будут иметь вид: 1221 2212 3245
3434 5657 6565 2235 6576 8756 2345
Теперь необходимо сравнить 3-й элемент сначала со 2-м, потом
с 1-м. В данном примере их порядок правильный, поэтому перестановок не будет.
Если порядок неправильный, происходит перестановка.
По такому же принципу происходит сортировка остальных
элементов. В итоге получим желаемый результат: 1221 2212 2235 2345 3245 3434
5657 6565 6576 8756
Для ускорения работы алгоритма при каждом возврате
регистрируется факт наличия или отсутствия обмена. Возврат, в результате
которого не было произведено ни одного обмена, заканчивает просмотр [4].
Структурограмма алгоритма сортировки представлена на рисунке 2.
Рисунок 2 - Просеивание ("челночная"
сортировка).
Сортировка осуществляется после добавления новой записи в
файл или после редактирования существующей.
3.4 Описание
алгоритма поиска
При выборе действия добавления записи открывается окно для
ввода информации. После того как пользователь заполнит все необходимые поля, в
файл будет внесена новая запись.
Бинарный (двоичный, дихотомический, половинного деления)
поиск относится к наиболее эффективным методам поиска в упорядоченной
последовательности записей. Идея этого метода состоит в том, чтобы искать ключ
А в интервале, крайними точками которого являются два указателя - Q и P,
соответствующие нижней и верхней границам поиска. Вначале А сравнивается со
средним ключом в последовательности. Результат сравнения позволит определить, в
какой половине последовательности продолжить поиск, применив к ней ту же
процедуру, и т.д. После определенного числа сравнений либо ключ будет найден,
либо будет установлено его отсутствие [4]. Структурограмма алгоритм бинарного
поиска представлена на рисунке 3.
Рисунок 3 - Бинарный поиск.
4.
Экспериментальная часть
При запуске программы перед пользователем открывается
основное окно программы (рисунок 4). Для того чтобы найти интересующую
информацию о студентах, необходимо щелкнуть мышью по соответствующей вкладке.
Содержимое этих вкладок представлено на рисунках 5 и 6.
При нажатии на кнопку "Добавить" перед
пользователем откроется окно с пустыми полями, которые необходимо заполнить
(рисунок 7).
При нажатии на кнопку "Изменить" откроется окно
"Изменение данных". В нем пользователь может редактировать
необходимую информацию (рисунок 8).
Для того, чтобы удалить некоторую информацию о студенте,
необходимо навести курсор на соответствующую строку и нажать кнопку
"Удалить". При этом программа выдаст запрос на подтверждение действия
(рисунок 9).
Рисунок 4 - Основное окно программы.
Рисунок 5 - Таблица "Результаты".
Рисунок 6 - Таблица "Оценки".
Рисунок 7 - Окно "Добавление данных".
Рисунок 8 - Изменение данных.
Рисунок 9 - Запрос на подтверждение удаления.
5. Описание
входных данных
Разработанная программа предусматривает следующие режимы
запуска:
· Запуск программы в первый раз. В этом
режиме используемые для хранения информации файлы создадутся и будут пустыми.
· Последующие запуски. В этом режиме к
входным данным относятся файлы абонентов, городов и улиц.
Файл студентов состоит из записей, которые включают в себя
следующие поля: идентификатор студента, фамилия студента, номер по журналу,
участие в НИР. Файл результатов является совокупностью записей, которые состоят
из следующих полей: идентификатор, предмет, процент сдачи. Запись в файле
оценок состоит из следующих полей: идентификатор записи, идентификатор
студента, идентификатор предмета, оценка.
К входным данным относится аргумент поиска, передаваемый в
процедуру поиска. В конкретном примере это оценка.
6. Описание
выходных данных
Для данного программного продукта выходными данными является
таблица с информацией о фамилии студента и его идентификаторе.
Выходные данные могут быть сгруппированы по следующим
критериям:
отличники;
хорошисты;
имеют двойки.
Заключение
В данной работе была разработана информационно-справочная
системы обработки результатов сдачи сессии. В данной системе реализованы
возможности:
добавление записи;
редактирование записи;
удаление записи;
сортировка данных по различным столбцам;
поиск информации по оценкам.
Программа имеет простой и удобный интерфейс. Для
использования разработанной системы не требуется специальная подготовка.
Возможно усовершенствование разработанной
информационно-справочной системы.
Список
использованных источников
1. Фаронов
В.В. Система программирования в DELPHI. СПб.: БХВ-Петербург, 2004.888 c.
2. Милов
А.В. Основы программирования в задачах и примерах: Учебный курс. Харьков:
Фолио, 2003.397 c.
. Белов
В.В., Чистякова В.И. Программирование в Delphi: Учебное пособие для вузов. М.:
Горячая линия - Телеком, 2009.240с.
. Маркин
А.В. Технология программирования: Методические указания к лабораторным работам
/ Рязан. гос. радиотехн. акад. Рязань, 2005.48 c.
Приложение
unit Unit1;, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,, StdCtrls, ComCtrls, Menus, Grids, TabNotBk, XPMan, ExtCtrls;=
(TypeString, TypeInteger);= class (TStringGrid)MoveRow (FromIndex, ToIndex:
Longint);;= record: integer;: string [20];: integer;: boolean;;= record:
integer;: string [20];: string [3];;= record: integer;: integer;: integer;:
integer;;= class (TForm): TMainMenu;: TMenuItem;: TMenuItem;: TMenuItem;:
TMenuItem;: TMenuItem;: TPanel;: TGroupBox;: TButton;: TButton;: TButton;:
TRadioGroup;: TTabbedNotebook;: TStringGrid;: TStringGrid;: TStringGrid;: TGroupBox;:
TButton;: TButton;: TStringGrid;: TRadioGroup;: TGroupBox;: TButton;:
TXPManifest;Button4Click (Sender: TObject);N3Click (Sender: TObject);FormCreate
(Sender: TObject);N2Click (Sender: TObject);N5Click (Sender:
TObject);Button15Click (Sender: TObject);Button14Click (Sender:
TObject);Button1Click (Sender: TObject);StringGrid1MouseUp (Sender: TObject;
Button: TMouseButton;: TShiftState; X, Y: Integer);StringGrid2MouseUp (Sender:
TObject; Button: TMouseButton;: TShiftState; X, Y: Integer);StringGrid3MouseUp
(Sender: TObject; Button: TMouseButton;: TShiftState; X, Y:
Integer);Button3Click (Sender: TObject);StringGrid4MouseUp (Sender: TObject;
Button: TMouseButton;: TShiftState; X, Y: Integer);Button2Click (Sender:
TObject);BinaryFind (aStart: integer; aVal: string; aCol: integer;:
TStringGrid): integer;SortDelayString (tabl: TStringGrid; aCol: integer;
SorType: TType);
{ Private declarations }SortString (tabl: TStringGrid; aCol:
integer; SorType: TType);;: TForm1;: file of TStudent;: file of TResults;: file
of TMark;: integer = 1;: integer = 0;: integer = 0;;
{$R *. dfm}TStringGridX. MoveRow (FromIndex, ToIndex:
Integer);;;TForm1. Button14Click (Sender: TObject);: integer;. Caption: =
'Изменение данных';TabbedNotebook1. PageIndex of
: begin: = StringGrid1. Row;form6 do. EditLabel. Caption: =
'Идентификатор';. EditLabel. Caption: = 'Фамилия';. EditLabel. Caption: =
'Номер по журналу';. EditLabel. Caption: = 'Участие в НИР';. Text: =
StringGrid1. Cells [0, RowIndex];. Text: = StringGrid1. Cells [1, RowIndex];.
Text: = StringGrid1. Cells [2, RowIndex];. Text: = StringGrid1. Cells [3,
RowIndex];. Visible: = true;Form6. ShowModal = mrOk thenStringGrid1, Form6
do[0, RowIndex]: = LabeledEdit1. Text;[1, RowIndex]: = LabeledEdit2. Text;[2,
RowIndex]: = LabeledEdit3. Text;[3, RowIndex]: = LabeledEdit4. Text;;;;
: begin: = StringGrid2. Row;form6 do. EditLabel. Caption: =
'Идентификатор';. EditLabel. Caption: = 'Предмет';. EditLabel. Caption: =
'Процент сдачи';. Visible: = false;. Text: = StringGrid2. Cells [0, RowIndex];.
Text: = StringGrid2. Cells [1, RowIndex];. Text: = StringGrid2. Cells [2,
RowIndex];. Visible: = false;;Form6. ShowModal = mrOk thenStringGrid2, Form6
do[0, RowIndex]: = LabeledEdit1. Text;[1, RowIndex]: = LabeledEdit2. Text;[2,
RowIndex]: = LabeledEdit3. Text;;;
: begin: = StringGrid3. Row;form6 do. EditLabel. Caption: =
'Идентификатор записи';. EditLabel. Caption: = 'Идентификатор студента';.
EditLabel. Caption: = 'Идентификатор предмета';. EditLabel. Caption: =
'Оценка';. Visible: = true;. Text: = StringGrid3. Cells [0, RowIndex];. Text: =
StringGrid3. Cells [1, RowIndex];. Text: = StringGrid3. Cells [2, RowIndex];.
Text: = StringGrid3. Cells [3, RowIndex];;Form6. ShowModal = mrOk
thenStringGrid3, Form6 do[0, RowIndex]: = LabeledEdit1. Text;[1, RowIndex]: =
LabeledEdit2. Text;[2, RowIndex]: = LabeledEdit3. Text;[3, RowIndex]: =
LabeledEdit4. Text;;;;;TForm1. Button15Click (Sender: TObject);, j: integer;.
Caption: = 'Добавление данных';. LabeledEdit1. Text: = '';. LabeledEdit2. Text:
= '';. LabeledEdit3. Text: = '';. LabeledEdit4. Text: = '';TabbedNotebook1.
PageIndex of
: beginform6 do. EditLabel. Caption: = 'Идентификатор';.
EditLabel. Caption: = 'Фамилия';. EditLabel. Caption: = 'Номер по журналу';.
EditLabel. Caption: = 'Участие в НИР';. Visible: = true;;: = 0;StringGrid1.
Cells [0, i] <> '' do(i);i > StringGrid1. RowCount then. RowCount: =
StringGrid1. RowCount + 1;: = StringGrid1. RowCount;;;;Form6. ShowModal = mrOk
thenStringGrid1, Form6 do[0, i]: = LabeledEdit1. Text;[1, i]: = LabeledEdit2.
Text;[2, i]: = LabeledEdit3. Text;[3, i]: = LabeledEdit4. Text;;;
: begin. LabeledEdit1. EditLabel. Caption: =
'Идентификатор';. LabeledEdit2. EditLabel. Caption: = 'Предмет';. LabeledEdit3.
EditLabel. Caption: = 'Процент сдачи';. LabeledEdit4. Visible: = false;: =
0;StringGrid2. Cells [0, i] <> '' do(i);i > StringGrid2. RowCount
then. RowCount: = StringGrid2. RowCount + 1;: = StringGrid2. RowCount;;;;Form6.
ShowModal = mrOk thenStringGrid2, Form6 do[0, i]: = LabeledEdit1. Text;[1, i]:
= LabeledEdit2. Text;[2, i]: = LabeledEdit3. Text;;;
: begin. LabeledEdit1. EditLabel. Caption: = 'Идентификатор
записи';. LabeledEdit2. EditLabel. Caption: = 'Идентификатор студента';.
LabeledEdit3. EditLabel. Caption: = 'Идентификатор предмета';. LabeledEdit4.
EditLabel. Caption: = 'Оценка';. LabeledEdit4. Visible: = true;: =
0;StringGrid3. Cells [0, i] <> '' do(i);i > StringGrid3. RowCount
then. RowCount: = StringGrid3. RowCount + 1;: = StringGrid3. RowCount;;;;Form6.
ShowModal = mrOk thenStringGrid3, Form6 do[0, i]: = LabeledEdit1. Text;[1, i]:
= LabeledEdit2. Text;[2, i]: = LabeledEdit3. Text;[3, i]: = LabeledEdit4.
Text;;;;;GridDeleteRow (RowNumber: Integer; Grid: TstringGrid);: Integer;. Row:
= RowNumber;(Grid. Row = Grid. RowCount - 1) then
{ On the last row}. RowCount: = Grid. RowCount - 1
{ Not the last row}i: = RowNumber to Grid. RowCount - 1 do.
Rows [i]: = Grid. Rows [i + 1];. RowCount: = Grid. RowCount - 1;;;TForm1.
Button1Click (Sender: TObject);: TStrings;: array of TStrings;, j: integer;:
boolean;: = false;TabbedNotebook1. PageIndex of
: if StringGrid1. Cells [0, 1] = '' then: = true;
: if StringGrid2. Cells [0, 1] = '' then: = true;
: if StringGrid3. Cells [0, 1] = '' then: = true;;flag
then('Все записи удалены', mtInformation, [mbOk], 0)(MessageDlg ('Удалить
запись? ', mtConfirmation, [mbOk, mbCancel], 0) = mrOk) thenTabbedNotebook1.
PageIndex of
: GridDeleteRow (StringGrid1. Row, StringGrid1);
: GridDeleteRow (StringGrid2. Row, StringGrid3);
: GridDeleteRow (StringGrid3. Row, StringGrid3);;;TForm1.
SortDelayString;, n, i: integer;: integer;: boolean;: integer;: array [1.50] of
string;
// FindCount: = 0;: = 0;I: = 1 to tabl. RowCount doTabl.
Cells [aCol, i] <> '' then(n);: = n;
// for j: = 1 to n - 1 do: = cIndex;: = j;: = 0;SorType of:
res: = (Tabl. Cells [aCol, i] > Tabl. Cells [aCol, i + 1]);: res: =
(strtoint (Tabl. Cells [aCol, i]) > strtoint (Tabl. Cells [aCol, i +
1]));;res then(Tabl). MoveRow (i, i+1);: = 1;(i);(FindCount, 1);;(flag = 0) or
(i = 0);;('Неверные данные! ', mtWarning, [mbOk], 0);;(cIndex);cIndex >
cCount - 1 then: = 1;FindCount > 0 then('Сортировка закончена! Шагов: ' +
inttostr (FindCount), mtWarning, [mbOk], 0);;;TForm1. Button2Click (Sender:
TObject);: integer;: = RadioGroup1. ItemIndex;TabbedNotebook1. PageIndex of
: beginARow in [1, 3] then(StringGrid1, aRow,
TypeString);Arow in [0, 2] then(StringGrid1, aRow, TypeInteger);;
: beginArow = 1 then(StringGrid2, aRow, TypeString);Arow in
[0, 2] then(StringGrid2, aRow, TypeInteger);;
: begin(StringGrid3, aRow, TypeInteger);;
: begin(ARow = 0) then(StringGrid4, aRow, TypeInteger);(ARow
= 1) then(StringGrid4, aRow, TypeString);;;;TForm1. Button3Click (Sender:
TObject);: integer;: = RadioGroup1. ItemIndex;TabbedNotebook1. PageIndex of
: beginARow in [1, 3] then(StringGrid1, aRow,
TypeString);Arow in [0, 2] then(StringGrid1, aRow, TypeInteger);;
: beginArow = 1 then(StringGrid2, aRow, TypeString);Arow in
[0, 2] then(StringGrid2, aRow, TypeInteger);;
: begin(StringGrid3, aRow, TypeInteger);;
: begin(ARow = 0) then(StringGrid3, aRow, TypeInteger);(ARow
= 1) then(StringGrid3, aRow, TypeString);;;;TForm1. Button4Click (Sender:
TObject);: string;, k, old, cnt, i: integer;: string;i: = 1 to stringgrid4.
rowcount do. Rows [i]. Clear;
// StringGrid4. Cells [0, 1]: = '';
// StringGrid4. Cells [1, 1]: = '';: = 0;: = 0;: = 0;: =
IntToStr (5 - RadioGroup2. ItemIndex);: = 1;r >= 0 do: = BinaryFind (k, s,
3, StringGrid3);: = r;r >= 0 then: = StringGrid3. Cells [1, r];. Rows [cnt].
Add (stId);: = BinaryFind (1, stId, 0, StringGrid1);r >= 0 then. Rows [cnt].
Append (StringGrid1. Cells [1, r]). Rows [cnt]. Append ('Фамилия
отсутствует');(cnt, 1);: = 0;;;;TForm1. FormCreate (Sender:
TObject);StringGrid1 do[0, 0]: = 'Идентификатор';[1, 0]: = 'Фамилия';[2, 0]: =
'Номер по журналу';[3, 0]: = 'Участие в НИР';;StringGrid2 do[0, 0]: =
'Идентификатор';[1, 0]: = 'Предмет';[2, 0]: = 'Процент сдачи';;StringGrid3
do[0, 0]: = 'Идентификатор записи';[1, 0]: = 'Идентификатор студента';[2, 0]: =
'Идентификатор предмета';[3, 0]: = 'Оценка';;StringGrid4 do[0, 0]: =
'Идентификатор';[1, 0]: = 'Фамилия';;;TForm1. N2Click (Sender: TObject);, j:
integer;: TStudent;: TResults;: TMark;TabbedNotebook1. PageIndex of
: begin(StudentFile, 'students. std');(StudentFile);: = 0;: =
1; repeatStudentRecord, StringGrid1 do(StudentFile, StudentRecord);[0, j]: =
IntToStr (ID);[1, j]: = FSTU;[2, j]: = IntToStr (NUMBER);YCHASTIE then[3, j]: =
'Да'[3, j]: = 'Нет';(j);;Eof (StudentFile);(StudentFile);;
: begin(ResultsFile, 'results. rsl');(ResultsFile);: = 0;: =
1;ResultRecord, StringGrid2 do(ResultsFile, ResultRecord);[0, j]: = IntToStr
(ID);[1, j]: = ResultRecord. NAME;[2, j]: = RESULT;(j);;Eof
(ResultsFile);(ResultsFile);;
: begin(MarksFile, 'mark. mrk');(MarksFile);: = 0;: =
1;MarkRecord, StringGrid3 do(MarksFile, MarkRecord);[0, j]: = IntToStr (ID);[1,
j]: = IntToStr (StudentID);[2, j]: = IntToStr (ResultsID);[3, j]: = IntToStr
(Mark);(j);;Eof (MarksFile);(MarksFile);;;('Неверное содержимое файла! ',
mtWarning, [mbOk], 0);;;TForm1. N3Click (Sender: TObject);: integer;: TStudent;:
TResults;: TMark;TabbedNotebook1. PageIndex of
: begin(StudentFile, 'students. std');(StudentFile);J: = 1 to
StringGrid1. RowCount - 1 doStringGrid1. Cells [0, j] <> ''
thenStudentRecord, StringGrid1 do: = StrToIntDef (Cells [0, j], - 1);: = Cells
[1, j];: = StrToIntDef (Cells [2, j], - 1);: = ( (Cells [3, j]) = 'Да') or (
(Cells [3, j]) = 'ДА') or
( (Cells [3, j]) = 'да');(StudentFile,
StudentRecord);;(StudentFile);;
: begin(ResultsFile, 'results. rsl');(ResultsFile);J: = 1 to
StringGrid2. RowCount - 1 doStringGrid2. Cells [0, j] <> ''
thenResultRecord, StringGrid2 do: = StrToIntDef (Cells [0, j], - 1);. NAME: =
Cells [1, j];: = Cells [2, j];(ResultsFile, ResultRecord);;(ResultsFile);;
: begin(MarksFile, 'mark. mrk');(MarksFile);J: = 1 to
StringGrid1. RowCount - 1 doStringGrid3. Cells [0, j] <> ''
thenMarkRecord, StringGrid3 do: = StrToIntDef (Cells [0, j], - 1);: =
StrToIntDef (Cells [1, j], - 1);: = StrToIntDef (Cells [2, j], - 1);: =
StrToIntDef (Cells [3, j], - 1);(MarksFile, MarkRecord);;(MarksFile);;;('Неверные
данные! ', mtWarning, [mbOk], 0);;;TForm1. N5Click (Sender: TObject);;TForm1.
SortString;, n, i: integer;: integer;: boolean;: array [1.50] of string;: = 0;:
= 0;I: = 1 to tabl. RowCount doTabl. Cells [aCol, i] <> '' then(n);j: = 1
to n - 1 do: = j;: = 0;SorType of: res: = (Tabl. Cells [aCol, i] > Tabl.
Cells [aCol, i + 1]);: res: = (strtoint (Tabl. Cells [aCol, i]) > strtoint
(Tabl. Cells [aCol, i + 1]));;res then(Tabl). MoveRow (i, i+1);: =
1;(i);(FindCount, 1);;(flag = 0) or (i = 0);;FindCount > 0 then('Сортировка
закончена! Шагов: ' + inttostr (FindCount), mtWarning, [mbOk], 0);('Неверные
данные! ', mtWarning, [mbOk], 0);;: = 0;;TForm1. StringGrid1MouseUp (Sender:
TObject; Button: TMouseButton;: TShiftState; X, Y: Integer);: TGridCoord;, Acol:
integer;: = StringGrid1. MouseCoord (x, y);: = Coord. Y;: = Coord. X;(Acol
>= 0) and (ARow >= 0) then(ACol = 0) thenArow in [1, 3] then(StringGrid1,
aRow, TypeString);Arow in [0, 2] then(StringGrid1, aRow,
TypeInteger);;;;TForm1. StringGrid2MouseUp (Sender: TObject; Button:
TMouseButton;: TShiftState; X, Y: Integer);: TGridCoord;, Acol: integer;: =
StringGrid2. MouseCoord (x, y);: = Coord. Y;: = Coord. X;(Acol >= 0) and
(ARow >= 0) then(ACol = 0) thenArow = 1 then(StringGrid2, aRow, TypeString);Arow
in [0, 2] then(StringGrid2, aRow, TypeInteger);;;;TForm1. StringGrid3MouseUp
(Sender: TObject; Button: TMouseButton;: TShiftState; X, Y: Integer);:
TGridCoord;, Acol: integer;: = StringGrid3. MouseCoord (x, y);: = Coord. Y;: =
Coord. X;(Acol >= 0) and (ARow >= 0) then(ACol = 0) then(StringGrid3,
aRow, TypeInteger);;;TForm1. StringGrid4MouseUp (Sender: TObject; Button:
TMouseButton;: TShiftState; X, Y: Integer);: TGridCoord;, Acol: integer;: =
StringGrid4. MouseCoord (x, y);: = Coord. Y;: = Coord. X;(Acol >= 0) and
(ARow >= 0) then(ARow = 0) then(StringGrid4, aRow, TypeInteger);(ARow = 1)
then(StringGrid4, aRow, TypeString);;;TForm1. BinaryFind (aStart: integer;
aVal: string; aCol: integer; Tabl: TStringGrid): integer;, p, i, flag:
integer;: string;: = aStart + 1; // начало диапазона: = 0; // конец диапазона;:
= - 1;i: = 1 to tabl. RowCount - 1 doTabl. Cells [0, i] <> '' then(p);
// q: = 1; // Start;
{ if (p = 0) then; }p < q then: = 1;: = - 1;: = trunc ( (q
+ p) /2);: = Tabl. Cells [aCol, i];(aVal < Tabl. Cells [aCol, i]) then: = i
- 1if True then(aVal > Tabl. Cells [aCol, i]) then: = q + 1: = 1;: =
i;;;flag = 1;;.