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

1. Состав Dеlphi-проекта

Программа включает одну форму: главную, на которой и реализован интерфейс программы

На форме пристутствуют следующие компоненты:

2 компоненты TstringGrid: для отображения результатов работы программа в виде двух таблиц со значениями;

6 компонент TLabel: для отображения поясняющих надписей;

1 компонента TButton: для включения режима поиска;

1 компонента: TBitBtn: для закрытия формы и выхода из приложения;

4 компоненты TRadioButton: для выбора режима отображения кривых на компонентах Tchart (вывод графиков вместе и по отдельности);

4 компоненты TEdit: для ввода данных пользователем;

2 компоненты TChart: для отображения графиков функций;

2 компоненты TComboBox: для выбора графика, отображаемого на компоненте Tchart в режиме “показывать по отдельности”;

2 компоненты TPanel: для группировки компонент TRadioButton.

Программа содержит два модуля: главный модуль программы Project. dpr и модуль MainForm. pas, в котором непосредственно реализуются действия, связанные с поиском.

2. Статические данные и структуры

A: file of Word – файл из N элементов, интерпретируется как таблица, содержащая только целые ключи (N изменяется от Nmin до Nmax )(N*2 байта);

B : array of Word – вектор из К элементов, представляет собой набор аргументов поиска (K*2 байта);

ArA : array of Word – массив для временного хранения данных в процедуре сортировки файла A (N*2 байта);

Nmin : Word – минимальное число элементов в таблице A (2 байта);

Nmax : Word – максимальное число элементов в таблице A (2 байта);

Step : Word – шаг изменения числа элементов в таблице A (2 байта);

K : Word – число элементов в векторе B (2 байта);

T, i: Word – счетчики (2 байта);

Rnd : Word – переменная, содержащая случайное значение, генерируемое датчиком RANDOM случайных чисел из диапазона [0, 64000] (2 байта);

Fval : Word – значение текущего элемента файла A (2 байта);

SortA1, SortA2, SortAB : array [0..1, 1..4, 1..65535] of Word – значения текущего времени перед выполнением сотвуетствующего вида сортировки в цикле (2*4*65536*2 байта = 1048560 байт);

LinF1, LinF2, BinF, LinFAcc: array [0..1, 1..4, 1..65535] of Word значения текущего времени перед очередным циклом и после него в соответствующих видах поиска (2*4*65535*2 байта = 1048560 байт);

TSortA1, TSortA2, TSortAB array [1..65535] of Word – значения периодов времени, затраченного на соответствующий вид сортировки в цикле (65535*2 байта = 131070 байт);

TLinF1, TLinF2, TBinF, TLinFAcc: array [1..65535] of Word – значения периодов времени, затраченного на соответствующий вид поиска в цикле (65535*2 байта = 131070 байт);

Acc : array [1..3, 1..65535] of Word – массив, накапливающий запросы (3*65535*2 байта = 393210 байт).

3. Логические структуры данных

Логическая схема структуры файла A:

Количество элементов в файле N в процессе выполнения программы изменяется от Nmin до Nmax, т. е. создается файл из N=Nmin элементов, затем после необходимых процедур уничтожается и создается файл из

Nmin+1 элементов и так, пока N не достигнет значения Nmax

Логическая схема структуры вектора B

4. Алгоритмы обработки основных структур

Procedure tform1.fill;

Var

R : integer;

Begin

Rewrite(a);

For r:=1 to i do //наполнение файла

Begin //случайными значениями

Fval:=random(64000);

Write(a, fval);

End;

End;

Данная процедура наполняет файл i значениями, сгенерированными датчиком Random.

Файл A после выполнения первой итерации.

Файл A после выполнения второй итерации.

Файл A после выполнения последней итерации.

Procedure tform1.linfind; //линейный поиск

Var

S1, s2 : word;

Begin

For s1:=0 to k-1 do

For s2:=0 to i-1 do

Begin

Seek(a, s2);

Read(a, fval);

If (b[s1]=fval) then exit;

End;

End;

Процедура перебирает значения из вектора В, сранивая их поэлементно со значениями из файла А.

Состояние вектора и файла при:

Первой итерации второй итерации i-й итерации

1*i+1-й итерации 1*i+2-й итерации 1*i+3-й итерации

K*i+1-й итерации k *i+2-й итерации k*i+3-й итерации

Procedure tform1.binfind; //двоичный поиск

Var

S1, cou, cou1, cou2 : integer;

Label

1;

Begin

For s1:=0 to k-1 do

Begin

Cou1:=0;

Cou2:=i-1;

While cou1<=cou2 do

Begin

Cou:=(cou2+cou1) div 2;

Seek(a, cou);

Read(a, fval);

If (fval=b[s1]) then goto 1

Else if fval<b[s1] then cou1:=cou+1

Else cou2:=cou-1;

End;

1 : end;

End;

Процедура перебирает значения из вектора В, сранивая их поэлементно со значениями из файла А (файл А должен быть предварительно отсортирован), причем делит файл А пополам и сравнивает значения. Если значение из вектора В больше значения из файла А, то таким же образом исследуется левая половина файла, в противном случае – правая и т. д.

Состояние вектора и файла при:

Первой итерации

Второй итерации

Procedure tform1.linfindacc; //линейный поиск с накоплением

Var

S1, s2, cou : word;

Begin

Cou:=1;

For s1:=0 to k-1 do

For s2:=0 to i-1 do

Begin

Seek(a, s2);

Read(a, fval);

If (b[s1]=fval) then

Begin

Acc[1, cou]:=s2;

Acc[2, cou]:=s1;

Acc[3, cou]:=fval;

Cou:=cou+1;

End;

End;

End;

Алгоритм процедуры аналогичен алгоритму процедуры tform1.linfind с той разницей, что при совпадении значения в векторе и файле в двухмерный массив аcc записываются индексы файла и вектора, а также совпавшее значение.

Procedure tform1.sorta; //сортировка файла a

Var

R, d : integer;

Tmp, val : word;

Begin

Setlength(ara, i);

For r:=0 to i-1 do

Begin

Seek(a, r);

Read(a, val);

Ara[r]:=val;

End;

For r:=0 to i-2 do

For d:=r+1 to i-1 do

Begin

If (ara[r]>ara[d]) then

Begin

Tmp:=ara[r];

Ara[r]:=ara[d];

Ara[d]:=tmp;

End;

End;

Rewrite(a);

For r:=0 to i-1 do write(a, ara[r]);

End;

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

Procedure tform1.sortb; //сортировка вектора b

Var

R, d : integer;

Tmp : word;

Begin

For r:=0 to k-2 do

For d:=r+1 to k-1 do

Begin

If (b[r]>b[d]) then

Begin

Tmp:=b[r];

B[r]:=b[d];

B[d]:=tmp;

End;

End;

End;

Алгоритм сортировки вектора аналогичен вышеописанному методу сортировки файла.

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

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

1. Ввод необходимых данных.

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

В случае введения неверной информации программа выдаст соответствующее диалоговое окно:

А) при незаполнении одного из полей:

Б) при введении в одно из полей символа(ов), не являющегося(ихся) цифрой(ами):

В) при введении в поле Nmin значения, превышающего значение в поле Nmax:

Г) при введении неположительного числа(чисел) либо числа(чисел), превышающего(их) максимально допустимое значение – 65535:

2. Поиск и вычисление времени, затраченного на поиск и сортировку

Для включения режима поиска необходимо нажать кнопку с надписью “ПОИСК”

При верно введенных данных режим поиска успешно начнет работу, о чем будет свидетельствовать отсутствие диалоговых окон после нажатия кнопки “ПОИСК”. После окончания вышеуказанного процесса результаты будут представлены в таблицы 1 и 2, а также выведены в виде графиков соответствующих функций для дальнейшего анализа.

3. Анализ.

Как уже было сказано ранее, данные для анализа будут представлены в таблицах 1 и 2, а также в виде кривых.

Таблица 1 состоит из следующих граф:

– N (длина таблицы),

– tЛП1 (N) – время первого линейного поиска,

– tлп2 (N) – время второго линейного поиска,

– tДП (N) – время двоичного поиска,

TЛП-М (N) – время поиска с накоплением запросов.

Вторая таблица имеет следующие графы:

– N,

– tлп2 (N)+ tсА (N), где tСА (N) – время сортировки файла А,

– tДп (N)+ tсА (N),

– tлп-М (N)+ tсА (N)+ tсВ (N).

Справа от каждой таблицы изображены графики соответствующих функций, которые можно просматривать как вместе, так и по отдельности, для чего необходимо выбрать соответствующее положение кнопки(ок) RadioButton:

Или так:

Для просмотра определенного графика необходимо выбрать соответствующее название в выпадающем списке справа от панели с кнопками переключения режима вывода графиков (при этом, конечно, должен быть включен режим “ПО ОТДЕЛЬНОСТИ”).

При удовлетворительных результатах можно перейти к завершению приложения, в противном случае же – ввести новые данные и начать новый поиск (см. п.1).

4. Выход из программы.

Для завершения приложения необходимо нажать на кнопку “ЗАКРЫТЬ” или на крестик в правом верхнем углу.

ЗАКЛЮЧЕНИЕ

Приложение (исходные тексты всех модулей)

Исходный текст модуля Project. dpr:

Program Project;

Uses

Forms,

MainForm in ‘MainForm. pas’ {Form1};

{$R *.res}

Begin

Application. Initialize;

Application. CreateForm(TForm1, Form1);

Application. Run;

End.

Исходный текст модуля MainForm. pas:

Unit MainForm;

Interface

Uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls, TeeProcs, TeEngine, Chart, Buttons, Grids,

Series;

Type

TForm1 = class(TForm)

SgTb2: TStringGrid;

SgTb1: TStringGrid;

Label1: TLabel;

Label2: TLabel;

BtFind: TButton;

BtClose: TBitBtn;

RbTog1: TRadioButton;

RbEve1: TRadioButton;

CbSel1: TComboBox;

EdNmin: TEdit;

EdNmax: TEdit;

EdLen: TEdit;

Label4: TLabel;

Chart1: TChart;

Series1: TLineSeries;

Series2: TLineSeries;

Series3: TLineSeries;

Series4: TLineSeries;

EdStep: TEdit;

Label5: TLabel;

Label6: TLabel;

Label7: TLabel;

Chart2: TChart;

RbTog2: TRadioButton;

RbEve2: TRadioButton;

CbSel2: TComboBox;

Series5: TLineSeries;

Series6: TLineSeries;

Series7: TLineSeries;

Panel1: TPanel;

Panel2: TPanel;

Procedure rbEve1Click(Sender: TObject);

Procedure rbTog1Click(Sender: TObject);

Procedure btFindClick(Sender: TObject);

Procedure LinFind;

Procedure BinFind;

Procedure LinFindAcc;

Procedure SortA;

Procedure SortB;

Procedure Verify;

Procedure rbValClick(Sender: TObject);

Procedure rbIntClick(Sender: TObject);

Procedure Fill;

Procedure FormCreate(Sender: TObject);

Procedure cbSel1Change(Sender: TObject);

Procedure rbTog2Click(Sender: TObject);

Procedure rbEve2Click(Sender: TObject);

Procedure cbSel2Change(Sender: TObject);

Private

{ Private declarations }

Public

{ Public declarations }

End;

Var

Form1: TForm1;

A : file of Word;

B, arA : array of Word;

Nmin, Nmax, Step, K, t, i, rnd, Fval : Word;

SortA1, SortA2, SortAB, LinF1, LinF2, BinF, LinFAcc: array [0..1, 1..4, 1..65535] of Word;

TSortA1, TSortA2, TSortAB, TLinF1, TLinF2, TBinF, TLinFAcc: array [1..65535] of Word;

Acc : array [1..3, 1..65535] of Word;

Implementation

{$R *.dfm}

Procedure TForm1.Fill;

Var

R : Integer;

Begin

Rewrite(A);

For r:=1 to i do //Наполнение файла

Begin //случайными значениями

Fval:=Random(64000);

Write(A, Fval);

End;

End;

Procedure TForm1.LinFind; //Линейный поиск

Var

S1, s2 : Word;

Begin

For s1:=0 to K-1 do

For s2:=0 to i-1 do

Begin

Seek(A, s2);

