Переменная булевского типа, в зависимости от значения которой нужно записывать строку или столбец._d_D_ писал(а):Что за флаг?
Процедуры и функции:Матрицы. PascalABC
Код: Выделить всё
Program NN;
uses crt;
const
Nmax=10;
Mmax=15;
type
Tmatr=array[1..Nmax,1..Mmax] of integer;
Zmatr=array[1..Nmax] of integer;
var
Z:Zmatr;
D,Y:Tmatr;
Nd,Md,Ny,My,iD,jD,iY,jY,Nz,Mz:byte;
Procedure EnterMatr (var Matr:tmatr; var N,M:byte; ch:char);
var i,j:byte;
begin
writeln('Ââåäèòå ðàçìåð ìàòðèöû:',ch);
write('Êîëè÷åñòâî ñòðîê:');
read(N);
write('Êîëè÷åñòâî ñòîëáöîâ');
read(M);
for i:=1 to N do
for j:=1 to M do
begin
write(ch,'[',i,',',j,']=');
readln(matr[i,j]);
end
end;
Procedure Minimum (const Matr:tmatr; N,M:byte;var imax,jmax:byte);
Var
i,j,imin,jmin:byte;
min:integer;
begin
min:=matr[1,1];
imin:=1;
jmin:=1;
for i:=2 to N do
for j:=2 to M do
if matr[i,j]<min then
begin
min:=matr[i,j];
imin:=i;
jmin:=j;
end
end;
Procedure FormZ (const Matr:tmatr;N,M:byte;var iMin,jMin:byte);
Var
i,j:byte;
Begin
begin
for i:=1 to N do
for j:=1 to N do
Z[i]:=Matr[iMin,j];
end;
End;
Procedure FormZ2 (const Matr:tmatr;N,M:byte;var iMin,jMin:byte);
Var
i,j:byte;
begin
begin
for i:=1 to N do
for j:=1 to N do
Z[i]:=Matr[i,jMin];
end;
end;
Procedure PrintMatr (const Matr:tmatr; N:byte);
Var iMin,jMin,i,j:byte;
begin
Writeln ('Matrica Z');
For i:=1 to N do
begin
Write (Matr[i,j]:5);
writeln;
end
end;
BEGIN
EnterMatr (D,Nd,Md,'D');
EnterMatr (Y,Ny,Ny,'Y');
Minimum (D,Nd,Md,iD,jD);
Minimum (Y,Ny,Ny,iY,jY);
FormZ (Z,Nz,Mz,'Z');
FormZ2 (Z,Nz,Mz,'Z');
PrintMatr (Z,Nz,'Z');
END.
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
_d_D_, dr.Jekill, не время сейчас о флагах.
У вас двоих свое собственное видение алгоритма, и вы на разных языках говорите.
Итак, раз Y - квадратный массив, а D прямоугольный, то как ни крути надо использовать динамический массив (чтобы процедура была одна, и подходила для любого случая)
Вот примерно так
Я гляжу вперед, и исхожу из того, что минимумов может быть несколько, и непременно все столбцы и строки необходимо будет собрать.
У вас двоих свое собственное видение алгоритма, и вы на разных языках говорите.
Итак, раз Y - квадратный массив, а D прямоугольный, то как ни крути надо использовать динамический массив (чтобы процедура была одна, и подходила для любого случая)
Вот примерно так
Код: Выделить всё
{Из матриц D(N,M) и Y(N,N) получить одномерный массив Z,
записывая в него сначала строки,затем столбцы,
содержащие минимальные элементы матриц D и Y}
const
n=8;
m=6;
type
TData=integer;
TArray=array [,] of TData;
{Заполнение числами в диапазоне от Min до Max}
procedure RandomFillArray(var Arr:TArray; Min,Max:integer);
var
i,j:integer;
begin
for i:=0 to pred(Length(Arr,0)) do for j:=0 to pred(Length(Arr,1)) do
Arr[i,j]:=random(Max-Min+1)+Min;
end;
{Вывод массива с заголовком}
procedure PrintArray(const Arr:TArray; Header:string);
var
i,j:integer;
begin
writeln(Header);
for i:=0 to pred(Length(Arr,0)) do begin
for j:=0 to pred(Length(Arr,1)) do write(Arr[i,j]:5);
writeln;
end;
end;
{Поиск минимума}
function MinVal(const Arr:TArray):TData;
var
i,j:integer;
begin
result:=Arr[0,0];
for i:=0 to pred(Length(Arr,0)) do for j:=0 to pred(Length(Arr,1)) do
if Arr[i,j]<result then result:=Arr[i,j];
end;
{добавление элемента в массив}
function AppendTo(var Arr:TArray; Val:TData):integer;
begin
result:=succ(Length(Arr,1));
SetLength(Arr,1,result);
Arr[0,pred(result)]:=Val;
end;
var
D,Y,Z:TArray; {Z мы тоже объявили как двумерный, но он будет
содержать только 1 строку. Это позволит нам использовать ту же
процедуру вывода массива}
minD,minY:TData;
begin
SetLength(D,N,M);
SetLength(Y,N,N);
RandomFillArray(D,-1000,1000);
RandomFillArray(Y,-1000,1000);
PrintArray(D,'Массив D');
PrintArray(Y,'Массив Y');
minD:=MinVal(D);
writeln('Минимум D=',minD);
minY:=MinVal(Y);
writeln('Минимум Y=',minY);
{Это демонстрация того,как элементы будут добавляться в
монотонно растущий массив Z}
SetLength(Z,1,0);
AppendTo(Z,123);
AppendTo(Z,321);
AppendTo(Z,333);
PrintArray(Z,'Массив Z');
end.
Я немного в шоке.А где можно почитать теории про динамические массивы,чтобы хотя бы откомпилить что-нибудь?
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Не знаю, я кроме хелпа по PascalABC ничего не видел.
У меня устанолен PascalABC.NET
Но и в хелпе информации более чем достаточно. Все с примерами.
У меня устанолен PascalABC.NET
Но и в хелпе информации более чем достаточно. Все с примерами.
А что конкретно удивило?_d_D_ писал(а):Я немного в шоке.
Да вообще, координально отличается от того что пишу я
Как то всё идеально блин.(Ушёл читать Хэлп)
Вот тут например ругается а я что делать-то не знаю:
TArray=array [,] of TData;

