Поиск максимального элемента среди строк упорядоченных по неубыванию - 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('Неубывающие строки отсутствуют.');
Объяснение кода листинга программы
В данном коде реализована функция поиска максимального элемента среди строк, которые упорядочены по неубыванию.
- Передаются следующие параметры: — a: указатель на массив строк, для которых нужно найти максимум; — n: количество строк в массиве; — m: номер последней строки в массиве, для которой нужно выполнить поиск (используется в циклах, чтобы не перебирать все строки массива, если их больше, чем нужно); — mx: переменная, в которую будет записан найденный максимум.
- В первой строке инициализируются начальные значения: — Maximum: булево значение, которое будет изменяться в процессе выполнения функции и примет значение True, если максимум будет найден; — mx: начальное значение -3.4e38, которое является очень маленьким числом и будет перезаписываться на большее, если оно будет найдено.
- В цикле перебираются все строки массива: — j: переменная, которая инициализируется значением 1 и увеличивается на 1 с каждой итерацией цикла; — внутри цикла выполняется еще один цикл, который будет выполняться до тех пор, пока текущий элемент строки не станет больше следующего и не будет превышать значение m. Это условие нужно для того, чтобы пропустить уже отсортированные строки; — если внутренний цикл выполнится для всех строк без пропусков, то это означает, что все строки уже отсортированы по возрастанию, и максимум не будет найден. В этом случае из функции возвращается False и выполнение кода продолжается дальше; — если внутренний цикл прекратится и текущий элемент строки будет больше значения mx, то это означает, что текущий элемент является максимумом. В этом случае значение mx заменяется на текущий элемент, значение Maximum меняется на True и выполнение функции прекращается.
- В основной части программы вызывается функция Maximum с передачей ей нужных параметров и выводится результат на экран. Если максимум был найден, то выводится сообщение с его значением, иначе выводится сообщение о том, что неубывающие строки отсутствуют.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д