Read(A, Fval);

If (B[s1]=Fval) then Exit;

End;

End;

Procedure TForm1.BinFind; //Двоичный поиск

Var

S1, cou, cou1, cou2 : integer;

Label

1;

Begin

For s1:=0 to K-1 do

Begin

Cou1:=0;

Cou2:=i-1;

While cou1<=cou2 do

Begin

Cou:=(cou2+cou1) div 2;

Seek(A, cou);

Read(A, Fval);

If (Fval=B[s1]) then goto 1

Else if Fval<B[s1] then cou1:=cou+1

Else cou2:=cou-1;

End;

1 : end;

End;

Procedure TForm1.LinFindAcc; //Линейный поиск с накоплением

Var

S1, s2, cou : Word;

Begin

Cou:=1;

For s1:=0 to K-1 do

For s2:=0 to i-1 do

Begin

Seek(A, s2);

Read(A, Fval);

If (B[s1]=Fval) then

Begin

Acc[1, cou]:=s2;

Acc[2, cou]:=s1;

Acc[3, cou]:=Fval;

Cou:=cou+1;

End;

End;

End;

Procedure TForm1.SortA; //Сортировка файла A

Var

R, d : integer;

Tmp, val : Word;

Begin

SetLength(arA, i);

For r:=0 to i-1 do

Begin

Seek(A, r);

Read(A, val);

ArA[r]:=val;

End;

For r:=0 to i-2 do

For d:=r+1 to i-1 do

Begin

If (arA[r]>arA[d]) then

Begin

Tmp:=arA[r];

ArA[r]:=arA[d];

ArA[d]:=tmp;

End;

End;

Rewrite(A);

For r:=0 to i-1 do Write(A, arA[r]);

End;

Procedure TForm1.SortB; //Сортировка вектора B

Var

R, d : integer;

Tmp : Word;

Begin

For r:=0 to K-2 do

For d:=r+1 to K-1 do

Begin

If (B[r]>B[d]) then

Begin

Tmp:=B[r];

B[r]:=B[d];

B[d]:=tmp;

End;

End;

End;

Procedure TForm1.Verify; //Проверка

Begin

If (edNmin. Text=”) or (edNmax. Text=”) or (edStep. Text=”) or (edLen. Text=”) then

Begin

ShowMessage(‘Укажите значения всех параметров!’);

Abort;

End;

Try

Nmin:=StrToInt(edNmin. Text);

Nmax:=StrToInt(edNmax. Text);

Step:=StrToInt(edStep. Text);

K:=StrToInt(edLen. Text);

Except

ShowMessage(‘Некоторые параметры указаны неверно!’);

Abort;

End;

If (StrToInt(edNmin. Text)<=0) or (StrToInt(edNmax. Text)<=0) or

(StrToInt(edStep. Text)<=0) or (StrToInt(edLen. Text)<=0) or

(StrToInt(edNmin. Text)>65535) or (StrToInt(edNmin. Text)>65535) or

(StrToInt(edStep. Text)>65535) or (StrToInt(edLen. Text)>65535) then

Begin

ShowMessage(‘Значения должны лежать в интервале 1..65535!’);

Abort;

End;

If (StrToInt(edNmin. Text)>=StrToInt(edNmax. Text)) then

Begin

ShowMessage(‘Максимальное значение таблицы должно быть меньше минимального!’);

Abort;

End;

End;

Procedure TForm1.rbEve1Click(Sender: TObject);

Begin

CbSel1.Enabled:=true;

Chart1.Series[1].Active:=false;

Chart1.Series[2].Active:=false;

Chart1.Series[3].Active:=false;

Chart1.Series[0].Active:=false;

Chart1.Series[cbSel1.ItemIndex].Active:=true;

End;

Procedure TForm1.rbTog1Click(Sender: TObject);

Begin

CbSel1.Enabled:=false;

Chart1.Series[1].Active:=true;

Chart1.Series[2].Active:=true;

Chart1.Series[3].Active:=true;

Chart1.Series[0].Active:=true;

End;

Procedure TForm1.btFindClick(Sender: TObject);

Begin

Verify;

AssignFile(A, ‘file. bin’);

Rewrite(A);

