Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Проблема с функциями в Паскале (http://www.tehnari.ru/f41/t262287/)

Denleonyr 26.12.2018 21:37

Проблема с функциями в Паскале
 
Задание: Создать функцию, определяющую в прямоугольном целочисленном массиве 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.
Первый вопрос на форме, извините пожалуйста, если нарушил какие-то правила.

Vladimir_S 27.12.2018 18:52

Ну что сказать? Программа нуждается в серьёзной доработке.
1. ГРУБЕЙШАЯ ОШИБКА! Если Вы определяете n и m — параметры размерности массива — как ГЛОБАЛЬНЫЕ переменные (и это правильно!), то повторное их определение в теле функции приведёт к их ОБНУЛЕНИЮ. Потому что для функции это свои переменные, не связанные с глобальными. А потому из списка переменных в функции их надлежит ИСКЛЮЧИТЬ.
2. Ваша функция, если даже не вдаваться в детали, выдаст (если нет ошибок) только ОДНУ седловую точку. Между тем в задании требуется выявить их ВСЕ.
Я бы организовал массив записей с полями координат элемента и его значения. Но, боюсь, тут уместна процедура, а не функция. Сложно, конечно, но что поделаешь.

Евгений 28.12.2018 19:43

Код:

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.


Vladimir_S 29.12.2018 14:13

А, кстати, да — как-то я не очень внимательно прочитал задание: решил, что надо вывести на экран все координаты седловых точек и их значения. Но если только количество, тогда, конечно, проще.
Между прочим, я бы сделал ещё одно ветвление: задал бы принудительно небольшую тестовую матрицу (возможно, в файле), заведомо имеющую несколько седловых точек. А то ведь при случайном выборе значений элементов вероятность появления седловых точек исчезающе мала, и потому на выходе будут в основном нули. А так — прямая демонстрация правильности кода.

derba 29.12.2018 18:28

Не понятно:
Цитата:

for i:=1 to ns do
begin
ns ведь нигде не задается, откуда программа знает, сколько циклов?

Vladimir_S 29.12.2018 18:55

Цитата:

Сообщение от derba (Сообщение 2619417)
ns ведь нигде не задается, откуда программа знает, сколько циклов?

Это входной параметр функции (один из аргументов).


Часовой пояс GMT +4, время: 08:47.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.