Вот тут например ругается а я что делать-то не знаю:
TArray=array [,] of TData;
Код: Выделить всё
{Это демонстрация того,как элементы будут добавляться в
монотонно растущий массив Z}
SetLength(Z,1,0);
AppendTo(Z,123);
AppendTo(Z,321);
AppendTo(Z,333);
Как сделать чтобы норм значения считало?

Так вместо AppendTo(z,123) что должно быть?
Как заменить демонстрацию реальным массивом Z?
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
У меня PascalABC.NET 1.1 beta, сборка 284 (26.01.2009) (http://pascalabc.net/)_d_D_ писал(а):Вот тут например ругается:
TArray=array [,] of TData;
Все отлично компилируется.
Вместо этого еще одна процедура должна вызываться дважды для каждого массива._d_D_ писал(а):Так вместо AppendTo(z,123) что должно быть?
Она должна сканировать массив, и если найден элемент равный указанному значению (минимуму, найденному ранее), то пробегать текущую строку (столбец) и делать AppendTo(z,элемент).
В результате в Z накопится желаемый результат.
PS
Из условия не понятно, как данные должный лечь в Z?
СтрокиD,СтрокиY,СтолбцыD,СтолбцыY
или
СтрокиD,СтолбцыD,СтрокиY,СтолбцыY
А еще, если минимумов несколько, и они лежат на одной и той же строке (столбце), то эту строку (столбец) надо тоже несколько раз занести в Z, или же исключая повторы? Второе сложнее.
СтрокиD,СтрокиY,СтолбцыD,СтолбцыYPS
Из условия не понятно, как данные должный лечь в Z?
СтрокиD,СтрокиY,СтолбцыD,СтолбцыY
или
СтрокиD,СтолбцыD,СтрокиY,СтолбцыY
Думая и повторов хватит.А еще, если минимумов несколько, и они лежат на одной и той же строке (столбце), то эту строку (столбец) надо тоже несколько раз занести в Z, или же исключая повторы? Второе сложнее.