Поиск максимального элемента среди строк упорядоченных по неубыванию - 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 с передачей ей нужных параметров и выводится результат на экран. Если максимум был найден, то выводится сообщение с его значением, иначе выводится сообщение о том, что неубывающие строки отсутствуют.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д