IPB
ЛогинПароль:

> вещественная матрица, ООП в ТР
Svetlana
сообщение 16.09.2009 18:04
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Женский

Репутация: -  0  +


Помогите, пожалуйста, доработать код.Думаю ошибок там много(((

program lab_a;
{Описать класс, реализующий тип данных "вещественная матрица" и работу
с ними.Методы класса должны обеспечивать:
сложение, вычитание, умножение матриц (умножение, как на другую
матрицу, так и на число);
вычисление транспонированной матриц;
проверку типа матрицы (квадратная, диагональная, нулевая, единичная);
Написать программу, демонстрирующую работу с этим классом.}

{$APPTYPE CONSOLE}

uses
SysUtils;

type
veshmatr=class
X:array of array of Double;
n,m:integer;

Procedure vvod (var B:veshmatr);
Procedure vivod ( var B:veshmatr);
Procedure slosh(const A,B:veshmatr; var C:veshmatr);
Procedure vichet(const A,B:veshmatr; var C:veshmatr);
Procedure umnosh_na_chislo(const A:veshmatr; var B:veshmatr);
Procedure umnosh_na_matr(const A,B:veshmatr; var C:veshmatr);
Procedure transpan(const A:veshmatr;var B:veshmatr);
Function TypematriX:string;{определяет тип матрицы:квадратная,
диоганальная,нулевая или единичная}
end;


var
W,R,T:veshmatr;
i,j,k:integer;


procedure veshmatr.vvod( var B:veshmatr);
begin for i:=1 to n do
for j:=1 to m do begin
write('vvedite_element[',i,',',j,']=','');
readln(B.X[i,j]) end
end;

Procedure veshmatr.vivod ( var B:veshmatr);
begin
for i:=1 to n do begin
for j:=1 to m do writeln(' ',B.X[i,j]:12:3); writeln end;

end;

Procedure veshmatr.slosh(const A,B:veshmatr; var C:veshmatr);
begin
for I := 1 to n do
for j := 1 to m do
begin C.X[i,j]:=A.X[i,j]+B.X[i,j] end;
end;

Procedure veshmatr.vichet(const A,B:veshmatr; var C:veshmatr);
begin
for I := 1 to n do
for j := 1 to m do
begin C.X[i,j] :=A.X[i,j]-B.X[i,j] end;
end;

Procedure veshmatr.umnosh_na_chislo(const A:veshmatr; var B:veshmatr);
var chislo:double;
begin
writeln('vvedite_chislo');
readln(chislo);
for i:=1 to n do
for j:=1 to m do
begin B.X[i,j]:= A.X[i,j] * chislo end
end;

Procedure veshmatr.umnosh_na_matr(const A,B:veshmatr; var C:veshmatr);
var
i,j,k:word;
begin for i:=1 to n do
for j:=1 to m do
begin
C.X[i,j]:=0;
for k:=1 to n do
C.X[i,j]:=C.X[i,j]+A.X[i,k]*B.X[k,j]; end;
end;

Procedure veshmatr.transpan( const A:veshmatr;var B:veshmatr);
var
i,j:integer;
begin
for i:=1 to n do
for j:=i to m do
B.X[i,j]:=A.X[j,i];
end;

Function veshmatr.TypematriX:string;
begin
if n=m then writeln('matrica_kvadratnaya');

for i:=1 to n do
for j:=1 to m do begin
if (i<>j) and (X[i,j]=0) then writeln('matrica_diagonalnaya');
if X[i,j]=0 then writeln('matrica_nulevaya'); end;

for i:=1 to n do
for j:=1 to m do
if (i=j) and (X[i,j]=1) then writeln('matrica_edinichnaya')

end;

{начало программы}
begin
W:= veshmatr.Create; {создаём первую матрицу}
W.vvod(W); {ввод первой матрицы}
R:= veshmatr.Create; {создаём 2-ую матрицу}
R.vvod®; {ввод 2-ой матрицы}
T.slosh(W,R,T);
T.vivod(T);
T.vichet(W,R,T);
T.vivod (T);
R.umnosh_na_chislo(W,R);
R.vivod ®;
T.umnosh_na_matr(W,R,T);
T.vivod (T);
R.transpan(R,T);
R.vivod ®;


W.Free; {удаляем объект}
R.Free;
T.Free;

readln
end.




Сообщение отредактировано: Svetlana - 16.09.2009 18:07
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 16.09.2009 21:22
Сообщение #2


Гость






В таком случае вот тебе информация к размышлению:

type
veshmatr=class
X:array of array of Double;
n,m:integer;
Procedure vvod;
Procedure vivod;

Constructor Create;

Procedure Add(const A: veshmatr); // self := self + A
Procedure Sub(const A: veshmatr); // self := self - A
Procedure Mult(f: double); // self := self * f
Procedure Mult(const A: veshmatr); // self := self * A
Procedure Transpose; // self := T(self)
Function TypematriX: string;
end;

Этого интерфейса в принципе достаточно, чтобы организовать тот класс, который тебе нужен. В Object Pascal-е есть перегрузка (overloading) функций, так что одно имя можно использовать для нескольких методов, при условии, что в них будут передаваться разные параметры (что я и сделал на примере Mult). Второе: обрати внимание, у тебя все время должен изменяться тот экземпляр, для которого вызван метод. Поэтому нет нужды передавать в качестве параметров исходную матрицу, и результат тоже. Только второй параметр - то, что находится справа от знака операции.

Еще одно: никогда не делай так, как пыталась сделать в методе umnosh_na_chislo (я про то, что ты внутри метода пытаешься заставить пользователя ввести само число, на которое надо умножить матрицу.) Этого делать нельзя ни в коем случае: метод занимается ТОЛЬКО перемножением матрицы на число. Всё, больше ничем. Он получает на вход ТОЛЬКО число, на которое надо умножить матрицу. Как и когда ты получаешь от пользователя это число - это твоя проблема, метод об этом знать ничего не должен, это не его дело. Его дело - получить матрицу и число, и перемножить их. Точка. Не пытайся возхложить на методы чужую работу. Каждый должен заниматься своим делом. Кто-то складывает, кто-то перемножает, кто-то вводит данные, кто-то выводит их. А не "все вперемешку".

Тему переношу в 32-битные компиляторы, там гораздо ближе к Object-Pascal-ю.

Дальше сама справишься?
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 14.07.2025 1:05
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"