Логические структуры данных
Структуры и организация данных в ЭВМ 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, в котором непосредственно реализуются действия, связанные с поиском. Статические данные и структуры 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 байт). Логические структуры данных Логическая схема структуры файла 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; Алгоритм сортировки вектора аналогичен вышеописанному методу сортировки файла. Руководство пользователя Описывается сценарий интерфейсного диалога пользователя с программой. Изложение подробно иллюстрируется копиями диалоговых форм, полученных в ходе выполнения программы. 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.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|