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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2008, 14:34   #11
bullvinkle
Временно — юрист.
Форумчанин
 
Аватар для bullvinkle
 
Регистрация: 31.03.2008
Сообщений: 204
По умолчанию

Если ты мне покажешь как написать функцию, параметром которой есть двумерный массив (чет никак не получается парвильно ее написать), например, пусть функция считает сумму всех элементов матрицы, я напишу тебе функцию, считающую определитель матрицы по этой рекурсивной формуле.
bullvinkle вне форума Ответить с цитированием
Старый 02.12.2008, 14:56   #12
alex_fcsm
Участник клуба
 
Аватар для alex_fcsm
 
Регистрация: 10.11.2008
Сообщений: 1,502
По умолчанию

type Matrix=array[1..10,1..10] of integer;
var a:Matrix;
i,j:integer;
x:real;
function Schet(a:Matrix):real;
var x:real;
begin
x:=0;
for i:=1 to 10 do
for j:=1 to 10 do
x:=x+a[i,j];
Schet:=x;
end;

begin
randomize;
for i:=1 to 10 do
for j:=1 to 10 do
a[i,j]:=random(10);
x:=Schet(a);
writeln(x:4:2);
end.
Нормальное состояние техники - нерабочее, все остальное частный случай.
alex_fcsm вне форума Ответить с цитированием
Старый 02.12.2008, 15:31   #13
bullvinkle
Временно — юрист.
Форумчанин
 
Аватар для bullvinkle
 
Регистрация: 31.03.2008
Сообщений: 204
По умолчанию

о! Тут уже есть пример который я просил))

Мозги напрягать мне не прийдется, потому как нашел замечательный пример, разобранный до самых мелочей http://vts.math.kubsu.ru/pascal/det.htm
bullvinkle вне форума Ответить с цитированием
Старый 02.12.2008, 17:06   #14
Барби
Форумчанин
 
Аватар для Барби
 
Регистрация: 19.12.2007
Сообщений: 159
По умолчанию

в самом конце написано
Цитата:
А как быть если нам в рамках решения одной задачи надо вычислить определитель матриц разных порядков?Эту задачу написанная функция det в купе с minor не решает.
Получается что если я заранее знаю какой размерности моя матрица я посчитаю определитель,а если я с клавиатуры задам, то тут как быть?
Пока ремонтируют кукольный домик, живу на форуме.
Барби вне форума Ответить с цитированием
Старый 02.12.2008, 17:42   #15
Барби
Форумчанин
 
Аватар для Барби
 
Регистрация: 19.12.2007
Сообщений: 159
По умолчанию

нашла вариант, где n=4, но написано что можно использовать для любых размерностей. при компиляции ничего не происходит. почему?
Код:
const n=4; { размерность матрицы }
type matr=array[1..n,1..n] of longint;
var a,b:matr;
    i,j,dt:longint;
procedure PrintMatr(m:matr;n:integer);
{ процедура вывода матрицы на экран }
var i,j:integer;
  begin
  for i:=1 to n do
    begin
    for j:=1 to n do
      write(m[i,j]:3);
    writeln;
    end;
  end;
procedure GetMatr(a:matr; var b:matr; m,i,j:integer);
{ Вычеркивание из матрицы строки и столбца }
var ki,kj,di,dj:integer;
  begin
  di:=0;
  for ki:=1 to m-1 do
    begin
    if (ki=i) then di:=1;
    dj:=0;
    for kj:=1 to m-1 do
      begin
      if (kj=j) then dj:=1;
      b[ki,kj]:=a[ki+di,kj+dj];
      end;
    end;
  end;
Function Determinant(a:matr;n:integer):longint;
{ Вычисление определителя матрицы }
var i,j,d,k:longint;
    b:matr;
  begin
  d:=0; k:=1;
  if (n<1) then
    begin
    writeln('Determinant: Cann''t run. N=',n); halt;
    end;
  if (n=1)
    then d:=a[1,1]
  else if (n=2)
    then d:=a[1,1]*a[2,2]-a[2,1]*a[1,2]
  else { n>2 }
    for i:=1 to n do
      begin
      GetMatr(a,b,n,i,1);
      {writeln('i=',i,' a[',i,',1]=',a[i,1]);
      PrintMatr(b,n-1);}
      d:=d+k*a[i,1]*Determinant(b,n-1);
      k:=-k;
      end;
  Determinant:=d;
  end;
begin
{ Заполнение матрицы случайными числами }
randomize;
for i:=1 to n do
for j:=1 to n do
  a[i,j]:=random(5);
{ Печать исходной матрицы }
PrintMatr(a,n);
{ Вычисление и вывод определителя }
dt:=Determinant(a,n);
writeln('=========');
writeln('Determinant=',dt);
end.
Пока ремонтируют кукольный домик, живу на форуме.
Барби вне форума Ответить с цитированием
Старый 02.12.2008, 18:27   #16
bullvinkle
Временно — юрист.
Форумчанин
 
Аватар для bullvinkle
 
Регистрация: 31.03.2008
Сообщений: 204
По умолчанию

Эта же программа с запроса размерности матрицы.
Больше 13 на 13 не выходит - переполнение стека.
Можно увеличить размер стека, но я не знаю как, а можно и такую сдавать, грамотно объяснив про стек.
Код:
{const n=4;} { ЁрчьхЁэюёЄ№ ьрЄЁшЎ√ }
type matr=array[1..13,1..13] of longint;
var a,b:matr;
    i,j,dt:longint;
    n:integer;
procedure PrintMatr(m:matr;n:integer);
{ яЁюЎхфєЁр т√тюфр ьрЄЁшЎ√ эр ¤ъЁрэ }
var i,j:integer;
  begin
  for i:=1 to n do
    begin
    for j:=1 to n do
      write(m[i,j]:3);
    writeln;
    end;
  end;
procedure GetMatr(a:matr; var b:matr; m,i,j:integer);
{ ┬√ўхЁъштрэшх шч ьрЄЁшЎ√ ёЄЁюъш ш ёЄюысЎр }
var ki,kj,di,dj:integer;
  begin
  di:=0;
  for ki:=1 to m-1 do
    begin
    if (ki=i) then di:=1;
    dj:=0;
    for kj:=1 to m-1 do
      begin
      if (kj=j) then dj:=1;
      b[ki,kj]:=a[ki+di,kj+dj];
      end;
    end;
  end;
Function Determinant(a:matr;n:integer):longint;
{ ┬√ўшёыхэшх юяЁхфхышЄхы  ьрЄЁшЎ√ }
var i,j,d,k:longint;
    b:matr;
  begin
  d:=0; k:=1;
  if (n<1) then
    begin
    writeln('Determinant: Cann''t run. N=',n); halt;
    end;
  if (n=1)
    then d:=a[1,1]
  else if (n=2)
    then d:=a[1,1]*a[2,2]-a[2,1]*a[1,2]
  else { n>2 }
    for i:=1 to n do
      begin
      GetMatr(a,b,n,i,1);
      {writeln('i=',i,' a[',i,',1]=',a[i,1]);
      PrintMatr(b,n-1);}
      d:=d+k*a[i,1]*Determinant(b,n-1);
      k:=-k;
      end;
  Determinant:=d;
  end;
begin
{ ╟ряюыэхэшх ьрЄЁшЎ√ ёыєўрщэ√ьш ўшёырьш }
randomize;
repeat
writeln('Введите размерность матрицы, но не больше 13');
readln(n);
until n<14;
for i:=1 to n do
for j:=1 to n do
  a[i,j]:=random(5);
{ ╧хўрЄ№ шёїюфэющ ьрЄЁшЎ√ }
PrintMatr(a,n);
{ ┬√ўшёыхэшх ш т√тюф юяЁхфхышЄхы  }
dt:=Determinant(a,n);
writeln('=========');
writeln('Determinant=',dt);
readln;
end.

А, еще можно заменить везде longinit на другие типі данніх.

Последний раз редактировалось bullvinkle; 02.12.2008 в 18:34.
bullvinkle вне форума Ответить с цитированием
Старый 05.12.2008, 12:18   #17
Барби
Форумчанин
 
Аватар для Барби
 
Регистрация: 19.12.2007
Сообщений: 159
По умолчанию

Переделала задачу для ООП, сделав матрицу объектом. Не понимаю почему теперь не считается определитель, пишет что раз n равен 0, то дискрименант не посчитаешь. Помогите поправить ошибку пожалуйста
Код:
program mtr;

type

matr=array[1..13,1..13] of longint;

matrix=object
procedure vvod;
procedure printMatr(m:matr;n:integer);
procedure GetMatr(a:matr; var b:matr; o,i,j:integer);
Function Determinant(a:matr;n:integer):longint;

    end;
procedure matrix.PrintMatr(m:matr;n:integer);

var i,j:integer;
  begin
  for i:=1 to n do
    begin
    for j:=1 to n do
      write(m[i,j]:3);
    writeln;
    end;
  end;
procedure matrix.GetMatr(a:matr; var b:matr; o,i,j:integer);
var ki,kj,di,dj:integer;
  begin
  di:=0;
  for ki:=1 to o-1 do
    begin
    if (ki=i) then di:=1;
    dj:=0;
    for kj:=1 to o-1 do
      begin
      if (kj=j) then dj:=1;
      b[ki,kj]:=a[ki+di,kj+dj];
      end;
    end;
  end;
Function matrix.Determinant(a:matr;n:integer):longint;

var i,j,d,k:longint;
    b:matr;
  begin
  d:=0; k:=1;
  if (n<1) then
    begin
    writeln('Determinant: Cann''t run. N=',n); halt;
    end;
  if (n=1)
    then d:=a[1,1]
  else if (n=2)
    then d:=a[1,1]*a[2,2]-a[2,1]*a[1,2]
  else { n>2 }
    for i:=1 to n do
      begin
      matrix.GetMatr(a,b,n,i,1);

      d:=d+k*a[i,1]*Determinant(b,n-1);
      k:=-k;
      end;
  Determinant:=d;
  end;
procedure matrix.vvod;
var
 a,b:matr;
    i,j,dt:longint;
    n:integer;
begin

randomize;
repeat
writeln('Vvedite razmer matrici');
readln(n);
until n<14;
for i:=1 to n do
for j:=1 to n do
  a[i,j]:=random(5);
matrix.PrintMatr(a,n);
end;


var
mat:matrix;
 a,b,m:matr;
   o, i,j,dt:longint;
    n:integer;
begin
mat.vvod;
read(n);

mat.GetMatr(a,b,o,i,j);
mat.PrintMatr(m,n);
dt:=mat.Determinant(a,n);
writeln('=========');
writeln('Determinant=',dt);
readln;
end.
Пока ремонтируют кукольный домик, живу на форуме.

Последний раз редактировалось Барби; 05.12.2008 в 12:20.
Барби вне форума Ответить с цитированием
Старый 05.12.2008, 15:36   #18
Барби
Форумчанин
 
Аватар для Барби
 
Регистрация: 19.12.2007
Сообщений: 159
Печаль параметр введенный с клавиатуры не передается в процедуры

создала объект матрица, n-размер матрицы(квадратная), в конце при вызове всех процедур объекта параметр n введенный с клавиатуры не передается в процедуры. подскажите,пожалуйста как поправить
Код:
program mtr;

type

matr=array[1..13,1..13] of longint;
matrix=object
 a,b,m:matr;
   o, dt:longint;
    n:integer;


procedure init(n1:integer;a1,b1,m1:matr;o1,j1,i1:longint);
procedure vvod;
procedure printMatr(m1:matr;n1:integer);
procedure GetMatr(a1:matr; var b1:matr; o1,i1,j1:integer);
Function Determinant(a1:matr;n1:integer):longint;

    end;
procedure matrix.init(n1:integer;a1,b1,m1:matr;o1,j1,i1:longint);
var

i,j:longint;
begin
n:=n1;
a:=a1;
b:=b1;
m:=m1;
o:=o1;
i:=i1;
j:=j1;
end;
procedure matrix.PrintMatr(m1:matr;n1:integer);

var i,j:integer;
  begin
  for i:=1 to n do
    begin
    for j:=1 to n do
      write(m[i,j]:3);
    writeln;
    end;
  end;
procedure matrix.GetMatr(a1:matr; var b1:matr; o1,i1,j1:integer);
var ki,kj,di,dj:integer;
i,j:longint;
  begin
  di:=0;
  for ki:=1 to o-1 do
    begin
    if (ki=i) then di:=1;
    dj:=0;
    for kj:=1 to o-1 do
      begin
      if (kj=j) then dj:=1;
      b[ki,kj]:=a[ki+di,kj+dj];
      end;
    end;
  end;
Function matrix.Determinant(a1:matr;n1:integer):longint;

var i,j,d,k:longint;

  begin
  d:=0; k:=1;
  if (n<1) then
    begin
    writeln('Determinant: Cann''t run. N=',n); halt;
    end;
  if (n=1)
    then d:=a[1,1]
  else if (n=2)
    then d:=a[1,1]*a[2,2]-a[2,1]*a[1,2]
  else { n>2 }
    for i:=1 to n do
      begin
      matrix.GetMatr(a,b,n,i,1);

      d:=d+k*a[i,1]*Determinant(b,n-1);
      k:=-k;
      end;
  Determinant:=d;
  end;
procedure matrix.vvod;
var

    i,j:longint;

begin

randomize;
repeat
{writeln('Vvedite razmer matrici');
readln(n);}
until n<14;
for i:=1 to n do
for j:=1 to n do
  a[i,j]:=random(5);
{matrix.PrintMatr(a,n);}
end;


var
mat:matrix;
 a1,b1,m1:matr;
   o1, i1,j1,dt:longint;
    n1,d:integer;
begin
writeln('vvedite razmer matrici');
mat.init(n1,a1,b1,m1,o1,j1,i1);
read(n1);
mat.vvod;


mat.GetMatr(a1,b1,o1,i1,j1);
mat.PrintMatr(m1,n1);
mat.Determinant(a1,n1);
writeln('=========');
writeln('Determinant=',d);
readln;
end.
Вижу, что стремление есть, но дубли делать не стоит - лучше попросить переместить. SupVis
Пока ремонтируют кукольный домик, живу на форуме.

Последний раз редактировалось SuperVisor; 05.12.2008 в 15:47. Причина: Переместил из новой темы паскаля
Барби вне форума Ответить с цитированием
Старый 05.12.2008, 15:42   #19
alex_fcsm
Участник клуба
 
Аватар для alex_fcsm
 
Регистрация: 10.11.2008
Сообщений: 1,502
По умолчанию

Код:
..........
begin
writeln('vvedite razmer matrici');
read(n1);
mat.init(n1,a1,b1,m1,o1,j1,i1);
.........
Нормальное состояние техники - нерабочее, все остальное частный случай.
alex_fcsm вне форума Ответить с цитированием
Старый 05.12.2008, 15:55   #20
Барби
Форумчанин
 
Аватар для Барби
 
Регистрация: 19.12.2007
Сообщений: 159
По умолчанию

Все равно не передается, после ввода n gпрограмма закрывается, елси тут же прокомпилировать выдаются результаты предыдущего и там вся матрица заполненная только нулями и определитель равный нулю. т.е. где то я еще напортачила.
Пока ремонтируют кукольный домик, живу на форуме.
Барби вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Квадратная матрица в Delphi Tomoyo Помощь студентам 10 12.11.2008 18:35
Квадратная матрица [C++Builder] conqueror Помощь студентам 1 28.10.2008 11:11
С++:Квадратная матрица и шахматная проблема.. Andres Помощь студентам 7 02.01.2008 21:06
Дана целочисленная квадратная матрица... kitty Помощь студентам 1 05.12.2007 07:40
Паскаль. Квадратная матрица Deimossy Помощь студентам 2 20.11.2007 13:23