SgTb1.ColCount:=5;

SgTb1.RowCount:=Nmax-Nmin;

SetLength(B, K); //Размер вектора B

For t:=0 to K-1 do //Наполнение вектора

Begin //случайными значениями

Rnd:=Random(64000);

B[t]:=rnd;

End;

T:=1;

I:=Nmin;

While i<Nmax do //Первый линейный поиск

Begin

Fill; //Наполнение файла

DecodeTime(Time, LinF1[0, 1, t], LinF1[0, 2, t], LinF1[0, 3, t], LinF1[0, 4, t]);

LinFind;

DecodeTime(Time, LinF1[1, 1, t], LinF1[1, 2, t], LinF1[1, 3, t], LinF1[1, 4, t]);

TLinF1[t]:=Linf1[1, 4, t]+1000*LinF1[1, 3, t]-Linf1[0, 4, t]-1000*LinF1[0, 3, t];

SgTb1.Cells[0, t]:=FloatToStr(i);

SgTb1.Cells[1, t]:=FloatToStr(TLinF1[t]);

Chart1.SeriesList[0].AddXY(i, TLinF1[t], ”);

I:=i+Step;

T:=t+1;

End;

If i>=Nmax then //Поиск при

Begin //размере таблицы Nmax

I:=Nmax;

Fill;

DecodeTime(Time, LinF1[0, 1, t], LinF1[0, 2, t], LinF1[0, 3, t], LinF1[0, 4, t]);

LinFind;

DecodeTime(Time, LinF1[1, 1, t], LinF1[1, 2, t], LinF1[1, 3, t], LinF1[1, 4, t]);

TLinF1[t]:=Linf1[1, 4, t]+1000*LinF1[1, 3, t]-Linf1[0, 4, t]-1000*LinF1[0, 3, t];

SgTb1.Cells[0, t]:=FloatToStr(i);

SgTb1.Cells[1, t]:=FloatToStr(TLinF1[t]);

Chart1.SeriesList[0].AddXY(i, TLinF1[t], ”);

End;

T:=1;

I:=Nmin;

While i<Nmax do //Второй линейный поиск

Begin

Fill;

DecodeTime(Time, SortA1[0, 1, t], SortA1[0, 2, t], SortA1[0, 3, t], SortA1[0, 4, t]);

SortA; //Сортировка файла A

DecodeTime(Time, LinF2[0, 1, t], LinF2[0, 2, t], LinF2[0, 3, t], LinF2[0, 4, t]);

LinFind;

DecodeTime(Time, LinF2[1, 1, t], LinF2[1, 2, t], LinF2[1, 3, t], LinF2[1, 4, t]);

TLinF2[t]:=Linf2[1, 4, t]+1000*LinF2[1, 3, t]-Linf2[0, 4, t]-1000*LinF2[0, 3, t];

TSortA1[t]:=Linf2[1, 4, t]+1000*LinF2[1, 3, t]-SortA1[0, 4, t]-1000*SortA1[0, 3, t];

SgTb1.Cells[2, t]:=FloatToStr(TLinF2[t]);

SgTb2.Cells[0, t]:=FloatToStr(i);

SgTb2.Cells[1, t]:=FloatToStr(TSortA1[t]);

Chart1.SeriesList[1].AddXY(i, TLinF2[t], ”);

Chart2.SeriesList[0].AddXY(i, TSortA1[t], ”);

I:=i+Step;

T:=t+1;

End;

If i>=Nmax then //Поиск при

Begin //размере таблицы Nmax

I:=Nmax;

Fill;

DecodeTime(Time, SortA1[0, 1, t], SortA1[0, 2, t], SortA1[0, 3, t], SortA1[0, 4, t]);

SortA;

DecodeTime(Time, LinF2[0, 1, t], LinF2[0, 2, t], LinF2[0, 3, t], LinF2[0, 4, t]);

LinFind;

DecodeTime(Time, LinF2[1, 1, t], LinF2[1, 2, t], LinF2[1, 3, t], LinF2[1, 4, t]);

TLinF2[t]:=Linf2[1, 4, t]+1000*LinF2[1, 3, t]-Linf2[0, 4, t]-1000*LinF2[0, 3, t];

TSortA1[t]:=Linf2[1, 4, t]+1000*LinF2[1, 3, t]-SortA1[0, 4, t]-1000*SortA1[0, 3, t];

SgTb2.Cells[0, t]:=FloatToStr(i);

SgTb1.Cells[2, t]:=FloatToStr(TLinF2[t]);

SgTb2.Cells[1, t]:=FloatToStr(TSortA1[t]);

Chart1.SeriesList[1].AddXY(i, TLinF2[t], ”);

Chart2.SeriesList[0].AddXY(i, TSortA1[t], ”);

End;

T:=1;

I:=Nmin;

While i<Nmax do //Двоичный поиск

Begin

Fill;

DecodeTime(Time, SortA2[0, 1, t], SortA2[0, 2, t], SortA2[0, 3, t], SortA2[0, 4, t]);

SortA;

DecodeTime(Time, BinF[0, 1, t], BinF[0, 2, t], BinF[0, 3, t], BinF[0, 4, t]);

BinFind;

DecodeTime(Time, BinF[1, 1, t], BinF[1, 2, t], BinF[1, 3, t], BinF[1, 4, t]);

TBinF[t]:=BinF[1, 4, t]+1000*BinF[1, 3, t]-BinF[0, 4, t]-1000*BinF[0, 3, t];

TSortA2[t]:=BinF[1, 4, t]+1000*BinF[1, 3, t]-SortA2[0, 4, t]-1000*SortA2[0, 3, t];

SgTb1.Cells[3, t]:=FloatToStr(TBinF[t]);

SgTb2.Cells[2, t]:=FloatToStr(TSortA2[t]);

Chart1.SeriesList[2].AddXY(i, TBinF[t], ”);

Chart2.SeriesList[1].AddXY(i, TSortA2[t], ”);

I:=i+Step;

T:=t+1;

End;

If i>=Nmax then //Поиск при

Begin //размере таблицы Nmax

I:=Nmax;

Fill;

DecodeTime(Time, SortA2[0, 1, t], SortA2[0, 2, t], SortA2[0, 3, t], SortA2[0, 4, t]);

SortA;

DecodeTime(Time, BinF[0, 1, t], BinF[0, 2, t], BinF[0, 3, t], BinF[0, 4, t]);

LinFind;

DecodeTime(Time, BinF[1, 1, t], BinF[1, 2, t], BinF[1, 3, t], BinF[1, 4, t]);

TBinF[t]:=BinF[1, 4, t]+1000*BinF[1, 3, t]-BinF[0, 4, t]-1000*BinF[0, 3, t];

TSortA2[t]:=BinF[1, 4, t]+1000*BinF[1, 3, t]-SortA2[0, 4, t]-1000*SortA2[0, 3, t];

SgTb1.Cells[3, t]:=FloatToStr(TBinF[t]);

SgTb2.Cells[2, t]:=FloatToStr(TSortA2[t]);

Chart1.SeriesList[2].AddXY(i, TBinF[t], ”);

Chart2.SeriesList[1].AddXY(i, TSortA2[t], ”);

End;

T:=1;

I:=Nmin;

While i<Nmax do //Линейный поиск

Begin //с накоплением

Fill;

DecodeTime(Time, SortAB[0, 1, t], SortAB[0, 2, t], SortAB[0, 3, t], SortAB[0, 4, t]);

SortA;

SortB; //Сортировка вектора B

DecodeTime(Time, LinFAcc[0, 1, t], LinFAcc[0, 2, t], LinFAcc[0, 3, t], LinFAcc[0, 4, t]);

LinFindAcc;

DecodeTime(Time, LinFAcc[1, 1, t], LinFAcc[1, 2, t], LinFAcc[1, 3, t], LinFAcc[1, 4, t]);

TLinFAcc[t]:=LinFAcc[1, 4, t]+1000*LinFAcc[1, 3, t]-LinFAcc[0, 4, t]-1000*LinFAcc[0, 3, t];

TSortAB[t]:=LinFAcc[1, 4, t]+1000*LinFAcc[1, 3, t]-SortAB[0, 4, t]-1000*SortAB[0, 3, t];

