Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Волшебный глюк, интересно 
:(
    Опции темы
Alcohol
  Дата 29.11.2005, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 28.11.2005

Репутация: нет
Всего: нет



Нижеприведенное является куском программы, решающей СЛАУ. Кусок заполняет расширенную матрицу коофициентов, читая уравнения из строкового поля 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]



Это сообщение отредактировал(а) Alcohol - 29.11.2005, 00:07
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0375 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.