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