Форум по 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).
Помогите, пожалуйста.

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А ты чего хотел? Ты же результат не сохраняешь для середины итерации.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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, время: 07:06.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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