Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Симплекс-метод.... пишу программу для курсовой


Автор: Anchuta88 20.6.2010, 15:25
Пишу курсовую по матмоделям... Надо написать программу решения задачи линейного программирования симплекс-методом (минимизация)... Писала на примере максимизации...
При выполнении команды выдает такое сообщение:
Project1.exe raised exception class EConvertError with message"X1' is not a valid floating point value' Process stopped. Use Step or Run to continue
Пожалуйста помогите, объяснте что не так((( я в программировании не шарю smile 
Вот код программы:
Код

unit Kursovaya_MatMod;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Edit9: TEdit;
    Edit10: TEdit;
    Edit11: TEdit;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    StringGrid1: TStringGrid;
    Button1: TButton;
    Button2: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
StringGrid1.ColCount:=7;
StringGrid1.RowCount:=5;
StringGrid1.cells[0,1]:='Z';
StringGrid1.cells[0,2]:='S1';
StringGrid1.cells[0,3]:='S2';
StringGrid1.cells[0,4]:='S3';
StringGrid1.cells[1,0]:='X1';
StringGrid1.cells[2,0]:='X2';
StringGrid1.cells[3,0]:='S1';
StringGrid1.cells[4,0]:='S2';
StringGrid1.cells[5,0]:='S3';
StringGrid1.cells[6,0]:='Решение';

// z-строка
StringGrid1.cells[1,1]:=FloatToStr(StrToFloat(Edit1.Text)*(-1));
StringGrid1.cells[2,1]:=FloatToStr(StrToFloat(Edit2.Text)*(-1));
StringGrid1.cells[3,1]:='0';
StringGrid1.cells[4,1]:='0';
StringGrid1.cells[5,1]:='0';
StringGrid1.cells[6,1]:='0';

// S1-строка
StringGrid1.cells[1,2]:=FloatToStr(StrToFloat(Edit3.Text)*(-1));
StringGrid1.cells[2,2]:=FloatToStr(StrToFloat(Edit4.Text)*(-1));
StringGrid1.cells[3,2]:='1';
StringGrid1.cells[4,2]:='0';
StringGrid1.cells[5,2]:='0';
StringGrid1.cells[6,2]:=FloatToStr(StrToFloat(Edit5.Text)*(-1));

// S2-строка
StringGrid1.cells[1,3]:=FloatToStr(StrToFloat(Edit6.Text)*(-1));
StringGrid1.cells[2,3]:=FloatToStr(StrToFloat(Edit7.Text)*(-1));
StringGrid1.cells[3,3]:='0';
StringGrid1.cells[4,3]:='1';
StringGrid1.cells[5,3]:='0';
StringGrid1.cells[6,3]:=FloatToStr(StrToFloat(Edit8.Text)*(-1));

// S3-строка
StringGrid1.cells[1,4]:=FloatToStr(StrToFloat(Edit9.Text)*(-1));
StringGrid1.cells[2,4]:=FloatToStr(StrToFloat(Edit10.Text)*(-1));
StringGrid1.cells[3,4]:='0';
StringGrid1.cells[4,4]:='0';
StringGrid1.cells[5,4]:='1';
StringGrid1.cells[6,4]:=FloatToStr(StrToFloat(Edit11.Text)*(-1));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  A, Amax, VedEl: real;
  i, j, VedStol, VedSt: integer;
begin
// Поиск ведущего столбца

Amax := -9999;
for i := 1 to 2 do
  begin
    A := StrToFloat(StringGrid1.Cells[i,1]);
    if A > Amax Then
      begin
        Amax := A;
        VedStol :=i;
      end;
  end;

// Поиск ведущей строки

Amax := -9999;
for i:=2 to 4 do
  begin
    A := StrToFloat(StringGrid1.Cells[6,i]);
    if ((A/StrToFloat(StringGrid1.Cells[VedStol, i])) > Amax)
    and ((StrToFloat(StringGrid1.cells[VedStol, i])) > 0) then
    begin
      Amax := A/StrToFloat(StringGrid1.Cells[VedStol, i]);
      VedSt := i;
    end;
  end;
VedEl := StrToFloat(StringGrid1.Cells[VedStol, VedSt]);

// Пересчет ведущей строки

for i := 1 to 6 do
begin
  StringGrid1.Cells[i, VedSt] := FloatToStr(StrToFloat(StringGrid1.Cells[i, VedSt])/VedEl);
end;
  ListBox1.Items.Add('Строка '+FloatToStr(VedStol)+' строка '+FloatToStr(VedSt));
  ListBox1.Items.Add('Ведущий элемент '+FloatToStr(VedEl));

// Пересчет строк

  for j := 1 to 4 do
  begin
    if j <> VedSt then
    begin
      VedEl := StrToFloat(StringGrid1.Cells[VedStol, j]);
      for i := 1 to 6 do
      begin
        StringGrid1.Cells[i, j] := FloatToStr(StrToFloat(StringGrid1.Cells[i,j]) - StrToFloat(StringGrid1.Cells[i, VedSt]) * VedEl);
      end;
    end;
  end;
StringGrid1.Cells[0, VedSt] := StringGrid1.Cells[VedStol, 0];



// Вывод результатов
Amax := 0;
for i := 1 to 6 do
  begin
  A := StrToFloat(StringGrid1.Cells[i, 1]);
  if A < 0 then
    begin
      Amax := Amax + 1;
    end;
  end;
if Amax = 0 then
  begin
    for i := 1 to 4 do
    begin
      if Pos('x', StringGrid1.Cells[0, i])>0 then ListBox1.Items.Add(StringGrid1.Cells[0, i] + ' = ' +  StringGrid1.Cells[6, i]);
      if StringGrid1.Cells[0, i] = 'z' then ListBox1.Items.Add(StringGrid1.Cells[0, i] + ' = ' + StringGrid1.Cells[6, i]);
    end;
  end;

end;

end.

Автор: ~FoX~ 20.6.2010, 22:44
Anchuta88, На какой строке?.....Судя по сообщению, ошибка в преобразовании "X1"

Автор: Anchuta88 21.6.2010, 09:23
Я вот понять и не могу... он выделяет строки в Project1  smile 

А так еще такие сообщения выдает:
[Warning] Kursovaya_MatMod.pas(130): Variable 'VedSt' might not have been initialized // в этой строке VedEl := StrToFloat(StringGrid1.Cells[VedStol, VedSt]);
[Warning] Kursovaya_MatMod.pas(123): Variable 'VedStol' might not have been initialized// в этой строке  if ((A/StrToFloat(StringGrid1.Cells[VedStol, i])) > Amax)

Эти строки идут в поиске ведущей строки...

А еще меня смущает эта строчка
StringGrid1.Cells[0, VedSt] := StringGrid1.Cells[VedStol, 0]; // Что она может значить?

Автор: ~FoX~ 21.6.2010, 12:08
Anchuta88, Варнинги ерунда, не обращай внимания

Цитата(Anchuta88 @  21.6.2010,  10:23 Найти цитируемый пост)
А еще меня смущает эта строчка
StringGrid1.Cells[0, VedSt] := StringGrid1.Cells[VedStol, 0]; // Что она может значить? 

Нормальная строчка...)) Шли проект мылом miw2000 сабак mail.ru ....

Автор: la399fox 21.6.2010, 12:16
Доброго времени суток, я сам недавно писал программу. Вот можна использовать готвый модуль simplex.pas
http://pastebin.com/ndRYyati

Результат защиты 5))