SgTb1.Cells[4, t]:=FloatToStr(TLinFAcc[t]);

SgTb2.Cells[3, t]:=FloatToStr(TSortAB[t]);

Chart1.SeriesList[3].AddXY(i, TLinFAcc[t], ”);

Chart2.SeriesList[2].AddXY(i, TSortAB[t], ”);

I:=i+Step;

T:=t+1;

End;

If i>=Nmax then //Поиск при

Begin //размере таблицы Nmax

I:=Nmax;

Fill;

DecodeTime(Time, SortAB[0, 1, t], SortAB[0, 2, t], SortAB[0, 3, t], SortAB[0, 4, t]);

SortA;

SortB;

DecodeTime(Time, LinFAcc[0, 1, t], LinFAcc[0, 2, t], LinFAcc[0, 3, t], LinFAcc[0, 4, t]);

LinFindAcc;

DecodeTime(Time, LinFAcc[1, 1, t], LinFAcc[1, 2, t], LinFAcc[1, 3, t], LinFAcc[1, 4, t]);

TLinFAcc[t]:=LinFAcc[1, 4, t]+1000*LinFAcc[1, 3, t]-LinFAcc[0, 4, t]-1000*LinFAcc[0, 3, t];

TSortAB[t]:=LinFAcc[1, 4, t]+1000*LinFAcc[1, 3, t]-SortAB[0, 4, t]-1000*SortAB[0, 3, t];

SgTb1.Cells[4, t]:=FloatToStr(TLinFAcc[t]);

SgTb2.Cells[3, t]:=FloatToStr(TSortAB[t]);

Chart1.SeriesList[3].AddXY(i, TLinFAcc[t], ”);

Chart2.SeriesList[2].AddXY(i, TSortAB[t], ”);

End;

SgTb1.RowCount:=t+1;

CloseFile(A);

Erase(A);

Finalize(B);

End;

Procedure TForm1.rbValClick(Sender: TObject);

Begin

EdNmax. Visible:=false;

EdStep. Visible:=false;

End;

Procedure TForm1.rbIntClick(Sender: TObject);

Begin

EdNmax. Visible:=true;

EdStep. Visible:=true;

End;

Procedure TForm1.FormCreate(Sender: TObject);

Begin

Randomize;

SgTb1.Cells[0, 0]:=’N’;

SgTb1.Cells[1, 0]:=’tЛП1′;

SgTb1.Cells[2, 0]:=’tЛП2′;

SgTb1.Cells[3, 0]:=’tДП’;

SgTb1.Cells[4, 0]:=’tЛП-М’;

SgTb2.Cells[0, 0]:=’N’;

SgTb2.Cells[1, 0]:=’tЛП2+tСA’;

SgTb2.Cells[2, 0]:=’tДП+tСA’;

SgTb2.Cells[3, 0]:=’tЛП-М+tС’;

CbSel1.ItemIndex:=0;

CbSel2.ItemIndex:=0;

RbTog1.Checked:=true;

RbTog2.Checked:=true;

End;

Procedure TForm1.cbSel2Change(Sender: TObject);

Begin

Chart2.Series[0].Active:=false;

Chart2.Series[1].Active:=false;

Chart2.Series[2].Active:=false;

Chart2.Series[cbSel2.ItemIndex].Active:=true;

End;

Procedure TForm1.cbSel1Change(Sender: TObject);

Begin

Chart1.Series[1].Active:=false;

Chart1.Series[2].Active:=false;

Chart1.Series[3].Active:=false;

Chart1.Series[0].Active:=false;

Chart1.Series[cbSel1.ItemIndex].Active:=true;

End;

Procedure TForm1.rbEve2Click(Sender: TObject);

Begin

CbSel2.Enabled:=true;

Chart2.Series[0].Active:=false;

Chart2.Series[1].Active:=false;

Chart2.Series[2].Active:=false;

Chart2.Series[cbSel2.ItemIndex].Active:=true;

End;

Procedure TForm1.rbTog2Click(Sender: TObject);

Begin

CbSel2.Enabled:=false;

Chart2.Series[0].Active:=true;

Chart2.Series[1].Active:=true;

Chart2.Series[2].Active:=true;

End;

End.


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