![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте!
В ходе работы над моей программой, у меня возникло много проблем с динамическими массивами. Дело в том, что я хочу задать рекуррентную функцию для нахождения определителя матрицы любого размера по правилу Лапласа. В принципе с самим алгоритмом мне все ясно, если заменить динамические массивы на статические, то всё нормально работает. Однако я совсем не понимаю как это сделать через динамические массивы. Подскажите, что не так в моём коде. =D Код:
program LaplasRule;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
arr:array of array of real; {исходная матрица}
det:integer;
function lap(arr:array of array of real): real; {собственно тут ошибка}
var
i,j,l,s:integer; {i-строка; j-столбец; l-столбец, по которуму расскладываем; s-размер исходной матрицы}
brr:array of array of real; {матрица алгеброического дополнения}
begin
s:=high(arr);
if s<>0 then
begin
setlength(brr,s,s);
for l:=0 to s do {выбираем столбец по которому раскладываем}
begin
for j:=0 to dec(l) do {перенос элементов из исх. матрицы в матрицу алг. доп.}
for i:=1 to s do
brr[i-1,j]:=arr[i,j];
for j:=inc(l) to s do
for i:=1 to s
brr[i-1,j-1]:=arr[i,j];
lap:=arr[1,l]*lap(brr)*intpower(-1,l+1)+lap
end
end
else
lap:=arr[1,1] {для случая когда матрица 1x1 :3}
end;
begin
setlength(arr,4,4); {исходная матрица}
arr[0,0]:=3;
arr[0,1]:=3;
arr[0,2]:=4;
arr[0,3]:=2;
arr[1,0]:=1;
arr[1,1]:=2;
arr[1,2]:=2;
arr[1,3]:=1;
arr[2,0]:=1;
arr[2,1]:=3;
arr[2,2]:=4;
arr[2,3]:=1;
arr[3,0]:=0;
arr[3,1]:=1;
arr[3,2]:=1;
arr[3,3]:=1; {определитель исходной матрицы равен 1}
det:=lap(arr);
writeln(det) {вывод определителя}
end.Заранее спасибо, Noqrax. |
|
#2
|
||||
|
||||
|
Ну не понимаю я стремления передавать в процедуры/функции указатель на глобальную переменную.
Код:
function lap(locarr : arr) : Single; |
|
#3
|
||||
|
||||
|
Код:
uses
SysUtils;
type
TArr:array of array of single;
var
arr:TArr; {исходная матрица}
det:integer;
function lap(locarr :TArr): single;
...... |
|
#4
|
|||
|
|||
|
1) А разве имеет значение какую переменную я укажу внутри функции?
2) Почему я вообще должен вводить новый тип чтобы использовать в процедуре/функции? 3) И даже если произвести все изменения выводит ошибку о несовместимых типах. Тут я уже совсем не пойму... =/ Последний раз редактировалось Noqrax, 06.04.2012 в 22:19. |
|
#5
|
||||
|
||||
|
Цитата:
Цитата:
|
|
#6
|
|||
|
|||
|
Уверен? Конечно, потому, что первым делом я написал программу со статическими массивами. Самое интересное, что я использовал глобальные переменные в задании функции и это мне ничем не помешало написать рабочую программу. Может это и дурной тон, но лично я в этом не вижу смысла, если работает и так. Да и поменять single на real не так важно.
Что касается остальных недочетов... Да я мог что-то из-за невнимательности не дописать: Код:
for j:=inc(l) to s do
for i:=1 to s
brr[i-1,j-1]:=arr[i,j]; |
|
#7
|
||||
|
||||
|
Ну тогда с вами всё ясно:
Код:
for j:=0 to dec(l) Код:
s:=high(arr);
...
setlength(brr,s,s); Код:
lap:=arr[1,l]*lap(brr)*intpower(-1,l+1)+lap это вообще шедевр программирования Код:
det:=lap(arr);
writeln(det) {вывод определителя}P.S. Уважаемый, идите пудрить мозги в другое место. |
|
#8
|
|||
|
|||
|
To angvelem
Уважаемый, Вы хотя бы день можете провести без оскорблений и переходов на личности на форуме? |
| Этот пользователь сказал Спасибо nixel за это полезное сообщение: | ||
Noqrax (07.04.2012)
| ||
|
#9
|
|||
|
|||
|
Спасибо за найденные ошибки. Но проблему не решило.
Что касается массива brr, то он и должен быть меньше оригинального. Т.к. если раскладывать по одной строке то в качестве алг. дополнения будет выступать матрица меньшей размерности. Вот исправленная версия: Код:
program LaplasRule;
{$APPTYPE CONSOLE}
uses
SysUtils,Math;
type
darr = array of array of single;
var
arr:darr; {исходная матрица}
det:real;
function lap(crr:darr): single; {собственно тут ошибка}
var
i,j,l,s:integer; {i-строка; j-столбец; l-столбец, по которуму расскладываем; s-размер исходной матрицы}
brr:array of array of single; {матрица алгеброического дополнения}
begin
s:=high(crr);
if s<>0 then
begin
setlength(brr,s,s);
for l:=0 to s do {выбираем столбец по которому раскладываем}
begin
for j:=0 to l-1 do {перенос элементов из исх. матрицы в матрицу алг. доп.}
for i:=1 to s do
brr[i-1,j]:=crr[i,j];
for j:=l+1 to s do
for i:=1 to s do
brr[i-1,j-1]:=crr[i,j];
lap:=crr[1,l]*lap(brr)*intpower(-1,l+1)+lap
end
end
else
lap:=crr[1,1] {для случая когда матрица 1x1 :3}
end;
begin
setlength(arr,4,4); {исходная матрица}
arr[0,0]:=3;
arr[0,1]:=3;
arr[0,2]:=4;
arr[0,3]:=2;
arr[1,0]:=1;
arr[1,1]:=2;
arr[1,2]:=2;
arr[1,3]:=1;
arr[2,0]:=1;
arr[2,1]:=3;
arr[2,2]:=4;
arr[2,3]:=1;
arr[3,0]:=0;
arr[3,1]:=1;
arr[3,2]:=1;
arr[3,3]:=1; {определитель исходной матрицы равен 1}
det:=lap(arr);
writeln(det) {вывод определителя}
end.Здесь компилятор выдает: Код:
lap:=crr[1,l]*lap(brr)*intpower(-1,l+1)+lap
endКод:
[Error] LaplasRule.dpr(34): Incompatible types [Error] LaplasRule.dpr(35): Not enough actual parameters |
|
#10
|
|||
|
|||
|
Цитата:
Попробуйте lap без параметров заменить на Result. |
|
#11
|
|||
|
|||
|
Вторая ошибка решилась.
Но по-прежнему ошибка несовместимости данных. |
|
#12
|
|||
|
|||
|
Цитата:
Тогда компилятору нужно будет расширять инт до сингл, а не пытаться изменить тип возвращаемого функцией значения, |
|
#13
|
|||
|
|||
|
Я нашел проблему. Она банальная. Заменил brr: array of array of single;
на brr: darr; и программа наконец скомпилировалась. Но теперь новая проблема. Программа считает, что рекурсия бесконечна, хотя это не так. (Ну или должно быть не так =3) |
|
#14
|
|||
|
|||
|
Цитата:
|
|
#15
|
||||
|
||||
|
Цитата:
|