Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.08.2014, 00:07
painjkee painjkee вне форума
Прохожий
 
Регистрация: 11.08.2014
Сообщения: 3
Версия Delphi: Delphi XE
Репутация: 10
Восклицание Помогите, прошу

Ребят, прошу помощи
Был код, решил немного его подкорректировать (заменил стринг грид на обычный двумерный массив и что-то еще) и забить все в функцию


БЫЛО (РАБОТАЛО)
Код:
VS, US, i, j, k, n, id : integer;
MTX_XY : arr;
sr_kv_otkl : real;

begin

    n:=StringGrid1.RowCount;

//объявляем размер матрицы (всегда один и тот же для любой ОФ от 3 переменных)

    SetLength(MTX_XY, 8, n);

//Считываем данные из таблицы (столбцы X1,X2,Y)
    for i := 0 to 2 do
        for j := 0 to (n-1) do
            MTX_XY[i,j]:=StrtoFloat(StringGrid1.Cells[i, j]);

//добавляем остальные необхиодимые данные в матрицу
// 0 столбец - x1, 1 столбец - x2, 2 столбец - y,3 столбец - x1x1, 4 столбец - x1x2, 5 столбец - x2x2,
// 6 столбец - yx1, 7 столбец - yx2

//переписать в более красивом виде
    for i := 3 to 7 do
        for j := 0 to n-1 do
        begin
            if i=3 then
                MTX_XY[i,j]:=MTX_XY[0,j]*MTX_XY[0,j];
            if i=4 then
                MTX_XY[i,j]:=MTX_XY[1,j]*MTX_XY[0,j];
            if i=5 then
                MTX_XY[i,j]:=MTX_XY[1,j]*MTX_XY[1,j];
            if i=6 then
                MTX_XY[i,j]:=MTX_XY[2,j]*MTX_XY[0,j];
            if i=7 then
                MTX_XY[i,j]:=MTX_XY[2,j]*MTX_XY[1,j];
        end;

//Из имеющихся данных составляем новую таблицу для решения СЛАУ

        StringGrid2.Cells[0, 0]:=FloatToStr(n);
        StringGrid2.Cells[1, 0]:=FloatToStr(Sum_stolb(MTX_XY,0,n));
        StringGrid2.Cells[2, 0]:=FloatToStr(Sum_stolb(MTX_XY,1,n));
        StringGrid2.Cells[3, 0]:=FloatToStr(Sum_stolb(MTX_XY,2,n));
        StringGrid2.Cells[0, 1]:=StringGrid2.Cells[1, 0];
        StringGrid2.Cells[1, 1]:=FloatToStr(Sum_stolb(MTX_XY,3,n));
        StringGrid2.Cells[2, 1]:=FloatToStr(Sum_stolb(MTX_XY,4,n));
        StringGrid2.Cells[3, 1]:=FloatToStr(Sum_stolb(MTX_XY,6,n));
        StringGrid2.Cells[0, 2]:=StringGrid2.Cells[2, 0];
        StringGrid2.Cells[1, 2]:=StringGrid2.Cells[2, 1];
        StringGrid2.Cells[2, 2]:=FloatToStr(Sum_stolb(MTX_XY,5,n));
        StringGrid2.Cells[3, 2]:=FloatToStr(Sum_stolb(MTX_XY,7,n));

//Решаем СЛАУ (3строки, 3 неизвестных)
//переписать

VS:= 0; // Номер строки которую вычитают (начиная с 0 (первая строка это 0))
US:= 1; // Номер строки из которой вычитают (начиная с 0 (первая строка это 0))
// цикл который выберает следующую вычетаемую строку и повторяет расчет
    for i := 0 to 1 do
     begin
         VS := i; // Номер строки которую вычитают (начиная с 0 (первая строка это 0))
// приводим строку которую вычетаем к подходящему виду (должна начинаться с 1)
            for Id := 3 downto 0 do
             begin
                if StrToFloat(StringGrid2.Cells[VS,VS]) = 0 then Break;
                StringGrid2.Cells[Id, VS] :=FloatToStr(StrToFloat(StringGrid2.Cells[Id, VS]) /StrToFloat(StringGrid2.Cells[VS, VS]));
             end;
// цикл который переходит от строки к строке для вычитания начиная снизу
            for j := 2 downto VS + 1 do
             begin
// цикл который вычитает из строки строку по ячейкам справа налево
                US := j; // Номер строки из которой вычитают (начиная с 0 (первая строка это 0))
                    for k := 3 downto 0 do
                     begin
                        StringGrid2.Cells[k, US] := FloatToStr(StrToFloat(StringGrid2.Cells[k, US]) - (StrToFloat(StringGrid2.Cells[k, VS]) * StrToFloat(StringGrid2.Cells[VS, US])));
                     end;
             end;
     end;
