Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2010, 13:38   #1
Delphin-666
Новичок
Джуниор
 
Регистрация: 14.06.2010
Сообщений: 7
По умолчанию минимумы и максимумы

Здравствуйте. необходимо найти минимальные значения в каждой строке матрицы и максимальные в каждом столбце. Проблема в том, что мой код работает исключительно для квадратных матриц... При прямоугольных выдает неверные значения (и неверное количесвто значений, т.е. не совпадает кол-во например строк и выданных значений)
Вот мой код.
Код:
procedure TForm1.Naiti1Click(Sender: TObject);
var
Str: array[1..100,1..100] of integer;
mn_s,mx_s: Longint;
InB: Longint;
InA: Longint;
MxB: Longint;
MxA: Longint;
MnMxA:Array[1..100] of integer;
MxMnB:Array[1..100] of integer;
begin

MxB:=Matrica.ColCount-1; {число столбцов}
MxA:=Matrica.RowCount-1; {число строк}

{запись из таблицы в числовой массив}
For InA:=1 to MxA do
For InB:=1 to MxB do
Str[InA, InB]:=StrToInt(Matrica.Cells[InA, InB]);
Listbox1.Clear;
Listbox3.Clear;
//минимальное в строках
for InB:=1 to MxB
do begin
mn_s:=Str[1,InB];
for InA:=1 to MxA
do if Str[InA,InB] < mn_s
then begin
mn_s:=Str[InA,InB];
MxMnB[InB]:=mn_s;
end;
ListBox1.Items.Add(inttostr(mn_s));
end;
//максимальное в столбцах
for InA:=1 to MxA
do begin
mx_s:=Str[InA,1];
for InB:=1 to MxB
do if Str[InA,InB] > mx_s
then begin
mx_s:=Str[InA,InB];
MnMxA[InA]:=mx_s;
end;
ListBox3.Items.Add(inttostr(mx_s));
end;
end;

Последний раз редактировалось Stilet; 14.06.2010 в 14:59.
Delphin-666 вне форума Ответить с цитированием
Старый 14.06.2010, 13:39   #2
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

А эти функциями не пользовался low high?
VintProg вне форума Ответить с цитированием
Старый 14.06.2010, 13:43   #3
Delphin-666
Новичок
Джуниор
 
Регистрация: 14.06.2010
Сообщений: 7
По умолчанию

то есть создать например несколько массивов (число которых равно числу строк), запхать туда значения и искать с помощью функции минимум в них? я так пробовал. результат аналогичный. для квадратных матриц всё чудесно, но стоит сделать так чтобы число строк или столбцов разнилось, то уже ппц...

Последний раз редактировалось Delphin-666; 14.06.2010 в 14:02.
Delphin-666 вне форума Ответить с цитированием
Старый 14.06.2010, 13:45   #4
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

Цитата:
но стоит сделать так чтобы число строк или столбцов разнилось, то уже ппц...
Сделай так чтобы не разносилися.
VintProg вне форума Ответить с цитированием
Старый 14.06.2010, 13:47   #5
Delphin-666
Новичок
Джуниор
 
Регистрация: 14.06.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от VintProg Посмотреть сообщение
Сделай так чтобы не разносилися.
да, сделать так чтобы матрица была исключительно квадратной - это самый легкий путь, но мне необходимо рассмотреть для всех матриц.
Delphin-666 вне форума Ответить с цитированием
Старый 14.06.2010, 14:48   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Код:
{запись из таблицы в числовой массив}
  for InA := 1 to MxA do
    for InB := 1 to MxB do
      Str[InA, InB] := StrToInt(Matrica.Cells[InB, InA]);
в этом "странном" стрингриде сначала идут столбцы, потом строки..

