26.12.2018, 21:37 | #1 (permalink) |
Новичок
Регистрация: 26.12.2018
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Проблема с функциями в Паскале
мой код: 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. Первый вопрос на форме, извините пожалуйста, если нарушил какие-то правила. |
26.12.2018, 21:37 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Могу порекомендовать вам схожие топики Работа с функциями в паскале Помогите с процедурами и функциями Помогите, пожалуйста, с подпрограммами и функциями |
27.12.2018, 18:52 | #2 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Ну что сказать? Программа нуждается в серьёзной доработке.
1. ГРУБЕЙШАЯ ОШИБКА! Если Вы определяете n и m — параметры размерности массива — как ГЛОБАЛЬНЫЕ переменные (и это правильно!), то повторное их определение в теле функции приведёт к их ОБНУЛЕНИЮ. Потому что для функции это свои переменные, не связанные с глобальными. А потому из списка переменных в функции их надлежит ИСКЛЮЧИТЬ. 2. Ваша функция, если даже не вдаваться в детали, выдаст (если нет ошибок) только ОДНУ седловую точку. Между тем в задании требуется выявить их ВСЕ. Я бы организовал массив записей с полями координат элемента и его значения. Но, боюсь, тут уместна процедура, а не функция. Сложно, конечно, но что поделаешь. |
28.12.2018, 19:43 | #3 (permalink) |
Member
Регистрация: 31.03.2010
Адрес: Тульская область
Сообщений: 1,309
Сказал(а) спасибо: 11
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 13090
|
Код:
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) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
А, кстати, да — как-то я не очень внимательно прочитал задание: решил, что надо вывести на экран все координаты седловых точек и их значения. Но если только количество, тогда, конечно, проще.
Между прочим, я бы сделал ещё одно ветвление: задал бы принудительно небольшую тестовую матрицу (возможно, в файле), заведомо имеющую несколько седловых точек. А то ведь при случайном выборе значений элементов вероятность появления седловых точек исчезающе мала, и потому на выходе будут в основном нули. А так — прямая демонстрация правильности кода. |
29.12.2018, 18:28 | #5 (permalink) | |
Member
Регистрация: 19.07.2017
Адрес: Украииа
Сообщений: 3,599
Сказал(а) спасибо: 50
Поблагодарили 5 раз(а) в 3 сообщениях
Репутация: 23905
|
Не понятно:
Цитата:
|
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
29.12.2018, 18:55 | #6 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|