• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Монотонная последовательность в квадратной матрице

  • Автор темы Автор темы Gasphord
  • Дата начала Дата начала

Gasphord

Ученик
Регистрация
15 Окт 2019
Сообщения
9
Реакции
0
Баллы
0
Монотонная последовательность в квадратной матрице

Необходимо подсчитать количество строк и столбцов матрицы A(n*n),элементы которых образуют монотонную последовательность (по возростанию или убыванию).Можно использовать только процедуры и функции.Я совершенно запутался в ходе решения и не могу разобраться,помогите.

Код:
Const n=3;
 
Type
  St=array [1..n]of integer;
 Ta=array[1..n] of st;
  Var i,j,Z,X:integer;
  a,b:Ta;
 
function Getmat():ta;
 var i, j:integer; a:ta;
 begin
 for i:=1 to n do
 for j:=1 to n do
   Read(a[i,j]);
 RESULT:=A;
 end;
 
 procedure Vivod(a:Ta);
  Var i,j:integer;
 begin
 for i:=1 to n do
 begin
 for j:= 1 to n do
 Write(a[i,j],' ');
 writeln;
 end;
 end;
 function MontonST(S:St):boolean;
 var i:integer;
 begin
 i:=2;
  result:=true;
  if S[1]<S[2]then
    begin
      while (i<=n-1) and result do
      if S[i]<S[i-1] then
      result:=false;
    end
  else
    begin
      while(i>n-1) and result do Z:=Z+1;
      if S[I]>S[i-1] then
      result:=false;
    end;
 end;
 function MontonSB(a:Ta;j:integer):boolean;
  Var i:integer;
    Begin
    i:=2;
    result:=true;
      begin
        while (j<=n-1) and result do X:=x+1;
        if a[i,j]<a[i,j-1] then
      result:=false
      else a[i,j]>=a[i,j-1]
      End;
     end;
 begin
 Z:=0;
 X:=0;
 B:=Getmat();
 for i := 1 to n do
 if MontonST(a[i]) then writeln(z);
 for j:=1 to n do
 if MontonSB(a,j) then writeln(x);
Vivod(b);
 read(i);
end.
 
Я совершенно запутался в ходе решения и не могу разобраться,помогите.
Попробую.
Только я, знаете ли, пользую классический допотопный Паскаль, безо всяких Result'ов. Так что уж не взыщите.
Я бы решал задачку так:
Код:
Const n=3;

Type
 Matr=array[1..n,1..n] of integer;
 Vect=array[1..n] of integer;

Var
 i,j,N_of_lns,N_of_col:integer;
 a:Matr;
 V:Vect;

procedure Getmat;
var i,j:integer;
begin
 for i:=1 to n do
  for j:=1 to n do
   begin
    write('a[',i:2,',',j:2,'] = ');
    readLn(a[i,j]);
   end;
  writeln;
  writeln;
end;

procedure Vivod;
var i,j:integer;
 begin
  for i:=1 to n do
   begin
    for j:= 1 to n do
     write(a[i,j]:4);
    writeln;
   end;
  writeln;
 end;

function Sign(s1,s2:integer):integer;
begin
 if s1>s2 then Sign:=1 else
 if s1<s2 then Sign:=-1 else
 Sign:=0;
end;

function Monton(S:Vect):boolean;
var
 i:integer;
 flag:boolean;
 begin
  flag:=true;
  i:=1;
  repeat
   Inc(i);
   if Sign(S[i],S[i+1])<>Sign(S[1],S[2]) then flag:=false;
  until (flag=false) or (i=n-1);
  Monton:=flag;
 end;

Begin
 GetMat;
 Vivod;
 N_of_lns:=0;
 for i:=1 to n do
  begin
   for j:=1 to n do V[j]:=a[i,j];
   if Monton(V) then Inc(N_of_lns);
  end;
 N_of_col:=0;
 for j:=1 to n do
  begin
   for i:=1 to n do V[i]:=a[i,j];
   if Monton(V) then Inc(N_of_col);
  end;
 Writeln('Number of lines   = ',N_of_lns);
 Writeln('Number of columns = ',N_of_col);
 Readln
End.
Ввод матрицы лучше сделать как у меня, с подсказками, а не "слепым", как у Вас. Вывод матрицы на экран желательно форматный, тогда столбцы не будут "разъезжаться" при разном количестве знаков в элементах матрицы. Но это так, к слову.
 

Вложения

  • AA01.webp
    AA01.webp
    8.2 KB · Просмотры: 150
Код:
uses Crt;
const n=4;
type matr=array[1..n,1..n] of integer;
function Mon1(aA:matr; ai:integer):boolean;
var j:integer;
begin
     Mon1:=true;
      j:=2;
      While j<=n do
       if aA[ai,j]>aA[ai,j-1]
        then Inc(j)
        else
         begin
           Mon1:=false; Break;
         end;
     if Mon1=false
      then
       begin
         Mon1:=true;
         j:=n-1;
         While j>=1 do
          if aA[ai,j]>aA[ai,j+1]
           then Dec(j)
           else
            begin
              Mon1:=false; Break;
            end;
       end;
end;
function Mon2(aA:matr; aj:integer):boolean;
var i:integer;
begin
     Mon2:=true;
      i:=2;
      While i<=n do
       if aA[i,aj]>aA[i-1,aj]
        then Inc(i)
        else
         begin
           Mon2:=false; Break;
         end;
     if Mon2=false
      then
       begin
         Mon2:=true;
         i:=n-1;
         While i>=1 do
          if aA[i,aj]>aA[i+1,aj]
           then Dec(i)
           else
            begin
              Mon2:=false; Break;
            end;
       end;
end;
var A:matr;
    x,y,S,L:integer;
begin
  ClrScr;
   Randomize;
    for x:=1 to n do
      begin
        for y:=1 to n do
          begin
            A[x,y]:=Random(51);
            Write(A[x,y]:4);
            end;
          Writeln;
      end;
    Writeln;
   L:=0;
    for x:=1 to n do
     if Mon1(A,x) then Inc(L);
   S:=0;
    for y:=1 to n do
     if Mon2(A,y) then Inc(S);
   Writeln('Stolbcov =',S);
    Writeln('Liniy    =',L);
  Readkey;
end.
 
Спасибо большое

**********************
Попробую.
Только я, знаете ли, пользую классический допотопный Паскаль, безо всяких Result'ов. Так что уж не взыщите.
Я бы решал задачку так:
Код:
Const n=3;

Type
 Matr=array[1..n,1..n] of integer;
 Vect=array[1..n] of integer;

Var
 i,j,N_of_lns,N_of_col:integer;
 a:Matr;
 V:Vect;

procedure Getmat;
var i,j:integer;
begin
 for i:=1 to n do
  for j:=1 to n do
   begin
    write('a[',i:2,',',j:2,'] = ');
    readLn(a[i,j]);
   end;
  writeln;
  writeln;
end;

procedure Vivod;
var i,j:integer;
 begin
  for i:=1 to n do
   begin
    for j:= 1 to n do
     write(a[i,j]:4);
    writeln;
   end;
  writeln;
 end;

function Sign(s1,s2:integer):integer;
begin
 if s1>s2 then Sign:=1 else
 if s1<s2 then Sign:=-1 else
 Sign:=0;
end;

function Monton(S:Vect):boolean;
var
 i:integer;
 flag:boolean;
 begin
  flag:=true;
  i:=1;
  repeat
   Inc(i);
   if Sign(S[i],S[i+1])<>Sign(S[1],S[2]) then flag:=false;
  until (flag=false) or (i=n-1);
  Monton:=flag;
 end;

Begin
 GetMat;
 Vivod;
 N_of_lns:=0;
 for i:=1 to n do
  begin
   for j:=1 to n do V[j]:=a[i,j];
   if Monton(V) then Inc(N_of_lns);
  end;
 N_of_col:=0;
 for j:=1 to n do
  begin
   for i:=1 to n do V[i]:=a[i,j];
   if Monton(V) then Inc(N_of_col);
  end;
 Writeln('Number of lines   = ',N_of_lns);
 Writeln('Number of columns = ',N_of_col);
 Readln
End.
Ввод матрицы лучше сделать как у меня, с подсказками, а не "слепым", как у Вас. Вывод матрицы на экран желательно форматный, тогда столбцы не будут "разъезжаться" при разном количестве знаков в элементах матрицы. Но это так, к слову.
 
Назад
Сверху