TranceR 1 / 1 / 0 Регистрация: 30.10.2008 Сообщений: 3 |
||||
1 |
||||
Определитель матрицы30.10.2008, 20:51. Показов 19775. Ответов 14 Метки нет (Все метки)
Народ помогите,не пойму почему прога не работает:
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
30.10.2008, 20:51 |
14 |
4 / 4 / 0 Регистрация: 16.09.2008 Сообщений: 45 |
|
30.10.2008, 23:16 |
2 |
Что ета програма должна делать ????Для чего она????
0 |
Почетный модератор 64287 / 47586 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
|
30.10.2008, 23:48 |
3 |
Что ета програма должна делать ????Для чего она???? Человек пытается найти определитель матрицы. Содрал окуда-то кривой код или криво списал, а что делать, понятия не имеет.
0 |
(Yellow_Duck) 1261 / 130 / 15 Регистрация: 16.10.2008 Сообщений: 733 |
|
31.10.2008, 02:23 |
4 |
Трансер, ты код оформи нормально, тогда скажу Добавлено через 31 секунду
0 |
18 / 18 / 0 Регистрация: 29.10.2008 Сообщений: 100 |
|
31.10.2008, 10:13 |
5 |
что тебе нужно сделать в задаче?
0 |
TranceR 1 / 1 / 0 Регистрация: 30.10.2008 Сообщений: 3 |
||||
01.11.2008, 03:42 [ТС] |
6 |
|||
Да,действительно я пытаюсь найти опредилитель матрицы,но код я нигде не сдирал и криво не списывал,просто по данному мне алгоритму(данному преподом) написал прогу,и он,увидев ее,сказал что она должна работать,а она увы не хочет и я не могу разобраться в чем дело(наверно ввиду слабоватых знаний в области програмирования)поэтому и прошу помощи…. Добавлено через 1 час 51 минуту 41 секунду
Трансер, ты код оформи нормально, тогда скажу Добавлено через 31 секунду
0 |
Puporev Почетный модератор 64287 / 47586 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
||||
01.11.2008, 07:18 |
7 |
|||
Сообщение было отмечено как решение Решение Вы меня конечно извините, но в следующий раз оформляйте код так, чтобы его можно было читать и приводите полное условие Вашей задачи, а то почему код не работает? Ответ: а фиг его знает. Потому что читать такой код никто не будет.
6 |
1 / 1 / 0 Регистрация: 30.10.2008 Сообщений: 3 |
|
01.11.2008, 10:01 [ТС] |
8 |
спс огромное =)))
1 |
2 / 2 / 0 Регистрация: 18.12.2009 Сообщений: 11 |
|
23.05.2010, 08:23 |
9 |
Error 200: Division by zero Выходит вот такая ошибка. Убрал uses crt и clrscr, все равно выходит.
1 |
Почетный модератор 64287 / 47586 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
|
23.05.2010, 08:28 |
10 |
Возможно вводите коэффициенты полностью вырожденной матрицы, в программе такая проверка вроде не предусмотрена. Попробуйте ввести коэффициенты системы, заведомо имеющей решение. Добавлено через 1 минуту begin //основная программа Вот это условие не выполнили и вообще не ввели матрицу?
1 |
2 / 2 / 0 Регистрация: 18.12.2009 Сообщений: 11 |
|
23.05.2010, 08:44 |
11 |
Puporev, покажите пожалуйста правильный ввод. //здесь напишете ввод как Вам больше нравится Возможно здесь неправильно ввожу. Добавлено через 4 минуты
Возможно вводите коэффициенты полностью вырожденной матрицы, в программе такая проверка вроде не предусмотрена. Попробуйте ввести коэффициенты системы, заведомо имеющей решение. Добавлено через 1 минуту Вот это условие не выполнили и вообще не ввели матрицу? Например вот такую матрицу как ввести:
1 |
Puporev Почетный модератор 64287 / 47586 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
||||||||||||||||
23.05.2010, 08:52 |
12 |
|||||||||||||||
И введите числа, какие хотите. Добавлено через 1 минуту
здесь вводите по 3 числа в строку, жмете Enter Добавлено через 3 минуты
Можно вообще рандомно
А вообще, не умея ввести матрицу, кто Вам поверит, что Вы написали алгоритм нахождения определителя.
1 |
2 / 2 / 0 Регистрация: 18.12.2009 Сообщений: 11 |
|
23.05.2010, 08:55 |
13 |
Puporev большое спасибо.
0 |
0 / 0 / 0 Регистрация: 26.09.2012 Сообщений: 87 |
|
16.04.2013, 08:55 |
14 |
Puporev, Введите тест для 2 порядка:
0 |
ManticoR 0 / 0 / 0 Регистрация: 24.09.2013 Сообщений: 7 |
||||
06.12.2015, 09:35 |
15 |
|||
поправил функцию. Не нужно вызывать функцию знака на каждом ряду, лучше один раз, в конце, после того, как будет известен определитель. Ибо после двух перестановок, у вас получиться только одно изменение знака, а это уже бага. а за код спасибо, сэкономил немного времени)
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
06.12.2015, 09:35 |
15 |
program opred; uses crt; const n=3; type Tmatr=array [1..n,1..n] of real; var a:Tmatr; det:real;//определитель //процедура перестановки строк, чтобы главный элемент не оказался //нолем или близким к нулю значением procedure Per(k,n:integer;var a:Tmatr; var p:integer); var i,j:integer;z:real; begin z:=a[k,k];i:=k;p:=0; //после каждого преобразования for j:=k+1 to n do //ищем по оставшимся строкам begin if abs(a[j,k])>z then //максимальный по модулю элемент begin z:=abs(a[j,k]);i:=j; //запоминаем номер строки p:=p+1;//считаем количество перестановок, т.к. при каждой //перестановке меняется знак определителя end; end; if i>k then //если эта строка ниже данной for j:=k to n do begin z:=a[i,j];a[i,j]:=a[k,j];a[k,j]:=z;//перестановка end; end; function znak(p:integer):integer;//ф-я определения знака определителя begin if p mod 2=0 then //если четное количество перестановок, "+" , если нет "-" znak:=1 else znak:=-1; end; procedure opr(n:integer;var a:Tmatr;var det:real);//собственно определитель var k,i,j,p:integer; r:real; begin det:=1; for k:=1 to n do //считаем по алгоритму, который во всех учебниках begin if a[k,k]=0 then per(k,n,a,p);//если главный элемент=0, делаем перестановку det:=znak(p)*det*a[k,k]; //меняем знак определителя for j:=k+1 to n do //делаем преобразования begin r:=a[j,k]/a[k,k]; for i:=k to n do begin a[j,i]:=a[j,i]-r*a[k,i]; end; end; end; end; begin //основная программа clrscr; //здесь напишете ввод как Вам больше нравится opr(n,a,det); write('opr=',det:4:0); readln end.
Вычисление произведения “сцепленных” матриц.
Например:
(2, 3) Х (3, 3) = (2, 3)
(3, 2) Х (2, 5) = (3, 5)
Type
TType = Integer;Const
nRowFirst = 3; { Количество строк первой матрицы }
nCommon = 2; { Количество столбцов первой и строк второй матрицы }
nColSecond = 5; { Количество столбцов второй матрицы }Type
TFirst = { Тип данных для хранения первой матрицы }
Array[1 .. nRowFirst, 1 .. nCommon] Of TType;
TSecond = { Тип данных для хранения второй матрицы }
Array[1 .. nCommon, 1 .. nColSecond] Of TType;
TResult = { Тип данных для хранения результата }
Array[1 .. nRowFirst, 1 .. nColSecond] Of TType;{ Собственно процедура перемножения матриц: (res) = (a) X (B) }
Procedure matrixMult(Var res: TResult;
a: TFirst; b: TSecond);
Var i, j, k: Integer;
Begin
For i := 1 To nRowFirst Do
For j := 1 To nColSecond Do
Begin
res[i, j] := 0;
For k := 1 To nCommon Do
res[i, j] := res[i, j] + a[i, k] * b[k, j];
End
End;var
iRow, iCol: Integer;
m1: TFirst; m2: TSecond;
mr: TResult;
begin
WriteLn('Ввод первой матрицы: (', nRowFirst, 'x', nCommon, ')');
For iRow := 1 To nRowFirst Do
For iCol := 1 To nCommon Do
Begin
Write('m1[', iRow, ',', iCol,'] : ');
ReadLn(m1[iRow, iCol])
End;WriteLn('Ввод второй матрицы: (', nCommon, 'x', nColSecond, ')');
For iRow := 1 To nCommon Do
For iCol := 1 To nColSecond Do
Begin
Write('m2[', iRow, ',', iCol,'] : ');
ReadLn(m2[iRow, iCol])
End;matrixMult(mr, m1, m2); { Вызов процедуры перемножения }
WriteLn('Результирующая матрица: (', nRowFirst, 'x', nColSecond, ')');
For iRow := 1 To nRowFirst Do
Begin
For iCol := 1 To nColSecond Do
Write(mr[iRow, iCol]:4);
WriteLn
End;
end.
Вычисление детерминанта (определителя) матрицы с помощью рекурсии.
Const
max_n = 4;Type
matrix = Array[1 .. max_n, 1 .. max_n] Of real;{ Матрица, для которой будет вычисляться определитель }
Const
a: matrix =
((2, 9, 9, 4),
(2, -3, 12, 8),
(4, 8, 3, -5),
(1, 2, 6, 4));function minusOne(n: integer): integer;
begin
minusOne := (1 - 2*Byte(Odd(n)));
end;function get_addr(i, j: integer;
const n: integer): integer;
begin
get_addr := pred(i) * n + j
end;{ Рекурсивное определение определителя }
Function det(Var p; Const n: integer): real;
Type
matrix = Array[1 .. max_n * max_n] Of real;
Var
my_p: matrix Absolute p;
pp: ^matrix;
s: real;
i, j, curr: integer;
Begin
s := 0.0;If n = 2 Then
Begin
det := my_p[1]*my_p[4] - my_p[2]*my_p[3]; exit
End;For i := 1 To n Do
Begin
GetMem(pp, Sqr(Pred(n)) * SizeOf(real));
curr := 1;
For j := 1 To n Do
If j <> i Then
Begin
move(my_p[get_addr(j, 2, n)], pp^[get_addr(curr, 1, Pred(n))],
pred(n) * SizeOf(real));
inc(curr);
End;s := s + minusOne(Succ(i)) * my_p[get_addr(i, 1, n)] *
det(pp^, Pred(n));
FreeMem(pp, Sqr(Pred(n)) * SizeOf(real))
End;det := s
End;begin
WriteLn( det(a, 4):0:0 );
end.
Скачать:
REC_DET.PAS ( 1.28 килобайт )
Кол-во скачиваний: 1346
program determinant_4; uses crt; var a11, a12, a13, a14, a21, a22, a23, a24, a31, a32, a33, a34, a41, a42, a43, a44, x: real; begin textcolor(white); textbackground(blue); clrscr; writeln(' ABROR TOJIBOYEV'); write('a11='); read(a11); write('a12='); read(a12); write('a13='); read(a13); write('a14='); read(a14); write('a21='); read(a21); write('a22='); read(a22); write('a23='); read(a23); write('a24='); read(a24); write('a31='); read(a31); write('a32='); read(a32); write('a33='); read(a33); write('a34='); read(a34); write('a41='); read(a41); write('a42='); read(a42); write('a43='); read(a43); write('a44='); read(a44); x := ((a11 * ((a22 * a33 * a44) + (a23 * a34 * a42) + (a32 * a43 * a24) - (a42 * a33 * a24) - (a43 * a34 * a22) - (a23 * a32 * a44))) - (a12 * ((a21 * a33 * a44) + (a23 * a34 * a41) + (a31 * a43 * a24) - (a41 * a33 * a24) - (a43 * a34 * a21) - (a31 * a23 * a44))) + (a13 * ((a21 * a32 * a44) + (a22 * a34 * a41) + (a31 * a42 * a24) - (a41 * a32 * a24) - (a42 * a34 * a21) - (a31 * a22 * a44))) - (a14 * ((a21 * a32 * a43) + (a22 * a33 * a41) + (a31 * a42 * a23) - (a41 * a32 * a23) - (a42 * a33 * a21) - (a31 * a22 * a43)))); writeln('determinant=', x:8:6); readln; end.