Проблема с функциями в Паскале
Задание: Создать функцию, определяющую в прямоугольном целочисленном массиве matrixnm количество всех его седловых точек. Седловой точкой матрицы называется ее элемент, одновременно наименьший в своей строке и наибольший в своем столбце.
мой код: type TVect = Array[1..100, 1..100] Of Integer; var n, m, i, j: integer; a: tvect; function sedl(a: TVect): integer; var b: array[1..100, 1..2] of integer; c: array[1..100, 1..2] of integer; d: Array[1..100] Of Integer; i, j, k, min, max, n, m: integer; begin for i := 1 to n do begin b[i, 1] := A[i, 1]; b[i, 2] := 1; for j := 2 to m do if A[i, j] < b[i, 1] then begin b[i, 1] := A[i, j]; b[i, 2] := j; end; end; for j := 1 to m do begin c[j, 1] := a[1, j]; c[j, 2] := 1; for i := 2 to n do begin if a[i, j] > c[j, 1] then begin c[j, 1] := a[i, j]; c[j, 2] := i; end; end; end; for i := 1 to n do begin if (b[i, 1] = c[i, 1]) and (b[i, 2] = c[i, 2]) then begin j := j + 1; d[j] := b[i, 1]; end; end; sedl := d[1]; end; begin randomize; writeln('Введите размерность массива NxM'); readln(n, m); for i := 1 to n do for j := 1 to m do a[i, j] := random(10) + 1; writeln('Ваш массив:'); for i := 1 to n do begin for j := 1 to m do write(A[i, j]: 3); writeln; end; write(sedl(a)); end. Первый вопрос на форме, извините пожалуйста, если нарушил какие-то правила. |
Ну что сказать? Программа нуждается в серьёзной доработке.
1. ГРУБЕЙШАЯ ОШИБКА! Если Вы определяете n и m — параметры размерности массива — как ГЛОБАЛЬНЫЕ переменные (и это правильно!), то повторное их определение в теле функции приведёт к их ОБНУЛЕНИЮ. Потому что для функции это свои переменные, не связанные с глобальными. А потому из списка переменных в функции их надлежит ИСКЛЮЧИТЬ. 2. Ваша функция, если даже не вдаваться в детали, выдаст (если нет ошибок) только ОДНУ седловую точку. Между тем в задании требуется выявить их ВСЕ. Я бы организовал массив записей с полями координат элемента и его значения. Но, боюсь, тут уместна процедура, а не функция. Сложно, конечно, но что поделаешь. |
Код:
type |
А, кстати, да — как-то я не очень внимательно прочитал задание: решил, что надо вывести на экран все координаты седловых точек и их значения. Но если только количество, тогда, конечно, проще.
Между прочим, я бы сделал ещё одно ветвление: задал бы принудительно небольшую тестовую матрицу (возможно, в файле), заведомо имеющую несколько седловых точек. А то ведь при случайном выборе значений элементов вероятность появления седловых точек исчезающе мала, и потому на выходе будут в основном нули. А так — прямая демонстрация правильности кода. |
Не понятно:
Цитата:
|
Цитата:
|
Часовой пояс GMT +4, время: 08:47. |
Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.