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

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

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

Процедура не всегда работает корректно, вернее, почти всегда некорректно Не могу понять в чём я накосячила, подскажите, пожалуйста!
Листинг программы
  1. {$I-}
  2. program IND2_9;
  3. uses crt;
  4. const n_max=20; m_max=20;
  5. type TElem=single;
  6. PHas=array[1..m_max, 1..n_max] of TElem;
  7. procedure Maximum(n,m:integer; var ABC:Phas; var mx:TElem; var r:boolean);
  8. {Процедура находит максимальный среди элементов тех строк, которые упорядочены по неубыванию.
  9. Входные параметры:n,m - кол-во строк и столбцов в одномерном массиве; ABC - статический массив.
  10. Выходные параметры: mx - значение искомого числа}
  11.  
  12. var i,j:integer;
  13.  
  14. begin
  15. mx:=1.5e-45;
  16. for i:=1 to n do
  17. for j:=1 to m-1 do begin
  18. r:=false;
  19. if ABC[i,j]<=ABC[i,j+1] then
  20. r:=true;
  21.  
  22. if (ABC[i,m]>mx) and r then mx:=ABC[i,m];
  23. end;
  24. end;
  25. var r:boolean;
  26. n,m,i,j,p:byte;
  27. mx:TElem;
  28. a:Phas;
  29. begin
  30. {$I-}
  31. randomize;
  32. repeat
  33. clrscr;
  34. readkey;
  35. writeln(' 1.Задать размер таблицы');
  36. writeln(' 2.Заполнить случайным образом');
  37. writeln(' 3.Заполнить вручную');
  38. writeln(' 4.Вывести на экран*');
  39. writeln(' 5.Вызвать подпрограмму');
  40. writeln(' 6.Выйти');
  41. readln(p);
  42. case p of
  43. 1:
  44. begin
  45. clrscr;
  46. writeln('1. Задание размера таблицы');
  47. repeat
  48. write ('Количество строчек');
  49. {$I-} readln (n); {$I+}
  50. until (IORESULT=0);
  51. repeat
  52. write ('Количество столбцов');
  53. {$I-} readln (m); {$I+}
  54. until (IORESULT=0);
  55. writeln('Для возврата в главное меню нажмите ENTER');
  56. readln;
  57. end;
  58. 2:
  59. begin
  60. clrscr;
  61. randomize;
  62. writeln('2.Заполнение таблицы случайными числами');
  63. begin
  64. for i:=1 to n do begin
  65. for j:=1 to m do
  66. a[i,j]:=random(300);
  67. end;
  68. end;
  69. writeln;
  70. writeln('Для возврата в главное меню нажмите ENTER');
  71. readln;
  72. end;
  73. 3:
  74. begin
  75. clrscr;
  76. writeln('3.Заполнение таблицы с клавиатуры');
  77. begin
  78. for i:=1 to n do begin
  79. for j:=1 to m do
  80. repeat
  81. write('*[', i, ', ', j, '] = ');
  82. {$I-}read(a[i,j]);{$I+}
  83. until (IORESULT=0);
  84. end;
  85. end;
  86. writeln;
  87. writeln('Для возврата в главное меню нажмите ENTER');
  88. readln;
  89. end;
  90. 4:
  91. begin
  92. clrscr;
  93. writeln('4.Просмотр таблицы');
  94. begin
  95. for i:=1 to n do begin
  96. for j:=1 to m do
  97. write(a[i,j]:8:2);
  98. writeln;
  99. end; end;
  100. writeln;
  101. writeln('Для возврата в главное меню нажмите ENTER');
  102. readln;
  103. end;
  104. 5:begin
  105.  
  106. Maximum(i,j,a,mx,r);
  107.  
  108. if r then writeln(mx:6:2)
  109. else writeln('Операция невозможна');
  110. readln;
  111. end;
  112. end;
  113. until p=6;
  114. end.

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

textual
Листинг программы
  1. function Maximum(const a: PHas; n, m: Integer; var mx: TElem): Boolean;
  2. var i, j: Integer;
  3. begin
  4.   Maximum:=False; mx:=-3.4e38;
  5.   for i:=1 to n do begin
  6.     j:=1; while (a[i,j]<=a[i,j+1]) and (j<m) do Inc(j);
  7.     if (j=m) and (a[i,m]>mx) then begin
  8.       Maximum:=True; mx:=a[i,m];
  9.     end;
  10.   end;
  11. end;
  12.  
  13. ...
  14.  
  15. 5:
  16.   if Maximum(a,n,m,mx) then
  17.     WriteLn('Максимум среди неубывающих строк: ',mx:6:2)
  18.   else
  19.     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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы