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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2008, 16:03   #21
alex_fcsm
Участник клуба
 
Аватар для alex_fcsm
 
Регистрация: 10.11.2008
Сообщений: 1,502
По умолчанию

Вы печатаете матрицу m а инициализируете a
Нормальное состояние техники - нерабочее, все остальное частный случай.
alex_fcsm вне форума Ответить с цитированием
Старый 05.12.2008, 16:19   #22
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

Барби, а зачем вы вообще выбрали объектную модель в данном случае?
Как уже было предложено используйте динамический массив:
Цитата:
Сообщение от SNUPY Посмотреть сообщение
К сожалению в придложенной Вами конструкции n должна быть константой =\. В паскале не уверен, но в Delphi матрицу произвольного размера объявляют так:
Код:
a:array of array of integer;
Нам Дельфи не нужна, поэтому смотрим сюда
Объявляем динамические массивы и работаем с ними.
Константы будут определять размерность массива при выполнении каких-либо действий на ним.
Познавая других, мы познаем себя.
С'est la vie...
SuperVisor вне форума Ответить с цитированием
Старый 05.12.2008, 16:30   #23
Барби
Форумчанин
 
Аватар для Барби
 
Регистрация: 19.12.2007
Сообщений: 159
По умолчанию

разве студент выбирает. ему дано задание создать объект вот и создаю объект. предмет ООП просто.

убрала вобще массив а, теперь матрица выводиться, правда почему то не сразу а только после повторной компиляции, но определитель не считается.
Код:
program mtr;

type

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


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

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

i,j:longint;
begin
n:=n1;
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(m1: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]:=m[ki+di,kj+dj];
      end;
    end;
  end;
Function matrix.Determinant(m1: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:=m[1,1]
  else if (n=2)
    then d:=m[1,1]*m[2,2]-m[2,1]*m[1,2]
  else { n>2 }
    for i:=1 to n do
      begin
      matrix.GetMatr(m,b,n,i,1);

      d:=d+k*m[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
  m[i,j]:=random(5);
{matrix.PrintMatr(m,n);}
end;


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

mat.vvod;


mat.GetMatr(m1,b1,o1,i1,j1);
mat.PrintMatr(m1,n1);
mat.Determinant(m1,n1);
writeln('=========');
writeln('Determinant=',d);
readln;
end.
Пока ремонтируют кукольный домик, живу на форуме.
Барби вне форума Ответить с цитированием
Старый 05.12.2008, 16:37   #24
alex_fcsm
Участник клуба
 
Аватар для alex_fcsm
 
Регистрация: 10.11.2008
Сообщений: 1,502
По умолчанию

Будьте внимательнее
Код:
writeln('Determinant=',mat.Determinant(m1,n1));
Нормальное состояние техники - нерабочее, все остальное частный случай.
alex_fcsm вне форума Ответить с цитированием
Старый 05.12.2008, 16:48   #25
Барби
Форумчанин
 
Аватар для Барби
 
Регистрация: 19.12.2007
Сообщений: 159
По умолчанию

теперь все считается, но теперь новая проблема. Если ввожу размер больше 2, то программа ругается и пишет стек заполнен, а сегодня утром можно было вводить до 13 и не ругалось. Что я такое поправила что так уменьшила? Выводиться матрица и определитель не сразу а после повторной компиляции. Ну почему не понимаю все же вроде правильно.
Пока ремонтируют кукольный домик, живу на форуме.
Барби вне форума Ответить с цитированием
Старый 05.12.2008, 16:57   #26
alex_fcsm
Участник клуба
 
Аватар для alex_fcsm
 
Регистрация: 10.11.2008
Сообщений: 1,502
По умолчанию Попробуйте разобраться

В настройках паскаля выставьте

Options->Compiler->Numeruc processing (8087/80287)

Код:
program mtr;

type

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


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

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

i,j:longint;
begin
n:=n1;
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(m1: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]:=m[ki+di,kj+dj];
      end;
    end;
  end;


Function matrix.Determinant(a:matr;n1:integer):double;
var   d: double;
  i: integer;
   b1: array[1..13] of boolean;
procedure thread(p:real; e,i: integer);
var
  j,f,z: integer;
begin
  if odd(e) then z:=-1 else z:=1;
  if i > n1 then d:=d+p*z else
    if p <> 0 then begin
      f:=0;
      for j:=n1 downto 1 do
        if b1[j] then f:=f+1 else begin
          b1[j]:=true;
          thread(p*m[i,j],e+f,i+1);
          b1[j]:=false;
        end;
    end;
end;
begin
  for i:=1 to n1 do b1[i]:=false;
  d:=0; thread(1,0,1);
  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
  m[i,j]:=random(5);
{matrix.PrintMatr(m,n);}
end;


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

mat.vvod;


mat.GetMatr(m1,b1,o1,i1,j1);
mat.PrintMatr(m1,n1);
writeln('=========');
writeln('Determinant=',mat.Determinant(m1,n1));
readln;
end.
Нормальное состояние техники - нерабочее, все остальное частный случай.
alex_fcsm вне форума Ответить с цитированием
Старый 05.12.2008, 17:12   #27
Барби
Форумчанин
 
Аватар для Барби
 
Регистрация: 19.12.2007
Сообщений: 159
По умолчанию

Я так понимаю добавленная процедура для расширения стека?
Компилирую ввожу n? программа закрывается, компилирую вижу свое n, вижу выведенную матрицу, вижу посчитанный определитель. Значит выводятся они родимые, но почему не сразу?
Пока ремонтируют кукольный домик, живу на форуме.
Барби вне форума Ответить с цитированием
Старый 05.12.2008, 17:26   #28
alex_fcsm
Участник клуба
 
Аватар для alex_fcsm
 
Регистрация: 10.11.2008
Сообщений: 1,502
По умолчанию

У меня с первого раза все работает. Изменилась функция подсчета определителя(взял с форума чтобы далеко не бегать ).
Нормальное состояние техники - нерабочее, все остальное частный случай.
alex_fcsm вне форума Ответить с цитированием
Старый 05.12.2008, 17:43   #29
Барби
Форумчанин
 
Аватар для Барби
 
Регистрация: 19.12.2007
Сообщений: 159
По умолчанию

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

После каждого выражения, вы можете добавить опции форматирования:
writeln(x:width: precision)
:width ширина поля для строк + чисел
: precision десятичные цифры для чисел
Нормальное состояние техники - нерабочее, все остальное частный случай.
alex_fcsm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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