Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Расширенное использование new. Понятие динамических объектов
При работе с динамическими объектами процедуру new (выделения хип-памяти под типизированные указатели) можно использовать с расширенными возможностями: в ней допускается второй параметр, в котором можно указывать обращение к конструктору для инициализации динамического объекта; процедуру new можно вызывать как функцию, возвращающую значение типа указатель, которое указывает на динамически размещаемый объект. Первым параметром функции new (в отличие от процедуры new) должен быть тип размещаемого объекта, а вторым параметром может быть (как и в процедуре new) имя конструктора.
Такие расширенные средства позволяют одновременно, и зарезервировать хип-память для динамического объекта и разместить в ней некоторое (начальное) значение (с помощью конструктора). В такой ситуации (использования нескольких уровней вложенности) проблемой может стать нехватка распределяемой хип-памяти. При нехватке хип-памяти необходимо ликвидировать всю цепочку размещенных объектов. Эту операцию может выполнить стандартная процедура fall, которую можно вызывать только из конструктора и которая освобождает выделенную память, возвращая значение указателя nil. Примеры расширенного использования new:
var pL1:^Line; {динамический объект типа Line}
…
new(pL1,Init); {Init - конструктор для инициализации объекта pL1}
…
pL1:= new(Line, Init); {инициализация pL1 с помощью функции new}
Понятие о динамических объектах.
Объектные переменные совершенно подобны переменным других типов Турбо Паскаля. Для них допустим оператор присваивания и обращение к полям и методам по составным именам (как для записей). Экземпляры объектов, размещаемые в динамической памяти, называются динамическими объектами.
Для создания динамических объектов необходимо создать типизированный указатель на заданный тип объекта:
type pLine = ^Line; {указатель на объект типа Line }
var pL1:pLine; {динамический объект типа pLine}
Динамические объекты чрезвычайно полезны для задач моделирования, управления, проектирования. Библиотеки объектов в большинстве своём содержат динамические объекты, как например Turbo Vision -библиотека объектов интерфейса. Для использования динамических объектов характерными процессами являются создание объекта (с размещением его в хип-памяти) и удаление объекта (освобождение занимаемой им хип-памяти).
Дана квадратная матрица. Если номер столбца с максимальной суммой элементов совпадает с номером строки с максимальной суммой элементов, определить сумму найденных элементов строки и столбца, иначе - распечатать номера найденных строки и столбца с максимальными суммами.
unit Z433_22;
interface
Const n=5;
Type matriza=array[1..n,1..n]of real;
massiv=array[1..n]of real;
procedure colmax(a:matriza;Var ncol:integer;Var sumcol:massiv;Var maxcol:real);
procedure rowmax(a:matriza;Var nrow:integer;Var sumrow:massiv;Var maxrow:real);
procedure summa(a:matriza;ncol:integer;nrow:integer;Var sumelem:real);
implementation
procedure colmax(a:matriza;Var ncol:integer;Var sumcol:massiv;Var maxcol:real);
Var i,j:integer;
Begin
for j:=1 to n do Begin
sumcol[j]:=0;
for i:=1 to n do
sumcol[j]:=sumcol[j]+a[i,j]; end;
maxcol:=sumcol[1];
for j:=2 to n do
if sumcol[j]>maxcol then Begin
maxcol:=sumcol[j];
ncol:=j; end;
end; { procedure colmax }
procedure rowmax(a:matriza;Var nrow:integer;Var sumrow:massiv;Var maxrow:real);
Var i,j:integer;
Begin
for i:=1 to n do Begin
sumrow[i]:=0;
for j:=1 to n do
sumrow[i]:=sumrow[i]+a[i,j]; end;
maxrow:=sumrow[1];
for i:=2 to n do
if sumrow[i]>maxrow then Begin
maxrow:=sumrow[i];
nrow:=i; end;
end;{ procedure rowmax }
procedure summa(a:matriza;ncol:integer;nrow:integer;Var sumelem:real);
Var i,j:integer;
Begin
sumelem:=0;
for i:=1 to n do
for j:=1 to n do
if (i=nrow) or (j=ncol)
then sumelem:=sumelem+a[i,j];
end; { procedure summa }
end.
program Z433_22;
uses Z433_22;
Var a:matriza;
sumcol,sumrow:massiv;
sumelem,maxcol,maxrow:real;
ncol,nrow,i,j:integer;
Begin
for i:=1 to n do
for j:=1 to n do
readln(a[i,j]);
colmax(a,ncol,sumcol,maxcol);
rowmax(a,nrow,sumrow,maxrow);
if ncol=nrow then Begin
summa(a,ncol,nrow,sumelem);
writeln(sumelem); end
else writeln(nrow,ncol);
end.