Страница 3 из 3

Re: Процедуры и функции:Матрицы.

Добавлено: 15 мар 2009, 20:43
dr.Jekill
_d_D_ писал(а):Что за флаг?
Переменная булевского типа, в зависимости от значения которой нужно записывать строку или столбец.

Re: Процедуры и функции:Матрицы.

Добавлено: 15 мар 2009, 20:50
_d_D_

Код: Выделить всё

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.
Чёт я совсем спёкся был бы очень признатлен если бы нашли ошибки.

Re: Процедуры и функции:Матрицы.

Добавлено: 15 мар 2009, 21:21
Naeel Maqsudov
_d_D_, dr.Jekill, не время сейчас о флагах.
У вас двоих свое собственное видение алгоритма, и вы на разных языках говорите.
Итак, раз 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.
Я гляжу вперед, и исхожу из того, что минимумов может быть несколько, и непременно все столбцы и строки необходимо будет собрать.

Re: Процедуры и функции:Матрицы.

Добавлено: 15 мар 2009, 21:37
_d_D_
Я немного в шоке.А где можно почитать теории про динамические массивы,чтобы хотя бы откомпилить что-нибудь?

Re: Процедуры и функции:Матрицы.

Добавлено: 15 мар 2009, 21:55
Naeel Maqsudov
Не знаю, я кроме хелпа по PascalABC ничего не видел.
У меня устанолен PascalABC.NET
Но и в хелпе информации более чем достаточно. Все с примерами.
_d_D_ писал(а):Я немного в шоке.
А что конкретно удивило?

Re: Процедуры и функции:Матрицы. PascalABC

Добавлено: 15 мар 2009, 22:19
_d_D_
Да вообще, координально отличается от того что пишу я :) Как то всё идеально блин.(Ушёл читать Хэлп)
Вот тут например ругается а я что делать-то не знаю:
TArray=array [,] of TData;

Добавлено: 15 мар 2009, 22:34
_d_D_

Код: Выделить всё

{Это демонстрация того,как элементы будут добавляться в 
  монотонно растущий массив Z}
  SetLength(Z,1,0);
  AppendTo(Z,123);
  AppendTo(Z,321);
  AppendTo(Z,333);
хмм...Это действительно нужно просто выдаёт Массив Z 123 321 333
Как сделать чтобы норм значения считало? :confused:
Так вместо AppendTo(z,123) что должно быть?

Как заменить демонстрацию реальным массивом Z?

Re: Процедуры и функции:Матрицы. PascalABC

Добавлено: 16 мар 2009, 00:00
Naeel Maqsudov
_d_D_ писал(а):Вот тут например ругается:
TArray=array [,] of TData;
У меня PascalABC.NET 1.1 beta, сборка 284 (26.01.2009) (http://pascalabc.net/)
Все отлично компилируется.
_d_D_ писал(а):Так вместо AppendTo(z,123) что должно быть?
Вместо этого еще одна процедура должна вызываться дважды для каждого массива.
Она должна сканировать массив, и если найден элемент равный указанному значению (минимуму, найденному ранее), то пробегать текущую строку (столбец) и делать AppendTo(z,элемент).
В результате в Z накопится желаемый результат.

PS
Из условия не понятно, как данные должный лечь в Z?
СтрокиD,СтрокиY,СтолбцыD,СтолбцыY
или
СтрокиD,СтолбцыD,СтрокиY,СтолбцыY

А еще, если минимумов несколько, и они лежат на одной и той же строке (столбце), то эту строку (столбец) надо тоже несколько раз занести в Z, или же исключая повторы? Второе сложнее.

Re: Процедуры и функции:Матрицы. PascalABC

Добавлено: 16 мар 2009, 00:33
_d_D_
PS
Из условия не понятно, как данные должный лечь в Z?
СтрокиD,СтрокиY,СтолбцыD,СтолбцыY
или
СтрокиD,СтолбцыD,СтрокиY,СтолбцыY
СтрокиD,СтрокиY,СтолбцыD,СтолбцыY
А еще, если минимумов несколько, и они лежат на одной и той же строке (столбце), то эту строку (столбец) надо тоже несколько раз занести в Z, или же исключая повторы? Второе сложнее.
Думая и повторов хватит.