Поиск максимального элемента среди строк упорядоченных по неубыванию - Free Pascal

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

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

Процедура не всегда работает корректно, вернее, почти всегда некорректно Не могу понять в чём я накосячила, подскажите, пожалуйста!
{$I-}
program IND2_9;
uses crt;
const n_max=20; m_max=20;
type TElem=single;
     PHas=array[1..m_max, 1..n_max] of TElem;
procedure Maximum(n,m:integer; var ABC:Phas; var mx:TElem; var r:boolean);
{Процедура находит максимальный среди элементов тех строк, которые упорядочены по неубыванию. 
Входные параметры:n,m - кол-во строк и столбцов в одномерном массиве; ABC - статический массив. 
Выходные параметры: mx - значение искомого числа}

var i,j:integer;

begin
mx:=1.5e-45;
for i:=1 to n do
for j:=1 to m-1 do begin
r:=false;
    if ABC[i,j]<=ABC[i,j+1] then
    r:=true;

if (ABC[i,m]>mx) and r then mx:=ABC[i,m];
end;
end;
var r:boolean;
    n,m,i,j,p:byte;
    mx:TElem;
    a:Phas;
begin
{$I-}
randomize;
repeat
clrscr;
readkey;
 writeln(' 1.Задать размер таблицы');
 writeln(' 2.Заполнить случайным образом');
 writeln(' 3.Заполнить вручную');
 writeln(' 4.Вывести на экран*');
 writeln(' 5.Вызвать подпрограмму');
 writeln(' 6.Выйти');
readln(p);
case p of
1:
begin
clrscr;
writeln('1. Задание размера таблицы');
repeat
write ('Количество строчек');
{$I-} readln (n); {$I+}
until (IORESULT=0);
repeat
write ('Количество столбцов');
{$I-} readln (m); {$I+}
until (IORESULT=0);
writeln('Для возврата в главное меню нажмите ENTER');
readln;
end;
 
2:
begin
clrscr;
randomize;
writeln('2.Заполнение таблицы случайными числами');
begin
for i:=1 to n do begin
for j:=1 to m do
a[i,j]:=random(300);
end;
end;
writeln;
writeln('Для возврата в главное меню нажмите ENTER');
readln;
end;
 
3:
begin
clrscr;
writeln('3.Заполнение таблицы с клавиатуры');
begin
for i:=1 to n do begin
for j:=1 to m do
repeat
write('*[', i, ', ', j, '] = ');
{$I-}read(a[i,j]);{$I+}
until (IORESULT=0);
end;
end;
writeln;
writeln('Для возврата в главное меню нажмите ENTER');
readln;
end;
4:
begin
clrscr;
writeln('4.Просмотр таблицы');
begin
for i:=1 to n do begin
for j:=1 to m do
write(a[i,j]:8:2);
writeln;
end; end;
writeln;
writeln('Для возврата в главное меню нажмите ENTER');
readln;
end;
5:begin

 Maximum(i,j,a,mx,r);

if r then writeln(mx:6:2)
else writeln('Операция невозможна');
 
 readln;
  end;
  end;
until p=6;
end.

Решение задачи: «Поиск максимального элемента среди строк упорядоченных по неубыванию»

textual
Листинг программы
function Maximum(const a: PHas; n, m: Integer; var mx: TElem): Boolean;
var i, j: Integer;
begin
  Maximum:=False; mx:=-3.4e38;
  for i:=1 to n do begin
    j:=1; while (a[i,j]<=a[i,j+1]) and (j<m) do Inc(j);
    if (j=m) and (a[i,m]>mx) then begin
      Maximum:=True; mx:=a[i,m];
    end;
  end;
end;
 
...
 
5:
  if Maximum(a,n,m,mx) then
    WriteLn('Максимум среди неубывающих строк: ',mx:6:2)
  else
    WriteLn('Неубывающие строки отсутствуют.');

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

В данном коде реализована функция поиска максимального элемента среди строк, которые упорядочены по неубыванию.

  1. Передаются следующие параметры: — a: указатель на массив строк, для которых нужно найти максимум; — n: количество строк в массиве; — m: номер последней строки в массиве, для которой нужно выполнить поиск (используется в циклах, чтобы не перебирать все строки массива, если их больше, чем нужно); — mx: переменная, в которую будет записан найденный максимум.
  2. В первой строке инициализируются начальные значения: — Maximum: булево значение, которое будет изменяться в процессе выполнения функции и примет значение True, если максимум будет найден; — mx: начальное значение -3.4e38, которое является очень маленьким числом и будет перезаписываться на большее, если оно будет найдено.
  3. В цикле перебираются все строки массива: — j: переменная, которая инициализируется значением 1 и увеличивается на 1 с каждой итерацией цикла; — внутри цикла выполняется еще один цикл, который будет выполняться до тех пор, пока текущий элемент строки не станет больше следующего и не будет превышать значение m. Это условие нужно для того, чтобы пропустить уже отсортированные строки; — если внутренний цикл выполнится для всех строк без пропусков, то это означает, что все строки уже отсортированы по возрастанию, и максимум не будет найден. В этом случае из функции возвращается False и выполнение кода продолжается дальше; — если внутренний цикл прекратится и текущий элемент строки будет больше значения mx, то это означает, что текущий элемент является максимумом. В этом случае значение mx заменяется на текущий элемент, значение Maximum меняется на True и выполнение функции прекращается.
  4. В основной части программы вызывается функция Maximum с передачей ей нужных параметров и выводится результат на экран. Если максимум был найден, то выводится сообщение с его значением, иначе выводится сообщение о том, что неубывающие строки отсутствуют.

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


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

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

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