Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 27.04.2017
Сообщений: 2
1

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

27.04.2017, 11:52. Показов 1325. Ответов 3

Author24 — интернет-сервис помощи студентам
Поделитесь пожалуйста опытом, как сделать так, чтобы вызвав функцию один раз для матрицы "А" (например в а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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.04.2017, 11:52
Ответы с готовыми решениями:

Определить функцию, реализующую поиск позиции минимального элемента в списке
Определить функцию, реализующую поиск позиции минимального элемента в списке. Если список пустой,...

Поиск минимального элемента на фикисрованной позиции в списке списков
Имеется код list = Надо найти 25 -- минимальный элемент. Проблема в том, что не пойму как это...

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

Перемножение матриц разного размера
Всем здравствуйте! У меня есть одна задачка, необходимо перемножить матрицы разной размерность А и...

3
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
27.04.2017, 12:13 2
Цитата Сообщение от dako51012 Посмотреть сообщение
В моей программе функция вызывается 4 раза.
И что?

Добавлено через 57 секунд
Создайте массив матриц и вызывайте функцию в цикле.
1
225 / 80 / 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
0 / 0 / 0
Регистрация: 27.04.2017
Сообщений: 2
02.05.2017, 03:32  [ТС] 4
Спасибо большое Animalia! Вы все правильно поняли и хорошо объяснили.
0
02.05.2017, 03:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.05.2017, 03:32
Помогаю со студенческими работами здесь

Обучающая выборка из матриц разного размера
Как использовать подобную выборку для обучения? Возможно ли вообще её применить для обучения, или...

Определить позиции минимальных элементов в заданных квадратных матрицах A и B разного размера
Добрый вечер, не могли бы вы, пожалуйста, помочь с заданием ? "Определить позиции минимальных...

Написать 4 функции для матриц(Создание матрицы, печать, поиск минимального элемента, удаление столбцов)
Написать функции: 1. создания матрицы размерности A , элементы матрицы А – вещественные числа....

Найти суму двух квадратных матриц разного размера
Найти суму двух квадратных матриц разного размера.


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru