Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2013, 19:49   #1
BJIagu
 
Регистрация: 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.
BJIagu вне форума Ответить с цитированием
Старый 01.04.2013, 19:49   #2
BJIagu
 
Регистрация: 24.02.2013
Сообщений: 7
По умолчанию

Код:
// отмечаем критические работы
    for I:=1 to K do
        for V:=I+1 to K do
        begin
            Edge[I][V].Grey:=False;
            if (Vertex[V].Min - Vertex[I].Min = Vertex[V].Max - Vertex[I].Max) and
               (Vertex[V].Min - Vertex[I].Min = Edge[I][V].Value) and
               (Vertex[I].Critical and Vertex[V].Critical) then
            begin
                Edge[I][V].Grey:=True;
                Memo1.Lines.Add(Edge[I][V].Job);
            end;
        end;

    // находим резервы времени для некритических работ
    for I:=1 to K do
        for V:=I+1 to K do
            if not Edge[I][V].Grey and (Edge[I][V].Value <> 0) then
            begin
                Edge[I][V].Max_Reserv:=Vertex[V].Max - Vertex[I].Min - Edge[I][V].Value;
                Edge[I][V].Min_Reserv:=Vertex[V].Min - Vertex[I].Min - Edge[I][V].Value;
            end;

    Label1.Caption:=Format('Минимальное время выполнения всей работы = %d единиц времени, критические работы:', [Vertex[K].Min]);
    Calc:=True;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
    if not Calc then
    begin
        MessageBox(Handle, 'Сначала рассчитайте!', '', MB_ICONEXCLAMATION);
        Exit;
    end;
    with TForm2.Create(nil) do
    begin
        ShowModal;
        Free;
    end;
end;

end.

Последний раз редактировалось Stilet; 01.04.2013 в 22:20.
BJIagu вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа со StringGrid ne_znaika C++ Builder 1 15.11.2012 13:13
работа со StringGrid TIXIY Помощь студентам 9 09.10.2012 16:50
Работа с StringGrid sanchosss Помощь студентам 0 26.05.2011 15:23
Работа со StringGrid Vikulichka Помощь студентам 1 17.03.2011 15:38
работа со StringGrid student_63 Помощь студентам 1 11.11.2007 16:09