Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2010, 21:48   #1
Arzamaks
Пользователь
 
Регистрация: 23.11.2009
Сообщений: 17
Восклицание Делфи, Матричное уравение из файла

Задача такая: целочисленный массив 4х4 записать в файл, потом сичтать его и вычислить матричное выражение вида c0 + c1*A + c2*A^2, где с1,с2,с0 - коэффициенты, А - сама матрица, вводящиеся в программе. Результат должен быть записан в этом же файле, после старой матрицы.
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  a:array[1..4,1..4] of real;
  globi:integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
f: TextFile;
fName: String[80];
buf: string[80];
begin
memo1.Lines.Clear;
fName := 'file.txt';
AssignFile(f, fName);
{$I-}
Reset(f);
{$I+}
if IOResult <> 0 then
begin
MessageDlg ('Ошибка чтения ' + fName,mtError, [mbOk], 0); exit;
end;
while not EOF(f) do
begin
readln(f, buf);
Memo1.Lines.Add(buf);
end;
closefile(f);
end;


procedure TForm1.Button2Click(Sender: TObject);
var
c0,c1,c2: real;
i,j:integer;
begin
c0:=strtofloat(Edit1.text);
c1:=strtofloat(Edit2.text);
c2:=strtofloat(Edit3.text);
for i :=1 to 4 do
for j :=1 to 4 do
begin
a[i,j]:=a[i,j]*a[i,j]*c2 + a[i,j]*c1 + c0;
end;
for j := 1 to 4 do
begin
memo1.Clear;
Memo1.Lines[j-1]:=FloattoStr(a[1,j]) + ' ' + FloattoStr(a[2,j]) + ' ' +FloattoStr(a[3,j]) + ' ' +FloattoStr(a[4,j]);
end;
end;





procedure TForm1.Button3Click(Sender: TObject);
var
s,strin:string;
l,i,b:integer;
c:char;
begin
s:=memo1.Lines[1];
l:=length(s);
i:=0;
b:=0;
strin:='';
for i:=1 to l do begin
c:=s[i];
if (c=' ') then
begin b:= b+1;
a[1,b]:=StrToFloat(strin);
 strin:=''; end
 else strin:=strin+c;
end;

s:=memo1.Lines[2];
l:=length(s);
i:=0;
b:=0;
strin:='';
for i:=1 to l do begin
c:=s[i];
if (c=' ') then
begin b:= b+1;
a[2,b]:=StrToFloat(strin);
 strin:=''; end
 else strin:=strin+c;
end;

s:=memo1.Lines[3];
l:=length(s);
i:=0;
b:=0;
strin:='';
for i:=1 to l do begin
c:=s[i];
if (c=' ') then
begin b:= b+1;
a[3,b]:=StrToFloat(strin);
 strin:=''; end
 else strin:=strin+c;
end;

s:=memo1.Lines[4];
l:=length(s);
i:=0;
b:=0;
strin:='';
for i:=1 to l do begin
c:=s[i];
if (c=' ') then
begin b:= b+1;
a[4,b]:=StrToFloat(strin);
 strin:=''; end
 else strin:=strin+c;
end;

end;

end.
В принципе, всё равно, если кому то проще сделать со StrinGrid'oм - против не буду
Arzamaks вне форума Ответить с цитированием
Старый 20.05.2010, 06:53   #2
Arzamaks
Пользователь
 
Регистрация: 23.11.2009
Сообщений: 17
По умолчанию

Программу доработал, но остаются ошибки. Просьба помочь их ликвидировать!
Вложения
Тип файла: rar 5и8работат.rar (177.0 Кб, 7 просмотров)
Arzamaks вне форума Ответить с цитированием
Старый 20.05.2010, 06:57   #3
DoDge_VipeR
Форумчанин
 
Аватар для DoDge_VipeR
 
Регистрация: 30.04.2010
Сообщений: 317
По умолчанию

Если у вас в доработанной программе а^2 вычисляется также как и в посте #1 то советую почитать про возведение матрицы в квадрат
icq:627719[сто сорок четыре] - помогу с Pascal & Delphi!
DoDge_VipeR вне форума Ответить с цитированием
Старый 20.05.2010, 16:52   #4
Arzamaks
Пользователь
 
Регистрация: 23.11.2009
Сообщений: 17
По умолчанию

На счёт возведения матрицы в квадрат - исправил! Но всё ещё остаются проблемы, программа не верно вычисляет!
Код:
var
  Form1: TForm1;
  a:array[1..4,1..4] of real;
  b:array[1..4,1..4] of real;
  czero:array[1..4,1..4] of real;
  globi:integer;

implementation

{$R *.dfm}



