09.01.2011, 13:05 | #1 (permalink) |
Новичок
Регистрация: 09.01.2011
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Паскаль, поиск максимальных и минимальных значений в массиве
В коде содержится процедура которая должна искать максимальные, минимальные значения (попадающие в промежуток А В) элементов и их номера в каждой СТРОЧКЕ матрицы, записывать их в массивы "masnmin, masnmax, masmin, masmax." Процедура "вырвана" из модуля. Все входящие данные проверял, они есть (выполнить до курсора, f7, ctrl+f4). на всякий случай привожу шапку процедуры где описываются переменные если кто поможет от всей души скажу спасибо... Код:
... type t_mt_r_1=array [1..20,1..20] of real; t_ms_r_1=array [1..20] of real; t_ms_i_1=array [1..20] of integer; ... ... {сравнивает значения в массиве,ищет максимальное, минимальное и их номера} procedure srmas(var masnmin,masnmax:t_ms_i_1; var masmin,masmax:t_ms_r_1; var flsrmas:boolean; kolmas,razmmas:integer; mat:t_mt_r_1; a,b:real); ... ... {сравнивает значения в матрице,ищет максимальное, минимальное и их номера} procedure srmas; var i,j:integer; pp:boolean; begin; masnmin[1]:=1; masnmax[1]:=1; for i:= 1 to kolmas do begin; pp:=true; for j:= 1 to razmmas do begin; if pp = true then begin; masmax[i]:=mat[i][j]; masmin[i]:=mat[i][j]; pp:=false; end; if (mat[i][j] <= masmax[j]) and (mat [i][j]>=a) and (mat [i][j]<=b) then begin; masmax[i]:=mat[i][j]; write(masmax[i],i); masnmax[i]:=i; end; { writeln(mat[i][j]:0,'',i,'_',j,''); } if (mat[i][j] >= masmin[j]) and (mat [i][j]>=a) and (mat [i][j]<=b) then begin; masmin[i]:=mat[i][j]; masnmin[i]:=i; end; end; end; flsrmas:=true; end; ... если ктонибудь подскажет чтонибудь стоящее по общему пути решения тоже благодарен буду... |
09.01.2011, 13:05 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Подскажу вам, что просмотр похожих тем является очень эффективным методом решения проблемы Поиск двух MAX в одномерном массиве Разработать функцию для определения количества нулей в одномерном массиве |
09.01.2011, 16:02 | #2 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
1. Я совсем не понял смысла булевых переменных в Вашем коде. У меня они отвечают на вопрос, есть ли в данной строке минимальные и максимальные значения, попадающие в указанный интервал, и, в силу этого, являются также массивами. 2. Мне показалось, что у Вас некая путаница с рядами и колонками. На всякий случай: у меня порядок такой: сначала ряд (строка), потом колонка, т.е. A[3,5] означает элемент ТРЕТЬЕЙ строки и ПЯТОГО столбца, а не наоборот. 3. Процедура включена в тестовую программку. Матрица заполняется случайными числами в диапазоне 0..100, а потом ищутся максимумы и минимумы в каждой строке, попадающие в интервал 70..80 и выводятся их номера и значения. Если таковые в строке отсутствуют, об этом печатается сообщение. Код:
type t_mt_r_1=array [1..20,1..20] of real; t_ms_r_1=array [1..20] of real; t_ms_i_1=array [1..20] of integer; t_ms_b_1=array [1..20] of boolean; {сравнивает значения в массиве,ищет максимальное, минимальное и их номера} procedure srmas(var masnmin,masnmax:t_ms_i_1; var masmin,masmax:t_ms_r_1; var fmasmin,fmasmax:t_ms_b_1; kolmas,razmmas:integer; mat:t_mt_r_1; a,b:real); var i,j:integer; begin; for i:= 1 to razmmas do begin; fmasmax[i]:=false; fmasmin[i]:=false; masmax[i]:=a-1; masmin[i]:=b+1; for j:=1 to kolmas do begin; if (mat[i,j]>masmax[i]) and (mat[i,j]>=a) and (mat [i,j]<=b) then begin; masmax[i]:=mat[i,j]; masnmax[i]:=j; fmasmax[i]:=true; end; if (mat[i,j]<masmin[i]) and (mat[i,j]>=a) and (mat[i,j]<=b) then begin; masmin[i]:=mat[i,j]; masnmin[i]:=j; fmasmin[i]:=true; end; end; end; end; VAR M:t_mt_r_1; Min_V,Max_V:t_ms_r_1; Min_ex,Max_ex:t_ms_b_1; Min_N,Max_N:t_ms_i_1; i,j,Nlin,Ncol:Integer; UL,LL:Real; BEGIN Nlin:=10; Ncol:=10; Ul:=80.0; LL:=70.0; Randomize; for i:=1 to Nlin do begin for j:=1 to Ncol do begin M[i,j]:=Random*100; Write(M[i,j]:7:2); end; WriteLn; end; Writeln; srmas(Min_N,Max_N, Min_V,Max_V, Min_ex,Max_ex, Ncol,Nlin, M, LL,UL); For i:=1 to Nlin do begin Write('Line ',i:2,' Maximum: '); if Max_ex[i] then Write('N= ',Max_N[i],' value=',Max_V[i]:7:2) else Write('does not exist;'); Write(' Minimum: '); if Min_ex[i] then WriteLn('N= ',Min_N[i],' value=',Min_V[i]:7:2) else WriteLn('does not exist;'); end; ReadLn; END. |
|
09.01.2011, 18:24 | #3 (permalink) |
Новичок
Регистрация: 09.01.2011
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Спасибо Владимир, код после минимальной адаптации заработал в модуле.
с вот этим я надо сказать перемудрил... Код:
... pp:=true; for j:= 1 to razmmas do begin; if pp = true ... Наконец то этот модуль заработал и можно будет браться за меню основной программы. p.s. если кому интересно могу выложить еще раз спасибо... p.p.s. я как самоучка многого не знаю, и вот это меня заинтересовало: Код:
Randomize; for i:=1 to Nlin do begin for j:=1 to Ncol do begin M[i,j]:=Random*100; Код:
begin clrscr; kolmas:=4; razmmas:=4; a:=1; b:=4; mat[1,1]:=1; mat[1,2]:=7; mat[1,3]:=7; mat[1,4]:=8; mat[2,1]:=2; mat[2,2]:=5; mat[2,3]:=8; mat[2,4]:=1; Код:
for j:=1 to Ncol do begin M[i,j]:=Random*100; Код:
Randomize; for i:=1 to Nlin do begin Последний раз редактировалось kyop; 09.01.2011 в 18:33 |
09.01.2011, 20:00 | #5 (permalink) |
support
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
|
randomize - инициализация генератора псевдослучайных значений, при использовании этой функции генератор инициализируется и получает стартовое значение в зависимости от текущего значения таймера, это позволяет при каждом запуске программы генерировать неповторяющиеся последовательности чисел.
Так как у вас двумерный массив, то для заполнения его значениями нужны вложенные циклы, внешний - для номера строки, внутренний - для номера столбца, соответственно, элемент массива получает индексы, соответствующие текущим значениям счетчиков циклов. Это позволяет обратиться к каждому элементу массива.
__________________
Убить всех человеков! |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
09.01.2011, 21:00 | #6 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Добавлю, что функция Random бывает с параметром и без. Параметром может быть только целое положительное число. Так, A:=Random(N); сгенерирует случайное целое число в диапазоне 0..(N-1). Если же применяется Random без параметров, то значениями этой функции становятся вещественные (Real) числа в интервале 0..1.
|
09.01.2011, 21:12 | #7 (permalink) |
Новичок
Регистрация: 09.01.2011
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
спасибо, теперь можно будет протестировать все на "больших" матрицах...
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|