unit Vvod; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls, Buttons; type TForm2 = class(TForm) Label1: TLabel; Label2: TLabel; Button1: TButton; Label3: TLabel; Label5: TLabel; Label7: TLabel; Edit1: TEdit; Label8: TLabel; Label9: TLabel; Edit2: TEdit; Label10: TLabel; Edit3: TEdit; BitBtn1: TBitBtn; BitBtn2: TBitBtn; Label4: TLabel; Button2: TButton; procedure Open(Sender: TObject); procedure Button1Click(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure BitBtn2Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form2: TForm2; koldet, Stroka: integer; f: text; implementation uses Jonson; {$R *.dfm} procedure TForm2.Button1Click(Sender: TObject); begin Close; end; procedure TForm2.Open(Sender: TObject); begin koldet := StrToInt(Form1.Edit1.text); Stroka := 0; //счетчик строк для записи в файл AssignFile(f,'data.dat'); {$I-} Rewrite (f); //проверка создания файла if IOResult = 0 then BitBtn1.Enabled := true else begin Rewrite (f); if IOResult = 0 then BitBtn1.Enabled := true else ShowMessage ('Ошибка создания файла') ; end; end; procedure TForm2.BitBtn1Click(Sender: TObject); begin //проверка корректности и заполнение файла if (length (Edit1.Text)=0) or (length (Edit2.Text)=0) or (length (Edit3.Text)=0) then ShowMessage ('Ошибка ввода данных.' +#13+'Все поля должны быть заполненны!') else begin Writeln (f, Edit1.text); Stroka := Stroka+1; Edit1.Text := ''; Writeln (f, Edit2.text); Stroka := Stroka+1; Edit2.Text := ''; Writeln (f, Edit3.text); Stroka := Stroka+1; Edit3.Text := ''; if Stroka = koldet*3 then begin BitBtn1.Enabled := false ; bitBtn2.Enabled := true; end; end; end; procedure TForm2.BitBtn2Click(Sender: TObject); var w, q, i, j, kontr, pr, pn, k, a, iter: integer; t, mas: array [1..2,1..9999] of integer; name: array [1..9999] of string; SG : TStringGrid; SGv : TStringGrid; s: string; begin CloseFile(f); Label7.Visible := true; Label1.Visible := false; Label2.Visible :=false; koldet := StrToInt(Form1.Edit1.text); SG := TStringGrid.Create(Application); //создание массива SG.Parent := Form2; //(таблицы) для вывода данных SG.Left := 32; SG.Top := 72; SG.Width := 300; SG.Height := 209; SG.TabOrder := 1; SG.ColCount := 3; SG.RowCount := koldet+1; SG.ScrollBars := ssVertical; SG.FixedCols := 0; SG.FixedRows := 1; SG.DefaultColWidth := 95; SG.Cells[0,0] := 'Имя элемента'; SG.Cells[1,0] := 'Время пр. А'; SG.Cells[2,0] := 'Время пр. В'; SGv := TStringGrid.Create(Application); //создание массива SGv.Parent := Form2; //для вывода очереди SGv.Left := 40; SGv.Top := 336 ; SGv.Width := 217 ; SGv.Height := 49 ; SGv.TabOrder := 6 ; SGv.ColCount := koldet; SGv.RowCount := 1; SGv.ScrollBars := ssHorizontal; SGv.FixedCols := 0; SGv.FixedRows := 0; SGv.DefaultColWidth := 60; AssignFile (f, 'data.dat'); //считывание данных из {$I-} //файла в таблицу Reset (f); {$I+} for j := 1 to koldet do for i := 1 to 3 do begin readln (f, s); SG.Cells [i-1,j] := s; end; //считывание значений времени в массив для //дальнейшего использования for i := 1 to 2 do for j := 1 to koldet do begin t[i,j] := StrToInt(SG.Cells[i,j]); end; //построение очереди w := 1; q := koldet; iter := 0; //счетчик итераций Repeat kontr := 9999; pn := 1; //порядковый номер для выявления //нужного имени pr := 1; //переменная для определения, к какому //процессу принадлежит найденное время for i := 1 to 2 do for j := 1 to koldet do begin if t[i,j] < kontr then begin kontr := t[i,j]; pn := j; pr := i; end; end; //определение порядкового номера имени: //w - начало очереди, q - конец очереди if pr = 1 then begin name[w] := SG.Cells[0,pn]; for k := 1 to 2 do mas[k,w] := t[k,pn]; //составление времени в том же //порядке, что и имена //начало очереди w := w+1; end else begin name[q] := SG.Cells[0,pn]; for k := 1 to 2 do mas[k,q] := t[k,pn]; //составление времени в том же //порядке, что и имена //конец очереди q := q-1; end; for k := 1 to 2 do t[k,pn] := 9999; iter := iter+1; until iter = koldet; //вывод очереди по порядку на экран for pn := 1 to koldet do SGv.Cells [pn-1,0] := name[pn]; BitBtn2.Enabled := false; //расчет времени простоя pn := mas[1,1]; pr := 0; for a := 1 to koldet-1 do if mas[2,a] < mas[1,a+1] then begin pn := pn + mas[1,a+1] - mas[2,a] - pr; pr := 0 ; end else pr := mas[2,a] - mas[1,a+1]; if pn < mas[1,1] then pn := mas[1,1]; //вывод времени на экран Label4.Caption := IntToStr(pn) + ' ед. времени'; end; procedure TForm2.Button2Click(Sender: TObject); begin Form1.Edit1.Text := ''; Form1.Show; Close; end; end.