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:43
Сообщение #2


Гость






Я не вижу у тебя нигде инициализации массива Х в классе... У тебя просто попытка записи в неинициализированную переменную. Напиши свой конструктор, в котором сделай SetLength этому массиву, тогда все будет работать. Только вот M, N надо бы знать ДО инициализации.
 К началу страницы 
+ Ответить 
Svetlana
сообщение 16.09.2009 21:45
Сообщение #3


Новичок
*

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

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


Спасибо smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Svetlana
сообщение 14.10.2009 16:29
Сообщение #4


Новичок
*

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

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


Решила написать работающий код(может кому-нибудь пригодится):


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

{$APPTYPE CONSOLE}

uses
SysUtils;


type
veshmatr=class
private{члены класса доступны только в этом модуле и внутри методов этого класса}

X:array of array of real;
n,m:integer;



public {члены класса доступны из лююбой точке программы,где действует описание класса}
Constructor Create;
Procedure vvod (const A:veshmatr) ;
Procedure vivod ( const A:veshmatr);
Procedure Add (const A,B:veshmatr; var C:veshmatr);
Procedure Sub(const A,B:veshmatr; var C:veshmatr);
Procedure Mult(s: Double;const A:veshmatr;var B:veshmatr); overload;
{один и тот же алгоритм для разных типов данных}
Procedure Mult ( const A,B:veshmatr;var C:veshmatr); overload;
Procedure Transpose( const A:veshmatr; var T:veshmatr);
Function TypematriX:string;{определяет тип матрицы:квадратная,
диоганальная,нулевая или единичная}
end;


var
M1,M2,M3,T:veshmatr; {это и есть объекты}
s: Double;
U:string;
Ch:char;

Constructor veshmatr.Create;

begin
inherited Create;{выполнение программы прерывается и вызывается одноименный метод родительского класса}


setlength(X,20,20);
end;





procedure veshmatr.vvod( const A:veshmatr);
var f,z,n,m:integer;
begin write('vvedite_kol-vo_strok_N >>>_'); readln(n);

write('vvedite_kol-vo_stolbofff_M >>>_'); readln(m);
for f:=0 to n-1 do
for z:=0 to m-1 do
begin write('vvedite_[',f,',',z,']','___');
readln(A.X[f,z])
end;
for f:=0 to n-1 do begin {красивый ввод,похоже на матрицу}
for z:=0 to m-1 do write(' ',A.X[f,z]:12:3); writeln end; writeln
end;

Procedure veshmatr.vivod ( const A:veshmatr);
var f,z:integer;
begin writeln('Result:');
for f:=0 to n-1 do begin
for z:=0 to m-1 do write(' ',A.X[f,z]:12:3); writeln end; writeln
end;

Procedure veshmatr.Add(const A,B:veshmatr; var C:veshmatr);
var f,z:integer;
begin
write('vvedite_kol-vo_strok_N >>>_'); readln(n);

write('vvedite_kol-vo_stolbofff_M >>>_'); readln(m);
for f := 0 to n-1 do
for z := 0 to m-1 do
begin C.X[f,z]:=A.X[f,z]+B.X[f,z] end; {складываем две матрицы поэлементно}
end;

Procedure veshmatr.Sub(const A,B:veshmatr; var C:veshmatr);
var f,z:integer;
begin
write('vvedite_kol-vo_strok_N >>>_'); readln(n);

write('vvedite_kol-vo_stolbofff_M >>>_'); readln(m);
for f := 0 to n-1 do
for z:= 0 to m-1 do
begin C.X[f,z] :=A.X[f,z]-B.X[f,z] end; {вычитаем две матрицы поэлементно}
end;

Procedure veshmatr.Mult(s: Double;const A:veshmatr;var B:veshmatr);
var f,z:integer;
begin write('vvedite_kol-vo_strok_N >>>_'); readln(n);

write('vvedite_kol-vo_stolbofff_M >>>_'); readln(m);

for f:=0 to n-1 do
for z:=0 to m-1 do
begin B.X[f,z]:= A.X[f,z] * s end {каждый эл.матр.умножаем на число s}
end;

Procedure veshmatr.Mult(const A,B:veshmatr; var C:veshmatr);
var f,z,k:integer;

begin for f:=0 to n-1 do
for z:=0 to m-1 do
begin
C.X[f,z]:=0;
for k:=0 to n-1 do
C.X[f,z]:=C.X[f,z]+A.X[f,k]*B.X[k,z]; end;
end;

Procedure veshmatr.Transpose (const A:veshmatr; var T:veshmatr);
var f,z:integer;
begin write('vvedite_kol-vo_strok_N >>>_'); readln(n);

write('vvedite_kol-vo_stolbofff_M >>>_'); readln(m);

for f:=0 to n-1 do
for z:=0 to m-1 do
T.X[f,z]:=A.X[z,f];
end;

Function veshmatr.TypematriX:string;
var f,z:integer;flag,flag1:boolean;
begin
write('vvedite_kol-vo_strok_N >>>_'); readln(n);

write('vvedite_kol-vo_stolbofff_M >>>_'); readln(m);
if n=m then writeln('matrica_kvadratnaya');

{_________проверка на диагональность___________}
flag:=true;flag1:=false; {инициализация флагов}
f:=0;
while (f<=n-1) and (flag)do
begin
If X[f,f]=0 then flag :=false;
If X[f,f]<>0 then flag1:=true;
inc(f);
end;
if (not flag) then writeln('ne_diag');
f:=0;
while (f<=n-1) and (flag1) do
begin
z:=0;
while (z<=m-1) do
begin
if (f<>z) and (X[f,z]=0) then flag1:=true;
if (f<>z) and (X[f,z]<>0)then flag1:=false;

inc(z);

end;
inc(f);
end;
if flag1 then writeln('matr_diag');

{__________проверка на нулевую______________}
flag:=true;
f:=0;
while (f<=n-1) and (flag) do
begin
z:=0;
while z<=m-1 do
begin
if X[f,z]<>0 then flag:=false
else flag:=true;
inc(z);
end;
inc(f);
end;

if flag then writeln('nulevaya');

{_______________проверка на единичную___________}
flag:=true;flag1:=false; {инициализация флагов}
f:=0;
while (f<=n-1) and (flag)do
begin
If X[f,f]<>1 then flag :=false;
If X[f,f]=1 then flag1:=true;
inc(f);
end;
if (not flag) then writeln('ne_edinichnaya');
f:=0;
while (f<=n-1) and (flag1) do
begin
z:=0;
while (z<=m-1) do
begin
if (f<>z) and (X[f,z]=0) then flag1:=true;
if (f<>z) and (X[f,z]<>0)then flag1:=false;

inc(z);

end;
inc(f);
end;
if flag1 then writeln('matr_edinichnaya');










end;
{начало программы}
begin





M1:= veshmatr.Create; {создаём первую матрицу}
Writeln;
Writeln(' M1 ');
M1.vvod(M1); {ввод первой матрицы}
M2:= veshmatr.Create; {создаём 2-ую матрицу}
Writeln;
Writeln(' M2 ');
M2.vvod(M2); {ввод 2-ой матрицы}

M3:= veshmatr.Create;
T:= veshmatr.Create;

writeln('Add M1+M2? y/n >>>_');readln(ch);
if ch='y' then begin
M3.Add(M1,M2,M3); {вызов процедуры сложения}
Writeln('__________Add_M1+M2________');
M3.vivod(M3) end;

writeln('Sub M1-M2? y/n >>>_');readln(ch);
if ch='y' then begin
M3.Sub(M1,M2,M3); {вызов процедуры вычитания}
Writeln('__________Sub_M1-M2________');
M3.vivod(M3) end;


writeln('Mult s*M2? y/n >>>_');readln(ch);
if ch='y' then begin
writeln('vvedite_s');
readln(s);
M3.Mult(s,M1,M3);
Writeln('__________Mult_s*M1________');
M3.vivod(M3) end;



writeln('Mult M1*M2? y/n >>>_');readln(ch);
if ch='y' then begin
M3.Mult(M1,M2,M3);
Writeln('__________Mult_M1*M2_______');
M3.vivod(M3) end;



writeln('Traspon M1? y/n >>>_');readln(ch);
if ch='y' then begin
T.Transpose(M1,T);
Writeln('______Transponirovanaya____');
T.vivod(T) end;


writeln('Found type M1? y/n >>>_');readln(ch);
if ch='y' then begin
U:=M1.TypematriX;
Writeln(U) end;

writeln('Found type M2? y/n >>>_');readln(ch);
if ch='y' then begin
U:=M2.TypematriX;
Writeln(U) end;




M1.Free; {удаляем объект и переменная больше не ссылается на к.-л. обл.памяти}
M1:=nil;
M2.Free;
M2:=nil;
M3.Free;
M3:=nil;
T.Free;
T:=nil;
readln
end.





Сообщение отредактировано: Svetlana - 14.10.2009 16:34
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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


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

 



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