Регистрация: 24.02.2013
Сообщений: 7
|
Работа с StringGrid
Всем привет! Очень простое задание, но не для меня
Таблица состоит из 3 столбцов,
|Работа | Длина Min | Длина Max |
Столбец работа -заполнен
Длина Min - решен
мне необходимо чтобы только столбец "Длина Max" вычислялся так же как и "Длина Min" и выводил в Label2
Код:
procedure get_addr(const st:string; var X, Y:Integer);
type Uzel = record
Min, Max, Diff:Integer;
Critical:Boolean;
end;
Rebro = record
Value:Integer;
Grey:Boolean;
Max_Reserv, Min_Reserv:Integer;
Job:string;
end;
const K = 8;
{Mas:array[1..K, 1..K] of Integer =
((0, 1, 25, 0, 10, 0, 0, 0),
(0, 0, 17, 18, 12, 0, 0, 0),
(0, 0, 0, 14, 3, 0, 16, 0),
(0, 0, 0, 0, 0, 10, 0, 0),
(0, 0, 0, 9, 0, 20, 20, 15),
(0, 0, 0, 0, 0, 0, 0, 5),
(0, 0, 0, 0, 0, 0, 0, 1),
(0, 0, 0, 0, 0, 0, 0, 0));}
Mas:array[1..K, 1..K] of Integer =
((0, 12, 15, 0, 10, 0, 0, 0),
(0, 0, 0, 8, 15, 6, 0, 0),
(0, 0, 0, 0, 1, 0, 16, 0),
(0, 0, 0, 0, 0, 3, 0, 30),
(0, 0, 0, 0, 0, 8, 3, 2),
(0, 0, 0, 0, 0, 0, 0, 5),
(0, 0, 0, 0, 0, 0, 0, 25),
(0, 0, 0, 0, 0, 0, 0, 0));
var job_str:array[1..K, 1..K] of string;
Vertex:array[1..K] of uzel;
Edge:array[1..K, 1..K] of rebro;
implementation
{$R *.dfm}
uses Unit2;
var Calc:Boolean;
procedure get_addr(const St:string; var X, Y:Integer);
var I, J:Integer;
begin
for I:=1 to K do
for J:=1 to K do
if Job_Str[I][J] = St then
begin
X:=I;
Y:=J;
exit;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var I, J:Integer;
begin
Grid.RowCount:=1;
Grid.Cells[0, 0]:='Работа';
Grid.Cells[1, 0]:='длина Min';
Grid.Cells[2, 0]:='Длина Max';
for I:=1 to K do
begin
for J:=I+1 to K do Job_Str[I][J]:=Format('%d.%d', [I, J]);
for J:=1 to I-1 do Job_Str[I][J]:=Format('%d.%d', [I, J]);;
end;
for I:=1 to K-1 do
for J:=2 to K do
if Mas[I, J] <> 0 then
begin
Grid.RowCount:=Grid.RowCount + 1;
Grid.Cells[0, Grid.RowCount-1]:=Job_Str[I][J];
end;
Grid.FixedRows:=1;
Grid.ColWidths[0]:=200;
for I:=1 to K do
for J:=1 to K do
begin
Edge[I][J].Value:=Mas[I][J];
Edge[I][J].Job:=Job_Str[I][J];
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var I, V, Max, Min, X, Y:Integer;
begin
// очищаем все
for I:=1 to K do
begin
Vertex[I].Min:=0;
Vertex[I].Max:=0;
Vertex[I].Diff:=0;
Vertex[I].Critical:=False;
end;
Memo1.Clear;
// согласуем данные с формой
for I:=1 to Grid.RowCount - 1 do
begin
get_addr(Grid.Cells[0, I], X, Y);
Edge[X][Y].Value:=StrToInt(Grid.Cells[1, I]);
end;
// находим ранние сроки для всех работ
for V:=2 to K do
begin
Max:=0;
for I:=1 to K do
if (Edge[I][V].Value <> 0) and (Vertex[I].Min + Edge[I][V].Value > Max) then
Max:=Vertex[I].Min + Edge[I][V].Value;
Vertex[V].Min:=Max;
end;
// поздний срок последней работы равен раннему сроку этой работы
Vertex[K].Max:=Vertex[K].Min;
// находим поздние сроки для всех работ
for V:=K-1 downto 1 do
begin
Min:=MaxInt;
for I:=K downto V+1 do
if (Edge[V][I].Value <> 0) and (Vertex[I].Max - Edge[V][I].Value < Min) then
Min:=Vertex[I].Max - Edge[V][I].Value;
Vertex[V].Max:=Min;
end;
// находим критические работы
for I:=1 to K do
begin
Vertex[I].Diff:=Vertex[I].Max - Vertex[I].Min;
if Vertex[I].Diff = 0 then Vertex[I].Critical:=True;
end;
За ранее благодарю
Последний раз редактировалось Stilet; 01.04.2013 в 22:19.
|