Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Произведение матриц

Автор: plafon 18.05.2004 23:38

Помогите пожалуста


Произведение матриц.
Требуется написать программу, вычисляющую произведение матриц A и B. Как исходные матрицы A и B, так и результат (матрица C=AxB) находятся в текстовых файлах (это могут быть, например, файлы ‘Input.txt’ и ’Output.txt’). Формат файла ‘Input.txt’ следующий:
2 3
1 2 0
4 5 1
3 4
1 0 2 3
3 0 9 2
3 4 3 1
Здесь описаны две матрицы. В первой строке файла записано число строк и столбцов для первой матрицы, затем приводятся ее элементы. Далее (строки 4-7) описана вторая матрица. Аналогичный формат имеет выходной файл (одна матрица).
При объявлении типов файлов используйте указатель Text.

Автор: Алексей 19.05.2004 11:06

Приветик. Эта задача считает произведение матрицы на строку. Эта простенькая задача позволяет решить твою задачу. А вывод и чтение текстовых документов - всего лишь цикл. Думай...

Код

unitMain;

type
 TForm1 = class(TForm)
   StringGrid1: TStringGrid;
   StringGrid2: TStringGrid;
   StringGrid3: TStringGrid;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
   function MyStrToInt (s: string): integer;
   procedure StringGrid1GetEditMask(Sender: TObject; ACol, ARow: Integer;
     var Value: String);
   procedure StringGrid2GetEditMask(Sender: TObject; ACol, ARow: Integer;
     var Value: String);
   procedure FormActivate(Sender: TObject);
   procedure StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
     const Value: String);
   procedure StringGrid2SetEditText(Sender: TObject; ACol, ARow: Integer;
     const Value: String);
 private
   { Private declarations }
 public
   { Public declarations }
 end;



procedure TForm1.Button1Click(Sender: TObject);
begin
 close;
end;

procedure TForm1.StringGrid1GetEditMask(Sender: TObject; ACol,
 ARow: Integer; var Value: String);
begin
 value:='0000;1; ';
end;

procedure TForm1.StringGrid2GetEditMask(Sender: TObject; ACol,
 ARow: Integer; var Value: String);
begin
 value :='00000;1; ';
end;

procedure TForm1.FormActivate(Sender: TObject);
var i,j: byte;
begin


 with stringgrid1 do
 for i:=0 to Colcount-1 do
   for j:=0 to RowCount-1 do cells[i,j]:='0';
 with stringGrid2 do
   for i:=0 to rowcount-1 do cells[0,i]:='0';

end;

function Tform1.MyStrToInt (s: string): integer;
var k,code: integer;
 begin
   while (s<>'') and (s[length(s)]=' ') do
     delete (s,length(s),1);
   if s<>'' then
     begin
       Val (s,k,code);
       if code=0 then MYSTRTOINT:=k else MyStrToInt:=0;
     end
       else MyStrToInt:=0;
 end;

procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol,
 ARow: Integer; const Value: String);
var i,j,sum: integer;
begin
 for j:=0 to stringGrid1.RowCount-1 do
 begin
   sum:=0;
   for i:=0 to StringGrid1.ColCount-1 do
     begin
       sum:=sum+mystrtoint (stringgrid1.cells[i,j])*mystrtoint (stringgrid2.cells[0,i]);
     end;
   stringgrid3.Cells[0,j]:=inttostr(sum);
 end;
end;

procedure TForm1.StringGrid2SetEditText(Sender: TObject; ACol,
 ARow: Integer; const Value: String);
var i,j,sum: integer;
begin
 for j:=0 to stringGrid1.RowCount-1 do
 begin
   sum:=0;
   for i:=0 to StringGrid1.ColCount-1 do
     begin
       sum:=sum+mystrtoint (stringgrid1.cells[i,j])*mystrtoint (stringgrid2.cells[0,i]);
     end;
   stringgrid3.Cells[0,j]:=inttostr(sum);
 end;
end;

end.




Пожалуйста, заключайте код в соответствующий тег! Oleg_Z

Автор: APAL 19.05.2004 13:08

Про работу с матрицами в разделе "Задачи" есть соответствующая тема "Важно: решения: МАТРИЦЫ, МАССИВЫ. задачи"

Автор: APAL 19.05.2004 13:11

to Алексей
Этот раздел для TP, а не для Delphi... ;)

Автор: Алексей 19.05.2004 17:54

Sorry. Ошибся. blink.gif

Автор: plafon 26.05.2004 4:10

пожалуйста всё таки помогите решить

Автор: Altair 26.05.2004 10:46

Значит вот код, он работает. "Перемножение матриц" лабораторная работа.

Цитата
Эта простенькая задача позволяет решить твою задачу. А вывод и чтение текстовых документов - всего лишь цикл. Думай...

Ну здесь тоже нет чтение из файла.

{ ”б«®ўЁҐ:
 ‚лзЁб«Ёвм Їа®Ё§ўҐ¤Ґ­ЁҐ Єў ¤а в­ле ¬ ваЁж
}

const
Count = 3; {Є®«-ў® бв®«Ўж®ў Ё бва®Є ¬ ваЁжл}
var
Mat1, Mat2,                                     {ўў®¤Ё¬лҐ ¬ ваЁжл}
ResMat1 : array[1..Count, 1..Count] of integer; {१г«мвЁагой п}
i, x, y, R : integer;
flag : boolean;
begin
Writeln('‚ў®¤ ЇҐаў®© ¬ ваЁжл (жҐ«лҐ зЁб« )');
for y := 1 to Count do
 for x := 1 to Count do
 begin
  Write('Mat1[', x, ',', y,'] : ');
  Readln(Mat1[x, y]);
 end;
Writeln('‚ў®¤ ўв®а®© ¬ ваЁжл (жҐ«лҐ зЁб« )');
for y := 1 to Count do
 for x := 1 to Count do
 begin
  Write('Mat2[', x, ',', y,'] : ');
  Readln(Mat2[x, y]);
 end;
{Ї®¤бзҐв ¬ ваЁжл AxB}
for y := 1 to count do {бЇгбЄ Ґ¬бп ў­Ё§ Ї® бва®Є ¬}
 for x := 1 to Count do {Ё¤Ґ¬ Ї® н«Ґ¬Ґ­в ¬ бва®Є ўЇа ў®}
 begin
  R := 0;                          {®Ў­г«пҐ¬ б㬬㠯ந§ўҐ¤Ґ­Ё©}
  for i := 1 to Count do           {Ё¤Ґ¬ Ї®¤ Ј®аЁ§®­в «Ё Mat1 Ё Ї® ўҐавЁЄ «Ё}
   r := R + mat1[i, y]*Mat2[x, i]; {Mat2; г¬­®¦ Ґ¬ Ё ¤®Ў ў«пҐ¬ ў R}
  ResMat1[x, y] := R;              {Resmat1[x, y] = १г«мв в = R}
end;
Writeln('AxB='); {ўлў®¤Ё¬ ­  нЄа ­}
for y := 1 to Count do
begin
 for x := 1 to Count do
  Write(ResMat1[x, y]:4);
 Writeln;
end;
END. {Є®­Ґж Їа®Ја ¬¬л}

Текст в кодировке DOS (кодовая страница 866)

Автор: Guest 20.11.2005 22:33

народ все конечно круто, а не кто на поможет решить задачу с перемножение к матриц размером MxN за время nlogn ?
помогите очень надо!!!
и желательно поскорее!!!
пасиба.

p.s. говорят както через динамичесоке програмирование решается!!!
Вот хотелось бы узнать ка!! smile.gif