Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 26.12.2018, 21:37   #1 (permalink)
Denleonyr
Новичок
 
Регистрация: 26.12.2018
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Проблема с функциями в Паскале

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

Старый 26.12.2018, 21:37
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Могу порекомендовать вам схожие топики

Работа с функциями в паскале
Помогите с процедурами и функциями
Помогите, пожалуйста, с подпрограммами и функциями

Старый 27.12.2018, 18:52   #2 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,304
Сказал(а) спасибо: 287
Поблагодарили 506 раз(а) в 164 сообщениях
Репутация: 91675
По умолчанию

Ну что сказать? Программа нуждается в серьёзной доработке.
1. ГРУБЕЙШАЯ ОШИБКА! Если Вы определяете n и m — параметры размерности массива — как ГЛОБАЛЬНЫЕ переменные (и это правильно!), то повторное их определение в теле функции приведёт к их ОБНУЛЕНИЮ. Потому что для функции это свои переменные, не связанные с глобальными. А потому из списка переменных в функции их надлежит ИСКЛЮЧИТЬ.
2. Ваша функция, если даже не вдаваться в детали, выдаст (если нет ошибок) только ОДНУ седловую точку. Между тем в задании требуется выявить их ВСЕ.
Я бы организовал массив записей с полями координат элемента и его значения. Но, боюсь, тут уместна процедура, а не функция. Сложно, конечно, но что поделаешь.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 28.12.2018, 19:43   #3 (permalink)
Евгений
Member
 
Аватар для Евгений
 
Регистрация: 31.03.2010
Адрес: Тульская область
Сообщений: 1,162
Сказал(а) спасибо: 9
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 9811
По умолчанию

Код:
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.
Евгений вне форума   Ответить с цитированием
Старый 29.12.2018, 14:13   #4 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,304
Сказал(а) спасибо: 287
Поблагодарили 506 раз(а) в 164 сообщениях
Репутация: 91675
По умолчанию

А, кстати, да — как-то я не очень внимательно прочитал задание: решил, что надо вывести на экран все координаты седловых точек и их значения. Но если только количество, тогда, конечно, проще.
Между прочим, я бы сделал ещё одно ветвление: задал бы принудительно небольшую тестовую матрицу (возможно, в файле), заведомо имеющую несколько седловых точек. А то ведь при случайном выборе значений элементов вероятность появления седловых точек исчезающе мала, и потому на выходе будут в основном нули. А так — прямая демонстрация правильности кода.
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Старый 29.12.2018, 18:28   #5 (permalink)
derba
Member
 
Регистрация: 19.07.2017
Адрес: Украина Черкасская обл.
Сообщений: 2,254
Сказал(а) спасибо: 35
Поблагодарили 5 раз(а) в 3 сообщениях
Репутация: 7259
По умолчанию

Не понятно:
Цитата:
for i:=1 to ns do
begin
ns ведь нигде не задается, откуда программа знает, сколько циклов?
__________________
За безопасность необходимо платить, а за ее отсутствие расплачиваться.
Уинстон Черчилль
derba вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 29.12.2018, 18:55   #6 (permalink)
Vladimir_S
Специалист
 
Аватар для Vladimir_S
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 26,304
Сказал(а) спасибо: 287
Поблагодарили 506 раз(а) в 164 сообщениях
Репутация: 91675
По умолчанию

Цитата:
Сообщение от derba Посмотреть сообщение
ns ведь нигде не задается, откуда программа знает, сколько циклов?
Это входной параметр функции (один из аргументов).
__________________
With Mozilla Firefox - straight to communism!
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.