p.s. и не забывайте оформлять код тегом [СODE]..[/СODE] (кнопка с "решёточкой" - #)


_________________
Добавлено
о... А дальше всё тоже перепутано...
вот рабочий код:

Код:
procedure TForm1.Naiti1Click(Sender: TObject);
var
  Str: array[1..100, 1..100] of integer;
  mn_s, mx_s, rr: Longint;
  InB: Longint;
  InA: Longint;
  MxB: Longint;
  MxA: Longint;
  MnMxA: array[1..100] of integer;
  MxMnB: array[1..100] of integer;
begin

  MxB := Matrica.ColCount - 1; {число столбцов}
  MxA := Matrica.RowCount - 1; {число строк}

  {запись из таблицы в числовой массив}
  for InA := 1 to MxA do
    for InB := 1 to MxB do
      Str[InA, InB] := StrToInt(Matrica.Cells[InB, InA]);
  Listbox1.Clear;
  Listbox3.Clear;

//минимальное в строках
  for InA := 1 to MxA
    do begin
    mn_s := Str[InA, 1];
    for InB := 1 to MxB
      do if Str[InA, InB] < mn_s
      then begin
        mn_s := Str[InA, InB];
        MxMnB[InA] := mn_s;
      end;
    ListBox1.Items.Add(inttostr(mn_s));
  end;

//максимальное в столбцах
  for InB := 1 to MxB
    do begin
    mx_s := Str[1, inB];
    for InA := 1 to MxA
      do if Str[InA, InB] > mx_s
      then begin
        mx_s := Str[InA, InB];
        MnMxA[InB] := mx_s;
      end;
    ListBox3.Items.Add(inttostr(mx_s));
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i, j: integer;
begin
  for i := 0 to Matrica.RowCount - 1 do
    for j := 0 to Matrica.ColCount - 1 do
      Matrica.Cells[j, i] := IntToStr(i * 20 + j);
end;

Последний раз редактировалось Serge_Bliznykov; 14.06.2010 в 14:58.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.06.2010, 15:54   #7
Delphin-666
Новичок
Джуниор
 
Регистрация: 14.06.2010
Сообщений: 7
По умолчанию

Serge_Bliznykov, сказать спасибо, значит не сказать ничего... Вы просто избавили меня от еще нескольких дней мучения. Можно только еще спросить, как запомнить координаты найденных чисел, то бишь в какой строке и стобце они имеют место быть.
Delphin-666 вне форума Ответить с цитированием
Старый 14.06.2010, 17:52   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

не за что!

Цитата:
как запомнить координаты найденных чисел, то бишь в какой строке и стобце они имеют место быть.
это несложно.
Чуть сложнее Вам придумать, где их хранить...
Можно массивы MxMnA и MxMnB сделать двухмерными и сохранять там.
А можно банально в тот же ListBox писать....
Тогда это вообще проще простого.

вот, на примере //минимальное в строках
Код:
//минимальное в строках
  for InA := 1 to MxA
    do begin
      minIndex := 1;
      mn_s := Str[InA, 1];
      for InB := 1 to MxB
        do if Str[InA, InB] < mn_s
        then begin
          mn_s := Str[InA, InB];
          minIndex := InB;
          MxMnB[InA] := mn_s;          
        end;
    ListBox1.Items.Add('В строке '+IntToStr(InA)+
         ' минимальная величина в столбце '+IntToStr(minIndex)+' равна '+ inttostr(mn_s));
  end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.06.2010, 18:19   #9
Delphin-666
Новичок
Джуниор
 
Регистрация: 14.06.2010
Сообщений: 7
По умолчанию

бесподобно! Именно в листбокс я и планировал выводить это! Спасибо еще раз!

Последний раз редактировалось Delphin-666; 15.06.2010 в 03:36.
Delphin-666 вне форума Ответить с цитированием
Старый 15.06.2010, 09:07   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Delphin-666, проблему нахождения наибольшего среди минимумов и наименьшего среди максимумов решили?
Тему можно считать закрытой?
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как вывести на экран локальные минимумы в среде delphi ? кристина19 Общие вопросы Delphi 12 08.05.2010 19:55
Найти максимумы Alisa19 Помощь студентам 0 28.04.2010 19:08
Локальные минимумы и их номера. f4rr3l Паскаль, Turbo Pascal, PascalABC.NET 5 06.01.2009 21:51