procedure TForm1.Button1Click(Sender: TObject);
var
f: TextFile;
fName: String[80];
buf: string[80];
begin
memo1.Lines.Clear;
fName := 'file.txt';
AssignFile(f, fName);
{$I-}
Reset(f);
{$I+}
if IOResult <> 0 then
begin
MessageDlg ('Îøèáêà ÷òåíèÿ ' + fName,mtError, [mbOk], 0); exit;
end;
while not EOF(f) do
begin
readln(f, buf);
Memo1.Lines.Add(buf);
end;
closefile(f);
end;


procedure TForm1.Button2Click(Sender: TObject);
var
c0,c1,c2: real;
i,j,k:integer;
buffstring:string;
begin
c0:=strtofloat(Edit1.text);
c1:=strtofloat(Edit2.text);
c2:=strtofloat(Edit3.text);
for i :=1 to 4 do
for j :=1 to 4 do
  begin
  b[i,j] := 0;
  for k:=1 to 4 do
   b[i,j] := b[i,j] + a[i,k]*a[k,j];
  end;
for i :=1 to 4 do
for j :=1 to 4 do
b[i,j] := 0;
for i :=1 to 4 do
for j :=1 to 4 do
czero[i,j] := c0;
for i :=1 to 4 do
for j :=1 to 4 do
a[i,j]:=a[i,j]*c2 + a[i,j]*c1 + czero[i,j];
memo2.Clear;
for j := 1 to 4 do
begin
buffstring:=FloattoStr(a[1,j])+' '+FloattoStr(a[2,j])+' '+FloattoStr(a[3,j]) + ' ' +FloattoStr(a[4,j]);
memo2.Lines.add(buffstring);
end;
end;





procedure TForm1.Button3Click(Sender: TObject);
var
s,strin:string;
l,i,b,g:integer;
c:char;
begin
for g:=0 to 3 do   begin
s:=memo1.Lines[g];
l:=length(s);
b:=0;
strin:='';
for i:=1 to l do begin
c:=s[i];
if (c=' ') then
begin b:= b+1;
a[g+1,b]:=StrToFloat(strin);
 strin:=''; end
 else strin:=strin+c;
 end;
end;
end;

end.

Последний раз редактировалось Arzamaks; 20.05.2010 в 17:38.
Arzamaks вне форума Ответить с цитированием
Старый 20.05.2010, 18:24   #5
Arzamaks
Пользователь
 
Регистрация: 23.11.2009
Сообщений: 17
По умолчанию

А ещё, хоть убей - не понимаю, почему нижняя строка массива вычисляется не так как другие...
Arzamaks вне форума Ответить с цитированием
Старый 20.05.2010, 23:37   #6
Arzamaks
Пользователь
 
Регистрация: 23.11.2009
Сообщений: 17
По умолчанию

Попытки исправить до сих пор не увенчались успехом:
Исправил это:
Код:
for i :=1 to 4 do
for j :=1 to 4 do
b[i,j] := 0;
for i :=1 to 4 do
for j :=1 to 4 do
czero[i,j] := c0;
for i :=1 to 4 do
for j :=1 to 4 do
a[i,j]:=a[i,j]*c2 + a[i,j]*c1 + czero[i,j];
memo2.Clear;
на это

Код:
for i :=1 to 4 do
for j :=1 to 4 do
b[i,j] := 0;
for i :=1 to 4 do
for j :=1 to 4 do
czero[i,j] := c0;
for i :=1 to 4 do
for j :=1 to 4 do
cone[i,j] := c1;
for i :=1 to 4 do
for j :=1 to 4 do
ctoo[i,j] := c2;
for i :=1 to 4 do
for j :=1 to 4 do
a[i,j]:=b[i,j]*ctoo[i,j] + a[i,j]*cone[i,j] + czero[i,j];
memo2.Clear;
Но ни к чему хорошему это не привело.
Arzamaks вне форума Ответить с цитированием
Старый 22.05.2010, 08:04   #7
Arzamaks
Пользователь
 
Регистрация: 23.11.2009
Сообщений: 17
По умолчанию

Модераторам: можете удалить тему из-за её бестолковости!
Сам во всём разобрался, программа работает!
Arzamaks вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Открытие файла на Делфи MeGAAkrO Помощь студентам 2 11.04.2010 08:40
Дешифровка файла в Делфи Аретмий Помощь студентам 3 19.11.2009 21:55
Считывание файла на делфи sasha3050 Помощь студентам 13 21.09.2009 13:36
Создание файла. Выдача инфы по запросу.Паскаль или Делфи Комильфо Помощь студентам 1 26.12.2008 19:04
Загрузка из файла (консольный режим Делфи) adwaer Помощь студентам 3 30.06.2008 15:55