• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Паскаль, поиск максимальных и минимальных значений в массиве

  • Автор темы Автор темы kyop
  • Дата начала Дата начала

kyop

Ученик
Регистрация
9 Янв 2011
Сообщения
3
Реакции
0
Баллы
0
Паскаль, поиск максимальных и минимальных значений в массиве

если ктонибудь сможет помочь, то помогите...
В коде содержится процедура которая должна искать максимальные, минимальные значения (попадающие в промежуток А В) элементов и их номера в каждой СТРОЧКЕ матрицы, записывать их в массивы "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;

...
скорее всего как обычно по собственной невнимательности пропустил, вот и не получается.
если ктонибудь подскажет чтонибудь стоящее по общему пути решения тоже благодарен буду...
 
если ктонибудь подскажет чтонибудь стоящее по общему пути решения тоже благодарен буду...
Всё, чем могу помочь, это предложить некий проверенный и отлаженный вариант процедуры. Несколько предварительных замечаний:
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.
 
Спасибо Владимир, код после минимальной адаптации заработал в модуле.
с вот этим я надо сказать перемудрил...
Код:
...
     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]:=[B]Random[/B]*100;
я понял а вот зачем там
Код:
 Ra[B]ndomize;[/B]
 for i:=1 to Nlin do
  begin
?
 
Последнее редактирование:
Код:
Randomize;
for i:=1 to Nlin do
begin
randomize - инициализация генератора псевдослучайных значений, при использовании этой функции генератор инициализируется и получает стартовое значение в зависимости от текущего значения таймера, это позволяет при каждом запуске программы генерировать неповторяющиеся последовательности чисел.

Так как у вас двумерный массив, то для заполнения его значениями нужны вложенные циклы, внешний - для номера строки, внутренний - для номера столбца, соответственно, элемент массива получает индексы, соответствующие текущим значениям счетчиков циклов. Это позволяет обратиться к каждому элементу массива.
 
Добавлю, что функция Random бывает с параметром и без. Параметром может быть только целое положительное число. Так, A:=Random(N); сгенерирует случайное целое число в диапазоне 0..(N-1). Если же применяется Random без параметров, то значениями этой функции становятся вещественные (Real) числа в интервале 0..1.
 
спасибо, теперь можно будет протестировать все на "больших" матрицах...
 
Назад
Сверху