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

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

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

Поделитесь пожалуйста опытом, как сделать так, чтобы вызвав функцию один раз для матрицы "А" (например в а1) я смог получить позиции минимального элемента,тоже самое для матрицы "В". В моей программе функция вызывается 4 раза. В функции описан поиск минимального элемента и его позиций (f.pi, f.pj).

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
Ответы с готовыми решениями:

Умножение матриц разного размера
Помогите пожалуйста, нужна программа для умножения матриц с разными размерами, с помощью StringGrid

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

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

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

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

3
Puporev
Модератор
54370 / 41958 / 28981
Регистрация: 18.05.2008
Сообщений: 98,831
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

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

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

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


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

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

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