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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.05.2012, 09:00
qpmr qpmr вне форума
Прохожий
 
Регистрация: 12.12.2011
Сообщения: 27
Репутация: 10
По умолчанию обратная матрица

Есть код программы ,не получается оформить в виде процедуры помещенной в библиотечный модуль ..
Код:
unit obra; // код модуля

interface
  type
    kol= integer;
      obr=array[0..10, 0..10] of real;
  b= array[0..10, 0..10] of real;
  procedure _obra(z:obr;r:b;kol:integer);
implementation
  procedure _obra(z:obr;r:b;kol:integer);
var k, i, j: integer;

begin
 for k:=0 to kol-1 do
 begin
      for i:=0 to kol - 1 do
       for j:=0 to kol - 1 do
       begin
            if (i=k) and (j=k) then
               z[i,j] := 1/r[i,j];
               if (i=k) and (j<>k) then
                  z[i,j] := -r[i,j]/r[k,k];
               if (i<>k) and (j=k) then
                  z[i,j] := r[i,k]/r[k,k];
               if (i<>k) and (j<>k) then
                  z[i,j] := r[i,j] - r[k,j] * r[i,k]/r[k,k];
       end;
      for i:= 0 to kol - 1 do
       for j:= 0 to kol - 1 do r[i, j]:= z[i, j];
 end;
end;
end.


Код:
unit Unit1;  

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    StringGrid1: TStringGrid;
    Button1: TButton;
    BitBtn1: TBitBtn;
    Button2: TButton;
    StringGrid2: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i, j,kol: integer;
    i1, j1: integer;
begin
 i1:= 1;
 j1:= 1;

  for i:= 0 to kol - 1 do
    for j:= 0 to kol - 1 do
    begin
      i1:= i;
      j1:= j;
     _obra(z,r,kol);
      z[i, j]:= StrToFloat(StringGrid1.Cells[j, i]);
    end;

 end;

procedure TForm1.FormCreate(Sender: TObject);
var i,j,n,d:integer;
begin
 d:=strtoint(edit1.Text);
 stringgrid1.RowCount:=d+1;
 stringgrid1.ColCount:=d+1;
  stringgrid1.cells[0,0]:='A';
   for i:=1 to d do
    stringgrid1.cells[i,0]:='i='+inttostr(i);
        for j:=1 to d do
        stringgrid1.cells[0,j]:='j='+inttostr(j);
end;
procedure TForm1.Button2Click(Sender: TObject);
var i,j,n:integer;
begin
n:=strtoint(edit1.text);
  randomize;
  for i:=1 to n do
  for j:=1 to n do
  stringgrid1.Cells[i,j]:=inttostr(random(10));
end;

end.

Последний раз редактировалось qpmr, 04.05.2012 в 09:04.
Ответить с цитированием
  #2  
Старый 07.05.2012, 12:00
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 340
Версия Delphi: 11.3
Репутация: 429
Сообщение

Что конкретно не получается?
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
  #3  
Старый 14.05.2012, 20:57
qpmr qpmr вне форума
Прохожий
 
Регистрация: 12.12.2011
Сообщения: 27
Репутация: 10
По умолчанию

не пойму , какие переменные нужно писать в модуле под var и procedure , а какие оставить в var в программе
сделал так , но теперь не считает обратную , а просто копирует исходную .
Код:
unit Main;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    StringGrid1: TStringGrid;
    Label1: TLabel;
    SpinEdit1: TSpinEdit;
    Button1: TButton;
    Button2: TButton;
    StringGrid2: TStringGrid;
    Splitter1: TSplitter;
    Button3: TButton;
    procedure Button3Click(Sender: TObject);
    procedure SpinEdit1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  kol: integer;
  b:mat;obr:vek;

implementation

{$R *.dfm}



procedure TForm1.Button3Click(Sender: TObject);
begin
 exit;
end;

procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
 kol:= SpinEdit1.Value;
 StringGrid1.ColCount:= kol;
 StringGrid1.RowCount:= kol;
 StringGrid2.ColCount:= kol;
 StringGrid2.RowCount:= kol;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i, j: integer;
begin
 randomize;
 for i:= 0 to kol - 1 do
  for j:= 0 to kol - 1 do
    StringGrid1.Cells[i, j]:= IntToStr(random(100) - 50);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 kol:= 1;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i, j: integer;
    i1, j1: integer;
begin
 i1:= 1;
 j1:= 1;
 try
  for i:= 0 to kol - 1 do
    for j:= 0 to kol - 1 do
    begin
      i1:= i;
      j1:= j;
      obr[i, j]:= StrToFloat(StringGrid1.Cells[j, i]);
    end;
 except
  ShowMessage('Ошибка при вводе числа в столбце ' + IntToStr(j1 + 1) + ' строке ' + IntToStr(i1 + 1) + '!');
  exit;
 end;

 Obratis(b,obr,kol,i,j);
 for i:= 0 to kol - 1 do
  for j:= 0 to kol - 1 do
    StringGrid2.Cells[i, j]:= FloatToStr(Round(1000*obr[j, i])/1000);
end;

end.
Код:
unit Unit1;// текст модуля

interface
 type
 mat=array[0..30, 0..30] of real ;
 vek=array[0..30, 0..30] of real;
 procedure Obratis(b:mat;obr:vek;kol,i,j:integer);
implementation
procedure Obratis;
 var k:integer;
begin
 for k:=0 to kol - 1 do
 begin
      for i:=0 to kol - 1 do
       for j:=0 to kol - 1 do
       begin
            if (i=k) and (j=k) then
               b[i,j] := 1/obr[i,j];
               if (i=k) and (j<>k) then
                  b[i,j] := -obr[i,j]/obr[k,k];
               if (i<>k) and (j=k) then
                  b[i,j] := obr[i,k]/obr[k,k];
               if (i<>k) and (j<>k) then
                  b[i,j] := obr[i,j] - obr[k,j] * obr[i,k]/obr[k,k];
       end;
      for i:= 0 to kol - 1 do
       for j:= 0 to kol - 1 do obr[i, j]:= b[i, j];
 end;
end;
end.

Последний раз редактировалось qpmr, 14.05.2012 в 21:15.
Ответить с цитированием
  #4  
Старый 15.05.2012, 14:15
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 340
Версия Delphi: 11.3
Репутация: 429
Сообщение

Это что такое?
Цитата:
var
Form1: TForm1;
kol: integer;
b:mat;obr:vek;
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
  #5  
Старый 15.05.2012, 22:57
qpmr qpmr вне форума
Прохожий
 
Регистрация: 12.12.2011
Сообщения: 27
Репутация: 10
По умолчанию

не знал как еще задействовать массив vek ..
Ответить с цитированием
  #6  
Старый 15.05.2012, 23:26
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

dll с экспортируемой функцией _obra
подключить юнит Header к приложению (прописать его в uses), в приложении убрать использование unit1

З.Ы. текст из первого поста ТС, что в вызове значат _obra(z,r,kol); не разбирался
Вложения
Тип файла: zip DLL.zip (43.0 Кбайт, 2 просмотров)

Последний раз редактировалось cotseec, 15.05.2012 в 23:35.
Ответить с цитированием
  #7  
Старый 16.05.2012, 07:59
qpmr qpmr вне форума
Прохожий
 
Регистрация: 12.12.2011
Сообщения: 27
Репутация: 10
По умолчанию

ух ,спасибо конечно, но что-то код совсем не знакомый ..

Последний раз редактировалось qpmr, 16.05.2012 в 22:05.
Ответить с цитированием
  #8  
Старый 17.05.2012, 22:40
qpmr qpmr вне форума
Прохожий
 
Регистрация: 12.12.2011
Сообщения: 27
Репутация: 10
По умолчанию

Если пошагово смотреть то все считает , но почему выводит ту же матрицу !
Ответить с цитированием
  #9  
Старый 17.05.2012, 23:26
qpmr qpmr вне форума
Прохожий
 
Регистрация: 12.12.2011
Сообщения: 27
Репутация: 10
По умолчанию

Вот что пока вышло
Вложения
Тип файла: rar Новая папка.rar (200.1 Кбайт, 0 просмотров)

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

В архиве не все файлы.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #11  
Старый 17.05.2012, 23:47
qpmr qpmr вне форума
Прохожий
 
Регистрация: 12.12.2011
Сообщения: 27
Репутация: 10
По умолчанию

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

Что считает непонятно:
Код:
unit Main;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    Button4: TButton;
    BitBtn1: TBitBtn;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1 : TForm1;
  kol   : Integer;

implementation

uses
  Unit1;

var
  obr : Tvek;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  I, J : Integer;
begin
  Button2.Enabled := True;
  Randomize;
  for I := 0 to kol - 1 do
    for J := 0 to kol - 1 do
      StringGrid1.Cells[I, J] := IntToStr(random(100) - 50);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  kol := 1;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  I, J : Integer;
begin
  for I := 0 to kol - 1 do
    for J := 0 to kol - 1 do
      obr[I, J] := StrToFloat(StringGrid1.Cells[J, I]);
  Obratis(obr, kol);

  for I := 0 to kol - 1 do
    for J := 0 to kol - 1 do
      StringGrid2.Cells[I, J] := FloatToStr(Round(obr[J, I]));
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  kol := StrToInt(edit1.text);
  StringGrid1.ColCount := kol;
  StringGrid1.RowCount := kol;
  StringGrid2.ColCount := kol;
  StringGrid2.RowCount := kol;
end;

end.

Код:
unit unit1;

interface

type
  Tvek = array[0..30, 0..30] of Single;

procedure Obratis(var obr : Tvek; kol : Integer);

implementation

procedure Obratis(var obr : Tvek; kol : Integer);
var
  I, J, K : Integer;
  buf     : array[0..30, 0..30] of Single;
begin
  for K := 0 to kol - 1 do
  begin
    for I := 0 to kol - 1 do
      for J := 0 to kol - 1 do
      begin
        if (I = K) and (J = K) then
          buf[I, J] := 1 / obr[I, J];

        if (I = K) and (J <> K) then
          buf[I, J] := -obr[I, J] / obr[K, K];

        if (I <> K) and (J = K) then
          buf[I, J] := obr[I, K] / obr[K, K];

        if (I <> K) and (J <> K) then
          buf[I, J] := obr[I, J] - obr[K, J] * obr[I, K] / obr[K, K];
      end;

    for I := 0 to kol - 1 do
      for J := 0 to kol - 1 do
        obr[I, J] := buf[I, J];
  end;
end;

end.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #13  
Старый 18.05.2012, 08:36
qpmr qpmr вне форума
Прохожий
 
Регистрация: 12.12.2011
Сообщения: 27
Репутация: 10
По умолчанию

должна считать обратную матрицу , сейчас просто зануляет ее

Последний раз редактировалось qpmr, 18.05.2012 в 19:43.
Ответить с цитированием
  #14  
Старый 18.05.2012, 22:08
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Я и сказал, что непонятно со счётом. Это так считает оригинал программы.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #15  
Старый 18.05.2012, 23:28
qpmr qpmr вне форума
Прохожий
 
Регистрация: 12.12.2011
Сообщения: 27
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Я и сказал, что непонятно со счётом. Это так считает оригинал программы.
Эта программа вычисляет правильно, просто код какой-то упрощенный ..
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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