• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Проблема с функциями в Паскале

Denleonyr

Ученик
Регистрация
26 Дек 2018
Сообщения
1
Реакции
0
Баллы
0
Проблема с функциями в Паскале

Задание: Создать функцию, определяющую в прямоугольном целочисленном массиве 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
    Tmatr=array[1..100,1..100] of integer;
function Search(As:Tmatr;ns,ms:integer):integer;
var
    i,j,t,d,nmin,mmax:integer;
begin
    Search:=0;
     for i:=1 to ns do
       begin
         nmin:=100;
         for j:=1 to ms do
           if As[i,j]<nmin then
             begin
               nmin:=As[i,j]; d:=j;
             end;
         mmax:=0;
         for j:=1 to ns do
           if As[j,d]>=mmax then
             begin
               mmax:=As[j,d]; t:=j;
             end;
         if t=i then
           begin
             Inc(Search);
             Writeln('[',t,',',d,']');
           end;
       end;
end;
var
    A:Tmatr;
    x,y,n,m,w:integer;
begin
    Writeln('Razmer [N,M]'); Readln(n,m);
     Randomize;
      for x:=1 to n do
        begin
          for y:=1 to m do
            begin
              A[x,y]:=Random(9)+1;
              Write(A[x,y]:4);
            end;
          Writeln;
        end;
      Writeln;
     w:=Search(A,n,m);
    Writeln('Naydeno: ',w);      
   Readln;
end.
 
А, кстати, да — как-то я не очень внимательно прочитал задание: решил, что надо вывести на экран все координаты седловых точек и их значения. Но если только количество, тогда, конечно, проще.
Между прочим, я бы сделал ещё одно ветвление: задал бы принудительно небольшую тестовую матрицу (возможно, в файле), заведомо имеющую несколько седловых точек. А то ведь при случайном выборе значений элементов вероятность появления седловых точек исчезающе мала, и потому на выходе будут в основном нули. А так — прямая демонстрация правильности кода.
 
Назад
Сверху