![]() |
|
#1
|
|||
|
|||
![]() Есть код программы ,не получается оформить в виде процедуры помещенной в библиотечный модуль ..
Код:
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
|
||||
|
||||
![]() Что конкретно не получается?
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете. |
#3
|
|||
|
|||
![]() не пойму , какие переменные нужно писать в модуле под 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
|
||||
|
||||
![]() Это что такое?
Цитата:
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете. |
#5
|
|||
|
|||
![]() не знал как еще задействовать массив vek ..
|
#6
|
||||
|
||||
![]() dll с экспортируемой функцией _obra
подключить юнит Header к приложению (прописать его в uses), в приложении убрать использование unit1 З.Ы. текст из первого поста ТС, что в вызове значат _obra(z,r,kol); не разбирался Последний раз редактировалось cotseec, 15.05.2012 в 23:35. |
#7
|
|||
|
|||
![]() ух ,спасибо конечно, но что-то код совсем не знакомый ..
Последний раз редактировалось qpmr, 16.05.2012 в 22:05. |
#8
|
|||
|
|||
![]() Если пошагово смотреть то все считает , но почему выводит ту же матрицу !
|
#9
|
|||
|
|||
![]() Вот что пока вышло
Последний раз редактировалось qpmr, 17.05.2012 в 23:47. |
#10
|
||||
|
||||
![]() В архиве не все файлы.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#11
|
|||
|
|||
![]() исправил , там просто другой модуль
|
#12
|
||||
|
||||
![]() Что считает непонятно:
Код:
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
|
|||
|
|||
![]() должна считать обратную матрицу , сейчас просто зануляет ее
Последний раз редактировалось qpmr, 18.05.2012 в 19:43. |