Приятного использования smile  smile 

Автор: kami 21.6.2010, 12:47
Цитата(~FoX~ @  21.6.2010,  12:08 Найти цитируемый пост)
 Варнинги ерунда, не обращай внимания

Варнинги - не ерунда, и внимание на них обращать надо smile

На примере сразу двух варнингов:
Код

function Some:integer;
var
  x:integer;
begin
  if x>5 then // Warning - variable X may not have been initialized бо хто его знает, что будет в X - мусор какой-нибудь.
    Result:=10;
end; // variable Result may not have been initialized - если x не будет больше 5 - хз, что будет в Result.


Это же касается и 
Цитата(Anchuta88 @  21.6.2010,  09:23 Найти цитируемый пост)
Variable 'VedSt' might not have been initialized

Цитата(Anchuta88 @  21.6.2010,  09:23 Найти цитируемый пост)
Variable 'VedStol' might not have been initialized

Значит, эти переменные могут быть неинициализированы, что в принципе, видно из кода - им не присвоены начальные значения, а при прохождении циклов может получиться так, что не будут присвоены никакие. Что, само собой, непонятным образом скажется на вычислениях (например, выплывет List index out of bounds).

Автор: ~FoX~ 21.6.2010, 13:36
Цитата(kami @  21.6.2010,  13:47 Найти цитируемый пост)
На примере сразу двух варнингов:

Не могу себе представить радиус кривизны рук у программиста  smile 

Цитата(kami @  21.6.2010,  13:47 Найти цитируемый пост)
Это же касается и 
Variable 'VedSt' might not have been initialized
Variable 'VedStol' might not have been initialized


В данном случае, даже если они не инициированы, то ничего не произойдет смертельного  smile 

З.Ы.: Я лично все вары объявляю как i: integer = 0; старая привычка, избавляет от гемороя с инициализацией и мусором в ситуациях например 

Код

try
  i := 0;
........
finally
  if i = 0 then 
......
end

Но это уже оффтоп  smile 

Автор: Anchuta88 21.6.2010, 14:25
На счет этой строчки
StringGrid1.Cells[0, VedSt] := StringGrid1.Cells[VedStol, 0];
...уже поняла)))) Здесь вместо значения ячейки 'S3' (в строках) присваивается значение 'X1' 

~FoX~, на мыло отправила)))

Автор: ~FoX~ 21.6.2010, 15:05
Anchuta88, Либо вынеси     VedSt := i за if
Код

Amax := -9999;
for i:=2 to 4 do  begin
    A := StrToFloat(StringGrid1.Cells[6,i]);
    if ((A/StrToFloat(StringGrid1.Cells[VedStol, i])) > Amax) and
    ((StrToFloat(StringGrid1.cells[VedStol, i])) > 0) then  begin
      Amax := A/StrToFloat(StringGrid1.Cells[VedStol, i]);
    end;
    VedSt := i;
  end;
VedEl := StrToFloat(StringGrid1.Cells[VedStol, VedSt]);

либо проверяй i на 0 

Автор: Anchuta88 21.6.2010, 16:00
~FoX~, наиогромнейшее спасибо))))
Только у меня терь другой вопрос... а почему не выводятся в листбокс значения 'Z' и где есть 'X' вот кусок из кода
Код

if Amax = 0 then
  begin
    for i := 1 to 4 do
    begin
      if Pos('x', StringGrid1.Cells[0, i])>0 then ListBox1.Items.Add(StringGrid1.Cells[0, i] + ' = ' +  StringGrid1.Cells[6, i]);
      if StringGrid1.Cells[0, i] = 'z' then ListBox1.Items.Add(StringGrid1.Cells[0, i] + ' = ' + StringGrid1.Cells[6, i]);
    end;
  end;

Автор: ~FoX~ 21.6.2010, 16:12
Потому что 'Z' и 'z' это разные зеты ))))

Автор: Anchuta88 21.6.2010, 16:16
В том то и дело что я их меняла и все равно не пашет(((

И что делать с этим сообщением?
Variable 'VedStol' might not have been initialized

Автор: ~FoX~ 21.6.2010, 16:34
Anchuta88, ничего.... это нормальная реакция прекомпилятора....на всякие if, try, etc....

Автор: Anchuta88 21.6.2010, 16:42
А что с листбоксом делать?   smile 

Автор: ~FoX~ 21.6.2010, 16:47
Условие if Amax = 0 then не выполнено, Amax=2  

Автор: Anchuta88 21.6.2010, 16:52
Цитата(~FoX~ @ 21.6.2010,  16:47)
Условие if Amax = 0 then не выполнено, Amax=2

А это как?  smile 

Автор: ~FoX~ 21.6.2010, 16:59
Да выполни трейс, посмотри на значения переменных и увидишь....

Автор: Anchuta88 21.6.2010, 17:11
Так... а терь для особо одаренных.... что есть трейс? smile 

Автор: ~FoX~ 21.6.2010, 17:24
F7

Автор: Anchuta88 21.6.2010, 17:36
Чёт ничего не меняется.... выделяет в Project1 строку... Я наверн что-то не так делаю?((((

Автор: Rennigth 21.6.2010, 19:30
Anchuta88,  F5 на нужной строке, дальше пошагово на F8...

Автор: Anchuta88 21.6.2010, 19:46
Спасибо всем)))) я нашла ошибку)))) 
~FoX~, я действительно тормоз))) терь поняла, что вместо Amax=0 надо записать Amax>0  smile 

Автор: ~FoX~ 22.6.2010, 13:41
[off] Anchuta88, Умничка  smile [/off]

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)