// приводим последнюю строку к подходящему виду (должна начинаеться с 1)
    VS := 2; // Номер строки которую вычитают (начиная с 0 (первая строка это 0))
    for id := 3 downto 2 do
     begin
        if StrToFloat(StringGrid2.Cells[VS, VS]) = 0 then Break;
        StringGrid2.Cells[Id, VS] :=FloatToStr(StrToFloat(StringGrid2.Cells[Id, VS]) /StrToFloat(StringGrid2.Cells[VS, VS]));
     end;

// находим a2 и выводим на форму
Edit3.Text := StringGrid2.Cells[3, 2];
// находим a1 и выводим на форму
Edit2.Text := FloatToStr(StrToFloat(StringGrid2.Cells[3, 1]) -
(StrToFloat(Edit3.Text) * StrToFloat(StringGrid2.Cells[2, 1])));
// находим a0 и выводим на форму
Edit1.Text := FloatToStr(StrToFloat(StringGrid2.Cells[3, 0]) -
(StrToFloat(Edit3.Text) * StrToFloat(StringGrid2.Cells[2, 0])) -
(StrToFloat(Edit2.Text) * StrToFloat(StringGrid2.Cells[1, 0])));

/////////////////////////////////////////////////////////////////////

//выведем в таблицу полученные значения с помощью ОФ

for j := 0 to n-1 do
StringGrid1.Cells[3,j]:=FloatToStr(StrToFloat(Edit1.Text)
+ StrToFloat(Edit2.Text)* StrToFloat(StringGrid1.Cells[0,j])
+ StrToFloat(Edit3.Text)* StrToFloat(StringGrid1.Cells[1,j]));

//Подсчитаем и выведем среднеквадратическое отклонение
sr_kv_otkl:=0;
for j := 0 to n-1 do
sr_kv_otkl:=sqr(StrToFloat(StringGrid1.Cells[2,j])-StrToFloat(StringGrid1.Cells[3,j]))+sr_kv_otkl;

Edit4.Text:=FloatToStr(sr_kv_otkl);
//

