Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
dako51012
0 / 0 / 0
Регистрация: 27.04.2017
Сообщений: 2
#1

Поиск позиции минимального элемента через функцию матриц разного размера - Delphi

27.04.2017, 11:52. Просмотров 235. Ответов 3

Поделитесь пожалуйста опытом, как сделать так, чтобы вызвав функцию один раз для матрицы "А" (например в а1) я смог получить позиции минимального элемента,тоже самое для матрицы "В". В моей программе функция вызывается 4 раза. В функции описан поиск минимального элемента и его позиций (f.pi, f.pj).
http://www.cyberforum.ru/delphi-beginners/thread1954095.html

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
TForm1 = class(TForm)
    Button1: TButton;
    e1: TEdit;
    e2: TEdit;
    e3: TEdit;
    e4: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    sg1: TStringGrid;
    sg2: TStringGrid;
    se1: TSpinEdit;
    se2: TSpinEdit;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure se1Change(Sender: TObject);
    procedure se2Change(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
type
  TPosit=record
    pi,pj:integer;
  end;
  tmatr=array[1..10,1..10] of integer;
  function fu(matr:tmatr;n:integer):TPosit;
  var
    i,j,d:integer;
    begin
      d:=matr[1,1];
      f.pi:=1;
      f.pj:=1;
      For i:=1 to n do
      For j:=1 to n do
      If d>matr[i,j] then
      begin
        d:=matr[i,j];
        f.pi:=i;
        f.pj:=j;
      end;
    end;
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.se1Change(Sender: TObject);
begin
  sg1.RowCount:=se1.value;
  sg1.ColCount:=se1.value;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
a,b:tmatr;
i,j,a1,a2,b1,b2:integer;
begin
  For i:=1 to se1.value do
  For j:=1 to se1.value do
  a[i,j]:=strtoint(sg1.cells[i-1,j-1]);
  For i:=1 to se2.value do
  For j:=1 to se2.value do
  b[i,j]:=strtoint(sg2.cells[i-1,j-1]);
  a1:=f(a,se1.value).pi/pj;
  a2:=f(a,se1.value).pj;
  e1.text:=IntToStr(a1);
  e2.text:=IntToStr(a2);
  b1:=f(b,se2.value).pi;
  b2:=f(b,se2.value).pj;
  e3.text:=inttostr(b1);
  e4.text:=inttostr(b2);
end;
 
procedure TForm1.se2Change(Sender: TObject);
begin
  sg2.RowCount:=se2.value;
  sg2.ColCount:=se2.value;
end;
 
end.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2017, 11:52
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Поиск позиции минимального элемента через функцию матриц разного размера (Delphi):

Поиск минимального значения элемента и определение порядкового номера наименьшего элемента
Дана непустая последовательность различных натуральных чисел. Определить...

Поиск минимального элемента массива
Вот составила программу,но мне ошибку выдает,не подскажите ли,в чем дело? unit...

Поиск минимального положительного элемента в массиве
помогите написать код для поиска минимального положительного элемента в...

Поиск минимального и максимального элемента массива
Здравствуйте, Нужна помощь в написании программы "поиска минимального и...

Поиск минимального элемента среди максимальных
Ищем максимальные элементы по строкам.В каждой строке свой максимальный элемент...

3
Puporev
Модератор
54129 / 41762 / 28874
Регистрация: 18.05.2008
Сообщений: 98,289
27.04.2017, 12:13 #2
Цитата Сообщение от dako51012 Посмотреть сообщение
В моей программе функция вызывается 4 раза.
И что?

Добавлено через 57 секунд
Создайте массив матриц и вызывайте функцию в цикле.
1
Animalia
224 / 79 / 35
Регистрация: 01.04.2017
Сообщений: 182
27.04.2017, 22:10 #3
Лучший ответ Сообщение было отмечено dako51012 как решение

Решение

Начнем по порядку.
В коде фигурирует функция F - которая нигде не обьявлена, и функция Fu - которая ни разу не вызывается, будем считать опечаткой.
TPosit - зачем? Чем стандартный TPoint не угодил, ну да ладно, это так для затравки

Функция вызывается 4 раза, причем 2 из них совершенно ненужны. Я так понял именно в этом и вопрос.
Ваша функция возврашает TPosit - запись, но при каждом вызове используется только одно поле этой записи.
Delphi
1
2
  b1:=f(b,se2.value).pi;
  b2:=f(b,se2.value).pj;
Почему бы не обьявить переменные, к примеру ACoord и BCoord, как TPoint, и не присваивать результат функции им за один заход?

Далее se1.value и se2.value. Я конечно понимаю что таким образом вы пытаетесь задать размерность массива, но это костыль.
Почитайте немного тему Динамические массивы в Delphi из важных тем.

Итого с учетом всего этого код изменится примерно к такому виду
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
var
  Form1: TForm1;
 
implementation
 
type
  tmatr = array of array of integer;
 
function MinCoord(Matr: tmatr): TPoint;
var
  i, j: integer;
  //TempMin: integer;
begin
  //TempMin := High(integer);
  Result.Y := 0;
  Result.X := 0;
  For i := 0 to High(Matr) do
    For j := 0 to High(Matr[i]) do
      If Matr[MinCoord.Y, MinCoord.X] > Matr[i, j] then
      begin
        //TempMin := Matr[i, j];
        MinCoord.Y := i;
        MinCoord.X := j;
      end;
end;
 
{$R *.lfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  a, b: tmatr;
  i, j: integer;
  ACoord, BCoord: TPoint;
begin
  SetLength(a, SE1.value, SE1.value);
  SetLength(b, se2.value, se2.value);
  for i := 0 to High(a) do
    for j := 0 to High(a[i]) do
      a[i, j] := strtoint(sg1.cells[i, j]);
  for i := Low(b) to High(b) do
    for j := Low(b[i]) to High(b[i]) do
      b[i, j] := strtoint(sg2.cells[i, j]);
  ACoord := MinCoord(a);
  e1.text := IntToStr(ACoord.Y);
  e2.text := IntToStr(ACoord.X);
  sg1.Selection:=TGridRect(rect(ACoord.Y, ACoord.X, ACoord.Y, ACoord.X));
  BCoord := MinCoord(b);
  e3.text := IntToStr(BCoord.Y);
  e4.text := IntToStr(BCoord.X);
  sg2.Selection:=TGridRect(rect(BCoord.Y, BCoord.X, BCoord.Y, BCoord.X));
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
  i, j: integer;
begin
  for i := 0 to SE1.value do
    for j := 0 to SE1.value do
      sg1.cells[i, j]:=InttoStr(random(200)-100);
  for i := 0 to SE2.value do
    for j := 0 to SE2.value do
      sg2.cells[i, j]:=InttoStr(random(200)-100);
  Button1.Click;N
end;
 
procedure TForm1.SE1Change(Sender: TObject);
begin
  sg1.RowCount := SE1.value;
  sg1.ColCount := SE1.value;
  Button2.Click;
end;
 
procedure TForm1.se2Change(Sender: TObject);
begin
  sg2.RowCount := se2.value;
  sg2.ColCount := se2.value;
  Button2.Click;
end;
 
end.


p.s.
т.к. я ленивый добавил кнопку заполнения массива - вводить под сотню значений ручками мне терпения нехватит, и код выделения ячейки с минимальным элементом добавил - для наглядности

Не по теме:

Переменная d в коде функции почти лишняя. Вы уже храните координаты элемента, зная их можно легко найти значение. С другой стороны код с доп. переменной на БОЛЬШИХ обьемах будет быстрее, но есть шанс накосячить если в теле циклов идет много математики - изменить переменную по запарке легко, а потом долго думать, почему работает не так, как надо. Это так для справки

1
dako51012
0 / 0 / 0
Регистрация: 27.04.2017
Сообщений: 2
02.05.2017, 03:32  [ТС] #4
Спасибо большое Animalia! Вы все правильно поняли и хорошо объяснили.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.05.2017, 03:32
Привет! Вот еще темы с решениями:

Симметрическая разница массивов и поиск минимального элемента
Доброе время суток. Помогите пожалуйста с заданием: "Задано массивы чисел А(n),...

Двухмерный массив: поиск минимального элемента и сортировка
ввести двухмерный массив размерности (n*m). В каждой строке найти минимальный...

Поиск максимального/минимального элемента в динамическом массиве
Необходимо из главного массива glmas,сформированного из элементов стринггрида...

Составить функцию для определения минимального элемента массива типа string
Составить функцию для определения минимального элемента массива типа string ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru