Помогите, пожалуйста, доработать код.Думаю ошибок там много(((
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')
Я не вижу у тебя нигде инициализации массива Х в классе... У тебя просто попытка записи в неинициализированную переменную. Напиши свой конструктор, в котором сделай SetLength этому массиву, тогда все будет работать. Только вот M, N надо бы знать ДО инициализации.
Решила написать работающий код(может кому-нибудь пригодится):
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);
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');
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