Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 09.01.2011, 13:05   #1 (permalink)
kyop
Новичок
 
Регистрация: 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;

...
скорее всего как обычно по собственной невнимательности пропустил, вот и не получается.
если ктонибудь подскажет чтонибудь стоящее по общему пути решения тоже благодарен буду...
kyop вне форума   Ответить с цитированием

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

Подскажу вам, что просмотр похожих тем является очень эффективным методом решения проблемы

Поиск двух MAX в одномерном массиве
Разработать функцию для определения количества нулей в одномерном массиве

Старый 09.01.2011, 16:02   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от kyop Посмотреть сообщение
если ктонибудь подскажет чтонибудь стоящее по общему пути решения тоже благодарен буду...
Всё, чем могу помочь, это предложить некий проверенный и отлаженный вариант процедуры. Несколько предварительных замечаний:
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.
Vladimir_S вне форума   Ответить с цитированием
Старый 09.01.2011, 18:24   #3 (permalink)
kyop
Новичок
 
Регистрация: 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
kyop вне форума   Ответить с цитированием
Старый 09.01.2011, 18:27   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от kyop Посмотреть сообщение
еще раз спасибо...
Да не за что, пожалуйста.
Vladimir_S вне форума   Ответить с цитированием
Старый 09.01.2011, 20:00   #5 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
По умолчанию

Цитата:
Сообщение от kyop Посмотреть сообщение
Код:
Randomize;
for i:=1 to Nlin do
begin
randomize - инициализация генератора псевдослучайных значений, при использовании этой функции генератор инициализируется и получает стартовое значение в зависимости от текущего значения таймера, это позволяет при каждом запуске программы генерировать неповторяющиеся последовательности чисел.

Так как у вас двумерный массив, то для заполнения его значениями нужны вложенные циклы, внешний - для номера строки, внутренний - для номера столбца, соответственно, элемент массива получает индексы, соответствующие текущим значениям счетчиков циклов. Это позволяет обратиться к каждому элементу массива.
__________________
Убить всех человеков!
AlexZir вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 09.01.2011, 21:00   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Добавлю, что функция Random бывает с параметром и без. Параметром может быть только целое положительное число. Так, A:=Random(N); сгенерирует случайное целое число в диапазоне 0..(N-1). Если же применяется Random без параметров, то значениями этой функции становятся вещественные (Real) числа в интервале 0..1.
Vladimir_S вне форума   Ответить с цитированием
Старый 09.01.2011, 21:12   #7 (permalink)
kyop
Новичок
 
Регистрация: 09.01.2011
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

спасибо, теперь можно будет протестировать все на "больших" матрицах...
kyop вне форума   Ответить с цитированием
Ads

Яндекс

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


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

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




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

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