СТАЛО (КОМПИЛИРУЕТСЯ, НО НЕ РАБОТАЕТ (ОШИБКА is not valid floating point value
Код:
procedure TForm1.Button1Click(Sender: TObject);


//2 типа для функций
   type array5 = array[0..5] of real;
   type arr = array of array of real;


//Функция, считающая сумму эллементов в заданном столбце
function Sum_stolb(mas : arr; stolbez, n_kon_mas : integer):real;
   var
     sum:real;
     i:integer;
   begin
     sum:=0;
     for i := 0 to n_kon_mas-1 do
       Sum:=sum+mas[stolbez,i];
     sum_stolb:=sum;
   end;//  Sum_stolb



//МЕТОД НАИМЕНЬШИХ КВАДРАТОВ ДЛЯ ФУНКЦИИ а0+а1*х_i+а2*х_j
function MNK(stolb1,stolb2:integer):array5;
  var
      VS, US, i, j, k, n, id : integer;
      MTX_XY, SLAU : arr;
      a0, a1, a2, sr_kv_otkl : real;
 begin

    n:=StringGrid1.RowCount;

//объявляем размер матрицы (всегда один и тот же для любой ОФ от 3 переменных)
//столбец - x_i, 1 столбец - x_j, 2 столбец - y, 3 столбец - x_i*x_i, 4 столбец - x_i*x_j
// 5 столбец - x_j*x_j, 6 столбец - y*x_i, 7 столбец - y*x_j, 8 столбец - Y по модели

    SetLength(MTX_XY, 9, n);

//объявляем размер матрицы для получения коэф а0,а1,а2
    SetLength(SLAU, 4, 3);


//Считываем данные из таблицы (столбцы STOLB1,STOLB2,Y)

  for j := 0 to n-1 do
    begin
      {stolb1}MTX_XY[0,j]:=StrtoFloat(StringGrid1.Cells[Stolb1, j]);
      {stolb2}MTX_XY[1,j]:=StrtoFloat(StringGrid1.Cells[Stolb2, j]);
           {y}MTX_XY[2,j]:=StrtoFloat(StringGrid1.Cells[n-2, j]);
    end;

//добавляем остальные необхиодимые данные в матрицу

  for i := 3 to 7 do
    for j := 0 to n-1 do
      begin
        if i=3 then
          MTX_XY[i,j]:=MTX_XY[0,j]*MTX_XY[0,j];
        if i=4 then
          MTX_XY[i,j]:=MTX_XY[1,j]*MTX_XY[0,j];
        if i=5 then
          MTX_XY[i,j]:=MTX_XY[1,j]*MTX_XY[1,j];
        if i=6 then
          MTX_XY[i,j]:=MTX_XY[2,j]*MTX_XY[0,j];
        if i=7 then
          MTX_XY[i,j]:=MTX_XY[2,j]*MTX_XY[1,j];
      end;

//Из имеющихся данных составляем новую таблицу для решения СЛАУ
    SLAU[0, 0]:=n;
    SLAU[1, 0]:=Sum_stolb(MTX_XY,0,n);
    SLAU[2, 0]:=Sum_stolb(MTX_XY,1,n);
    SLAU[3, 0]:=Sum_stolb(MTX_XY,2,n);
    SLAU[0, 1]:=SLAU[1, 0];
    SLAU[1, 1]:=Sum_stolb(MTX_XY,3,n);
    SLAU[2, 1]:=Sum_stolb(MTX_XY,4,n);
    SLAU[3, 1]:=Sum_stolb(MTX_XY,6,n);
    SLAU[0, 2]:=SLAU[2, 0];
    SLAU[1, 2]:=SLAU[2, 1];
    SLAU[2, 2]:=Sum_stolb(MTX_XY,5,n);
    SLAU[3, 2]:=Sum_stolb(MTX_XY,7,n);




//Решаем СЛАУ (3строки, 3 неизвестных)
//переписать

  VS:= 0; // Номер строки которую вычитают (начиная с 0 (первая строка это 0))
  US:= 1; // Номер строки из которой вычитают (начиная с 0 (первая строка это 0))
// цикл который выберает следующую вычетаемую строку и повторяет расчет
  for i := 0 to 1 do
  begin
    VS := i; // Номер строки которую вычитают (начиная с 0 (первая строка это 0))
    // приводим строку которую вычетаем к подходящему виду (должна начинаться с 1)
    for Id := 3 downto 0 do
    begin
      if SLAU[VS, VS] = 0 then Break;
        SLAU[Id, VS] := (SLAU[Id, VS] / SLAU[VS, VS]);
    end;
// цикл который переходит от строки к строке для вычитания начиная снизу
    for j := 2 downto VS + 1 do
      begin
// цикл который вычитает из строки строку по ячейкам справа налево
      US := j; // Номер строки из которой вычитают (начиная с 0 (первая строка это 0))
        for k := 3 downto 0 do
          begin
            SLAU[k, US] := (SLAU[k, US] - (SLAU[k, VS] * SLAU[VS, US]));
          end;
      end;
  end;
// приводим последнюю строку к подходящему виду (должна начинаеться с 1)
  VS := 2; // Номер строки которую вычитают (начиная с 0 (первая строка это 0))
    for id := 3 downto 2 do
      begin
        if SLAU[VS, VS] = 0 then Break;
          SLAU[Id, VS] := (SLAU[Id, VS] / SLAU[VS, VS]);
      end;

//СИСТЕМА ПРИВЕДЕНА К ТРЕУГОЛЬНОМУ ВИДУ
//ИЩЕМ И ЗАПОМИНАЕМ РЕШЕНИЕ а0,а1,а2

        a1 := SLAU[3, 2];
        a2 := SLAU[3, 1] - (a2 * SLAU[2, 1]);
        a0 := SLAU[3, 0] - (a2 * SLAU[2, 0]) - (a1 * SLAU[1, 0]);



//Заполняем 8 столбец (у по модели) в матрице МТХ_ХУ для поиска значения ошибки


    for j := 0 to n-1 do
      MTX_XY[8,j]:=a0+a1*MTX_XY[0,j]+a2*MTX_XY[1,j];


//Считаем среднеквадратическое отклонение


   sr_kv_otkl:=0;
   for j := 0 to n-1 do
     sr_kv_otkl:=sqr({y}MTX_XY[2,j]-{y по модели}MTX_XY[8,j])+sr_kv_otkl;


//Записываем все полученные данные в массив MNK
//a0,a1,a2,stolb1,stolb2,sr_kv_otkl

    MNK[0]:=a0;
    MNK[1]:=a1;
    MNK[2]:=a2;
    MNK[3]:=stolb1;
    MNK[4]:=stolb2;
    MNK[5]:=sr_kv_otkl;
 end;



var
 i,j:integer;
 itog:array5;
begin

    itog:=MNK(0,1);
    Edit1.Text:=FloatToStr(itog[0]);
    Edit2.Text:=FloatToStr(itog[1]);
    Edit3.Text:=FloatToStr(itog[2]);
    Edit4.Text:=FloatToStr(itog[5]);
Ответить с цитированием
  #2  
Старый 11.08.2014, 00:45
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Клавишу F7 не отменили, прошагай и узнаешь где ошибка. И привыкай к Дельфи. Результирующие результаты удобнее писать Result := "что-то-там", а не, к примеру, sum_stolb := sum. В итоге, первая функция перепишется так:
Код:
//  Функция, считающая сумму эллементов в заданном столбце 
function Sum_stolb(mas : arr; stolbez, n_kon_mas : Integer) : Real;
var
  I : Integer;    
begin
  Result := 0;      
  for I := 0 to n_kon_mas - 1 do  
     Result := Result + mas[stolbez, I];
end; //  Sum_stolb 
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 11.08.2014 в 00:47.
Ответить с цитированием
  #3  
Старый 11.08.2014, 01:03
painjkee painjkee вне форума
Прохожий
 
Регистрация: 11.08.2014
Сообщения: 3
Версия Delphi: Delphi XE
Репутация: 10
По умолчанию

просто я не могу видеть текущие значения переменных, тк использую функцию, не знаю почему
Ответить с цитированием
  #4  
Старый 11.08.2014, 01:13
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от painjkee
тк использую функцию, не знаю почему
Мда проблема.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #5  
Старый 11.08.2014, 01:15
painjkee painjkee вне форума
Прохожий
 
Регистрация: 11.08.2014
Сообщения: 3
Версия Delphi: Delphi XE
Репутация: 10
По умолчанию

ну я совсем новичек, что поделать
Ответить с цитированием
  #6  
Старый 11.08.2014, 01:21
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Вот и учись. Прочитай про использование клавиш F4, F7, F8 и воспользуйся ими для отладки функции.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #7  
Старый 25.08.2014, 15:57
demonpit demonpit вне форума
Прохожий
 
Регистрация: 25.08.2014
Сообщения: 3
Версия Delphi: Delphi 5
Репутация: 10
По умолчанию В продолжении темы

На сайте http://radiokot.ru/forum/viewtopic.php?f=58&t=101045 нашел рабочий USB вольтметр. Рабочий в том смысле, что работает не только в Протеусе, но и со спаянной схемой. Сама спаянная схема (прошивка) опознается компом без ошибок. Опознается как HID устройство. Но проблема в том, что исходник самой программы написан на VB. Как переделать этот исходник в Delphi - без понятия. Конверторы VB2Delphi ни к чему не привели. На выше указанном сайте полный мертвяк - ни одного ответа. VB код программы в архиве http://yadi.sk/d/gjirEuvQaNoyY. Сама программа работает либо с готовой спаянной схемой, либо с PROTEUSом совместно. Из всей программы меня интересует только вывод вольтов в текстовом окне, остальные навороты в этой программе мне не к чему. Помогите пожалуйста перевести VB в Delphi.

P.S. Советами типа "Вот и учись..." пожалуйста не обременяйтесь. Я не крутой программист. Мне хватает Delphi 5 вполне. А с какой стороны подходить к VB я уже забыл напрочь.
Ответить с цитированием
  #8  
Старый 25.08.2014, 23:43
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 576
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от demonpit
А с какой стороны подходить к VB я уже забыл напрочь.
Я тоже не силен в VB, но в представленной программе вижу вызовы API. Устройство открывается как файл, данные читаются асинхронно. Сам исходник написан сплошняком, без бутылки в нем не разобраться.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #9  
Старый 26.08.2014, 07:10
demonpit demonpit вне форума
Прохожий
 
Регистрация: 25.08.2014
Сообщения: 3
Версия Delphi: Delphi 5
Репутация: 10
По умолчанию

Пришлось поставить VB. Исходник рабочий, как и сама экзешка. Проверил. Скачал VBto, шараварную, конвертер. Сохранить коды в файлы для Delphi нельзя, т.к. конвертер без патча. Но переписать текст можно. Ввел текст переписанного кодов на Delphi - при запуске Delphi начинает плеваться ошибками. Если конвертер сконвертировал правильно, то такого быть не должно. Есть исходник аналогичной программы на Delphi, но с ранее выложенным устройством (прошивкой в архиве) она не работает. Работает только со своим, а оно (устройство) не опознается компом, работать можно только в PROTEUSе. Вот и мучаюсь - как перетащить нужные коды в дельфийскую программу не знаю.

Вот код на Delphi для второй аналогичной проги http://yadi.sk/d/Nfow-zdcaRGXi.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:56.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter