Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Задача с объектами

Автор: dimon1988 5.06.2007 3:07

Помогите решить задачу, а то я что-то зашел в тупик...
"Нахождение суммы,разности,присваивания,произведения векторов и матриц различных типов (целого,вещественного,комплексного). С помощью этих объектов найдите n-ю степень матрицы"
Уже столько форумов перерыл, нигде ничего толкового нету...может вы мне поможите sad.gif
Буду очень благодарен

Автор: volvo 5.06.2007 3:14

В чем именно проблема? По отдельности все присутствует на форуме: и сложение матриц, и перемножение, и вычитание... То же самое и с векторами... Воспользуйся поиском

Собери это все в одну программу и будет то, что тебе нужно (а что тебе нужно - знаешь только ты... Здесь помочь тебе невозможно, ты НИЧЕГО не написал конкретного - только общие слова).

Автор: dimon1988 5.06.2007 3:23

Фишка в том что надо сделать все с объектами...
Надо создать объект матрицу и вектор, в котором должен быть набор функций нахождения суммы,разности,присваивания,произведения различных типов (целого,вещественного,комплексного).

Автор: volvo 5.06.2007 3:25

http://volvo71.narod.ru/faq_folder/dyn_arr.htm#dyn_mx_1

Разберешься?

P.S.
Там же на сайте описан способ, как заставить программу работать с любым типом данных...

Автор: dimon1988 5.06.2007 3:29

Спасибо,сейчас посмотрю

Автор: dimon1988 5.06.2007 3:58

volvo, не могли бы вы показать мне, например, реализацию умножения матриц,чтобы я мог по аналогии уже дальше делать?

Автор: volvo 5.06.2007 5:03

Используя мои определения типов - так:

procedure mult(const m1, m2: tmatrix; var r: tmatrix);
var i, j, k: integer;
begin
r.zero(m1.get_row_count, m2.get_vector(1)^.size);

for i := 1 to m1.get_row_count do
for j := 1 to m2.get_vector(1)^.size do begin

for k := 1 to m2.get_row_count do
r.get_vector(i)^.put(j, r.get_vector(i)^.get(j)^ +
m1.get_vector(i)^.get(k)^ * m2.get_vector(k)^.get(j)^);

end;
end;


Автор: dimon1988 5.06.2007 13:21

Спасибо большое

Автор: dimon1988 5.06.2007 14:36

У меня возникает ошибка "Too many variables", когда я пытаюсь добавить в варе еще одну матрицу. Вот код:


program objects;
uses crt;
type
matrix = object
n,m:integer;
mas: array[1..100,1..100] of real;
procedure Init(var a:matrix);
procedure Print(var a:matrix);
end;

procedure matrix.Init;
var i,j:byte;
begin
writeln('Vvedite kolichestvo stolbcov matrici: ');
readln(a.n);
writeln('Vvedite kolichestvo strok matrici: ');
readln(a.m);
for i:=1 to a.n do begin
for j:=1 to a.m do begin
writeln('Vvedite element [',i,',',j,']');
readln(a.mas[i,j]);
end;
end;
end;

procedure matrix.Print;
var i,j:byte;
begin
for j:=1 to a.m do begin
if j<>1 then
writeln('');
for i:=1 to a.n do begin
write(a.mas[i,j]:8:0);
end;
end;
end;

var x1:matrix;
begin
clrscr;
x1.Init(x1);
x1.print(x1);
end.



Добавлено через 2 мин.
У меня возникает ошибка "Too many variables", когда я пытаюсь добавить в варе еще одну матрицу. Вот код:
Может кто-нибудь знает в чем дело?

Автор: volvo 5.06.2007 16:47

Цитата
Может кто-нибудь знает в чем дело?
В ограничении суммарного размера всех переменных размером сегмента данных... Т.е., больше 64К под статические переменные ты отвести не можешь. Что происходит у тебя, посмотри:

...
mas: array[1..100,1..100] of real; { размер = 100*100*sizeof(real) = 60000 байт }
...

Добавляешь еще одну - получаешь 120К. Перебор...

Автор: dimon1988 5.06.2007 17:24

А,ясно. Большое спасибо)

Автор: dimon1988 6.06.2007 0:05

Еще вопросик, я вот написал сам умножение матриц,вроде все работает только почему-то иногда вылетают какие-то левые числа. Никак не пойму в чем дело


procedure matrix.Init;
var i,j:byte;
begin
writeln('Vvedite kolichestvo stolbcov matrici: ');
readln(a.n);
writeln('Vvedite kolichestvo strok matrici: ');
readln(a.m);
for i:=1 to a.m do begin
for j:=1 to a.n do begin
writeln('Vvedite element [',i,',',j,']');
readln(a.mas[i,j]);
end;
end;
end;

procedure matrix.Umnozh;
label endproc;
var i,j,r:byte;
c:matrix;
k,p:integer;
begin
if a.n<>b.m then begin
writeln('Nelza umnozhit');
goto endproc;
end;
c.n:=b.n;
c.m:=a.m;
for j:=1 to a.m do begin
for i:=1 to a.n do begin
r:=0;
for k:=1 to c.m do begin
r:=r+a.mas[i,k]*b.mas[k,j];
end;
c.mas[i,j]:=r;
end;
end;
result:=c;
endproc:
end;


Автор: volvo 6.06.2007 0:15

А что обязательно перевернуть все с ног на голову, а потом искать ошибку? Что, нельзя посмотреть, как сделано здесь: http://forum.pascal.net.ru/index.php?s=&showtopic=2694&view=findpost&p=23475 (вычисление произведения "сцепленных" матриц) и сделать по аналогии, а обязательно перепутать ВСЕ циклы местами? Хотя с ТАКИМИ названиями переменных это не мудрено... Что у тебя a.m - число строк или число столбцов - это известно только тебе... Назвать поле, скажем, a.rowsCount - просто никак нельзя, правда? Слишком просто все получится... Сложностей не создаст тебе программа - это нехорошо...

Автор: dimon1988 6.06.2007 0:17

Эххх,это да,ладно,спасибо. Буду разбираться