Матрица 5 на 5. Вывести строку или столбец в зависимости наличия положительных или нулевых элементов - Pascal

Узнай цену своей работы

Формулировка задачи:

Дана квадратная матрица порядка n(n=5). Если все строки упорядочены по возрастанию, то в вектор x записать элементы столбца, содержащего наименьшее количество положительных элементов, а иначе элементы строки, содержащей наибольшее количество нулевых элементов. То, что пытался сам:
program lab_6;
{$R-}
var x:array[1..5,1..5] of integer;
    i,j,k,f,m,n,b:integer;
begin
k:=0;
m:=0;
n:=0;
b:=0;
 for i:=1 to 5 do
  for j:=1 to 5 do begin
   writeln('vvedi x',i,j);
   readln(x[i,j]);
  end;
 for i:=1 to 5 do
  for j:=1 to 5 do begin
   if x[i,j]>x[i+1,j] then begin
    b:=1;
    if x[j,i]>0 then begin
     if i=1 then begin 
     m:=0;
     n:=0;
     end;
     m:=m+1;
     if n>m then begin 
     n:=m;
     k:=j;
     end;
    end;
  end else begin
   if x[i,j]=0 then begin
     if j=1 then m:=0;
     n:=m;
     m:=m+1;
     if n<m then k:=i;
    end;
  end;
  end;
  if b=1 then begin write('[');
  for f:=1 to 5 do writeln(x[f,k]);
  write(']');
  end else   begin write('[');
  for f:=1 to 5 do write(x[k,f]);
  write(']');
end;
 readln;
end.
Суть в том, что выводит, не то, что нужно. В 90% случаев это 4 столбец, хоть и выполнилось условие для вывода строки.

Решение задачи: «Матрица 5 на 5. Вывести строку или столбец в зависимости наличия положительных или нулевых элементов»

textual
Листинг программы
const n=5;
type mas=array[1..n]of integer;
     matr=array[1..n]of mas;
var a:matr;x:mas;
    i,j:integer;
    
{задание и вывод массива}    
procedure vv_matr(var x:matr;s:string;f:boolean);
var i,j:integer;
begin
 randomize;
 writeln(s);
 for i:=1 to n do
  begin
   for j:=1 to n do
    begin
     if f then x[i,j]:=-5+random(11);{j-i-2}
     write(x[i,j]:4)
    end;
   writeln
  end 
end;
 
{возвращает true если строка упорядочена по возрастанию}
function po_vozr_mas(xx:mas):boolean;
    var i:integer;ff:boolean;
     begin
      i:=1;ff:=true;
      while ff and (i<=n-1) do
       begin
        if xx[i]>=xx[i+1]
         then ff:=false;
        inc(i)
       end;
      po_vozr_mas:=ff 
     end;
     
{возвращает true если все строки в матрице упорядочены по возрастанию}     
function po_vozr_matr(x:matr):boolean;
 var i:integer;fl:boolean;   
  begin
   i:=1;fl:=true;
   while fl and (i<=n) do
    begin
     if not po_vozr_mas(x[i])
      then fl:=false;
     inc(i) 
    end;
   po_vozr_matr:=fl
  end;
  
 {количество 0 в строке} 
 function kol_0_mas(xx:mas):integer;
 var i,k:integer;
 begin
  k:=0;
  for i:=1 to n do if xx[i]=0 then inc(k);
  kol_0_mas:=k 
 end;
 
 {возвращает номер строки с наибольшим количеством 0 или -1, если нет строк с нулевыми элементами}
 function kol_0_matr(x:matr):integer;
 var i,k:integer; 
 begin
  k:=-1;
  for i:=1 to n do if (kol_0_mas(x[i])>0)and(kol_0_mas(x[i])>k) then k:=i;
  kol_0_matr:=k
 end;
 
 {количество положительных элементов в столбце}
 function k_pol_st(x:matr;j:integer):integer;
 var i,k:integer;
 begin
  k:=0;
  for i:=1 to n do if a[i,j]>0 then inc(k);
  k_pol_st:=k
 end;
 
 {возвращает номер столбца,содержащего наименьшее количество положительных элементов, или -1, если нет положительных элементов в матрице}
 function min_pol_st_matr(xx:matr):integer;
 var j,k,st,tmp:integer;
 begin
  k:=n+1;st:=-1;
  for j:=1 to n do 
   begin
    tmp:=k_pol_st(xx,j);
    if (tmp>0)and(tmp<k) then begin k:=tmp; st:=j end;
   end;
  min_pol_st_matr:=st
 end;
 
begin
 vv_matr(a,'A:',true);
 if po_vozr_matr(a)
  then
   begin
    writeln('все строки упорядочены по возрастанию');
    if min_pol_st_matr(a)=-1
     then writeln('нет столбцов с положительными элементами')
     else
      begin
       writeln('X:');
       j:=min_pol_st_matr(a);
       for i:=1 to n do begin x[i]:=a[i,j]; write(x[i]:3) end
      end
   end
  else
   begin
    writeln('не все строки упорядочены по возрастанию');
    if kol_0_matr(a)=-1
     then writeln('нет строк с нулевыми элементами')
     else 
      begin
       writeln('X:');
       i:=kol_0_matr(a);
       for j:=1 to n do begin x[j]:=a[i,j]; write(x[j]:3) end
      end
   end;
end.

Объяснение кода листинга программы

  1. Объявляются константа n, тип mas (массив из n элементов типа integer) и matr (массив из n элементов типа mas), а также переменные a (матрица), x (массив), i и j (целочисленные переменные).
  2. Описывается процедура vv_matr для заполнения и вывода матрицы.
  3. Описывается функция po_vozr_mas, которая возвращает true, если массив упорядочен по возрастанию.
  4. Описывается функция po_vozr_matr, которая возвращает true, если все строки в матрице упорядочены по возрастанию.
  5. Описывается функция kol_0_mas, которая возвращает количество нулей в массиве.
  6. Описывается функция kol_0_matr, которая возвращает номер строки с наибольшим количеством нулей или -1, если нет строк с нулевыми элементами.
  7. Описывается функция k_pol_st, которая возвращает количество положительных элементов в столбце.
  8. Описывается функция min_pol_st_matr, которая возвращает номер столбца, содержащего наименьшее количество положительных элементов, или -1, если нет положительных элементов в матрице.
  9. Выполняется заполнение и вывод матрицы a с помощью процедуры vv_matr.
  10. Проверяется, упорядочены ли все строки матрицы по возрастанию. Если да, то выводится сообщение о том, что все строки упорядочены по возрастанию и происходит проверка наличия столбцов с положительными элементами. Если такие столбцы существуют, то выводится массив X.
  11. Если строки матрицы не упорядочены по возрастанию, то проверяется наличие строк с нулевыми элементами. Если такие строки существуют, выводится массив X.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.333 из 5
Похожие ответы