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


Автор: Alcohol 29.11.2005, 00:05
Нижеприведенное является куском программы, решающей СЛАУ. Кусок заполняет расширенную матрицу коофициентов, читая уравнения из строкового поля RichEdit. Ур-нения вводятся в виде, например:
-x+2,87y=-0,85
1,8x-y=3,678
Короче, как пишутся, так и вводятся (в правых частях только числа).
Когда я ее писал, то не стал задаваться вопросом как создается локальный массив (всмысле заполнен ли он нулями или случайными значениями) и сделал цикл, который обнуляет кооф-ты соотв. строки матрицы, если в соотв. строке отсутствуют соотвующие неизвестные, для чего использовал логический массив z. Программу я закончил, и все отлично работало. Поняв, что матрица при создании по умолчанию заполняется нулями, я чтоб не делать лишние операции, этот массив и все что с ним связано убрал. Массив участвует в операциях только с самим собой и коофициентами самой матрицы. Удивило то, что появилась ошибка функции StrToFloat(a), т.к. в аргумент добавлялся лишний символ (+ или -). Что то вроде a='1,2+'.
Просветите пожалуйста, где здесь связь, уж очень интересно. smile

Все места, где используется массив z ниже обозначены коментами
Код



procedure TForm1.Button1Click(Sender: TObject);

var
mat: array of array of extended; // матрица коофициентов
vars: array of string;                    // массив с именами неизвестных
c,n,i,nv,x:integer;
a,b:string;
v:boolean;
pos:array of integer;
g:extended;
z:array of boolean; // - Вот он, виновник проблемы

function StrNum(Num:integer):integer;
begin
if pos[Num]=0 then Result:=Num
else
Result:=pos[Num];
if Result=-1 then result:=0;
  
end;


begin
nv:=0;
c:=-1;
SetLength(z,RichEdit1.Lines.Count); //тут задаем размер
SetLength(pos,RichEdit1.Lines.Count);
pos[0]:=-1;
SetLength(vars,RichEdit1.Lines.Count);
SetLength(mat,RichEdit1.Lines.Count,RichEdit1.Lines.Count+1);
repeat
  for i:=0 to RichEdit1.Lines.Count-1 do   // цикл "обнуления" массива при переходе к след. строке
       begin
       z[i]:=false;                                    
       end;
  c:=c+1;

  n:=1;
  i:=1;
  while not (RichEdit1.Lines[c][n]='') do begin
     a:='';
     b:='';
     while not ((RichEdit1.Lines[c][n] in ['a'..'z']-['e']) or (RichEdit1.Lines[c][n] in ['а'..'я'])) do
             begin
             Insert(RichEdit1.Lines[c][n],a,i);
             i:=i+1;
             n:=n+1;
             end;

     if (i=1) or (a='+') then a:='1';
     if a='-' then a:='-1';
     i:=1;


     while not ((RichEdit1.Lines[c][n]='+') or (RichEdit1.Lines[c][n]='-') or (RichEdit1.Lines[c][n]='='))  do
             begin
             Insert(RichEdit1.Lines[c][n],b,i);
             i:=i+1;
             n:=n+1;
             end;
     v:=false;
     i:=-1;
     repeat
          i:=i+1;
          if vars[i]=b then v:=true
     until (i=Length(vars)-1) or (v=true);

     if v=false then
          begin
          vars[nv]:=b;
          mat[c,nv]:=StrToFloat(a);
          z[nv]:=true;                    //отмечаем, что такое-то неизвестное в строке было 
          nv:=nv+1;
          end;
     if v=true then
          begin
          mat[c,i]:=mat[c,i]+StrToFloat(a); // ВОТ В ЭТОЙ ПРОЦЕДУРЕ ПОЯВЛЯЕТСЯ ОШИБКА!
          z[i]:=true;                                     //отмечаем, что такое-то неизвестное в строке было 
          end;

     if RichEdit1.Lines[c][n]='=' then
          begin
          i:=1;
          a:=''; 
          n:=n+1;
          while RichEdit1.Lines[c][n]<>'' do
             begin
             Insert(RichEdit1.Lines[c][n],a,i);
             i:=i+1;
             n:=n+1;
             end;
          mat[c,RichEdit1.Lines.Count]:=StrToFloat(a);
          end;
      for i:=0 to RichEdit1.Lines.Count-1 do  //цикл обнуления необходимых эл-тов строки матрицы
                begin
                if z[i]=false then                             
                mat[c,i]:=0;
                end;

             
  end;

until c=RichEdit1.Lines.Count-1;   //Зап. матрицы[code=delphi]


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