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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.02.2013, 23:16
anton-xa anton-xa вне форума
Прохожий
 
Регистрация: 24.02.2013
Сообщения: 1
Репутация: 10
По умолчанию Проблема с функцией.

В общем задача у меня такая: возвести матрицу А в 6 степень, получить матрицу В, используя рекурсию.
Но возникла проблема с функцией, она правильно высчитывает результат, но в самом конце, на слове end, она начинает "портить" все значения, возвращает к началу (выяснял я это с помощью Add Watch).
Помогите, пожалуйста.

Код:
unit Unit1;

interface

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

const
  n = 3;

type
  TMas = array [1..n, 1..n] of integer;
  TForm1 = class(TForm)
    Label1: TLabel;
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  function MultiMatrix(A, B: TMas; d: integer): TMas;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function MultiMatrix(A, B: TMas; d: integer): TMas;
var
  i, j, k, sum: integer;
  newA: TMas;
begin
  if d <> 1 then
    begin
      for i := 1 to n do
        for j := 1 to n do
          begin
            sum := 0;
            for k := 1 to n do
              sum := sum + A[i,k]*B[k,j];
            newA[i,j] := sum;
          end;
      dec(d);
      MultiMatrix(A, newA, d)
    end
  else
    MultiMatrix := B;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  A, B: TMas;
  i, j, d: integer;
begin
  d:=6;
  for i := 1 to n do
    for j := 1 to n do
      A[i, j] := StrToInt(StringGrid1.Cells[i-1, j-1]);
  B := MultiMatrix(A, A, d);
  for i := 1 to n do
    for j := 1 to n do
      StringGrid2.Cells[i-1, j-1] := IntToStr(B[i,j]);
end;

end.
Ответить с цитированием
  #2  
Старый 25.02.2013, 00:28
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,056
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А ты чего хотел? Ты же результат не сохраняешь для середины итерации.
Код:
function MultiMatrix(A, B: TMas; d: integer): TMas;
var
  i, j, k, sum: integer;  
  newA: TMas;
begin
  if d <> 1 then
    begin
      for i := 1 to n do
        for j := 1 to n do
          begin
            sum := 0;
            for k := 1 to n do
              sum := sum + A[i,k]*B[k,j];
            newA[i,j] := sum;
          end;
      dec(d);
      MultiMatrix(A, newA, d)  // <- Здесь! Где сохранение результата???
    end
  else
    MultiMatrix := B;
end;
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter