0 / 0 / 0
Регистрация: 20.02.2012
Сообщений: 10
1

Присвоение элементу массива значения другого элемента этого же массива

10.03.2019, 18:56. Показов 1186. Ответов 5

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток!
Возникла проблема следующего толка: пишу программу для определения кратчайших расстояний и кратчайших маршрутов между пунктами, заданными на полигоне. В ПаскалеАБС вот это место работает отлично, и массив меняется, а вот в делфи всё остается так, как и было. Сто процентов какая-то ерунда, но всю голову уже сломал.
Подскажите, может кто сталкивался уже

Место, которое работает не так, как надо
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for j := 1 to N - 1 do
  begin
    for i := 1 to N - 1 do
    begin
      for k := 1 to N - 1 do
      begin
        if D[i, k] > (D[i, j] + D[j, k]) then
          B[i,k]:=b[i,j]
        else
          B[i,k]:=B[i,k];
        D[i, k] := min(D[i, k], D[i, j] + D[j, k]);
      end;
    end;
  end;
Полный код
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, ComObj, Vcl.Grids, Vcl.StdCtrls;
 
type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    StringGrid2: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    function min(d1, d2: integer): integer;
  end;
 
var
  Form1: TForm1;
  ExcelApp, ExcelSheet: OLEVariant;
  MyMass: Variant;
  D, B: array of array of integer;
  M: array of array of string;
  N, d1, d2: integer;
 
const
  xlCellTypeLastCell = $0000000B;
 
implementation
 
{$R *.dfm}
 
function TForm1.min(d1, d2: integer): integer;
begin
  if d1 > d2 then
    min := d2
  else
    min := d1;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  i, j, k, x, y: integer;
begin
 
  for j := 1 to N - 1 do
  begin
    for i := 1 to N - 1 do
    begin
      for k := 1 to N - 1 do
      begin
        if D[i, k] > (D[i, j] + D[j, k]) then
          B[i,k]:=b[i,j]
        else
          B[i,k]:=B[i,k];
        D[i, k] := min(D[i, k], D[i, j] + D[j, k]);
      end;
    end;
  end;
 
  for x := 1 to StringGrid1.ColCount - 1 do
    for y := 1 to StringGrid1.RowCount - 1 do
       StringGrid1.Cells[x, y] := inttostr(D[x, y]);
 
 
 
end;
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ExcelApp.Quit;
  ExcelApp := Unassigned;
  ExcelSheet := Unassigned;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
 
var
  x, y: integer;
begin
  // создание OLE-объекта Excel
  ExcelApp := CreateOleObject('Excel.Application');
 
  // открытие книги Excel
  ExcelApp.Workbooks.Open('C:\1.xlsx');
 
  // открытие листа книги
  ExcelSheet := ExcelApp.Workbooks[1].WorkSheets[1];
 
  // выделение последней задействованной ячейки на листе
  ExcelSheet.Cells.SpecialCells(xlCellTypeLastCell).Activate;
 
  // получение значений размера выбранного диапазона
  x := ExcelApp.ActiveCell.Row;
  y := ExcelApp.ActiveCell.Column;
 
  // присвоение массиву диапазона ячеек на листе
  MyMass := ExcelApp.Range['A1', ExcelApp.Cells.Item[x, y]].Value;
 
  // назначение размера StringGrid по размеру полученного диапазона ячеек
  StringGrid1.RowCount := x + 1;
  StringGrid1.ColCount := y + 1;
  StringGrid2.RowCount := x + 1;
  StringGrid2.ColCount := y + 1;
  SetLength(D, x + 1, y + 1);
  SetLength(B, x + 1, y + 1);
  SetLength(M, 2, x * y - y);
  N := x + 1;
 
  // заполнение таблицы StringGrid значениями массива
  for x := 1 to StringGrid1.ColCount - 1 do
    for y := 1 to StringGrid1.RowCount - 1 do
    begin
      StringGrid1.Cells[x, 0] := inttostr(x);
      StringGrid1.Cells[0, x] := inttostr(x);
      StringGrid2.Cells[x, 0] := inttostr(x);
      StringGrid2.Cells[0, x] := inttostr(x);
      StringGrid1.Cells[y, x] := MyMass[y, x];
      StringGrid2.Cells[y, x] := inttostr(y);
    end;
 
  for x := 1 to StringGrid1.ColCount - 1 do
    for y := 1 to StringGrid1.RowCount - 1 do
    begin
      D[x, y] := strtoint(StringGrid1.Cells[x, y]);
      B[x, y] := strtoint(StringGrid2.Cells[x, y]);
    end;
end;
 
end.
Вложения
Тип файла: xlsx 1.xlsx (8.8 Кб, 2 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.03.2019, 18:56
Ответы с готовыми решениями:

Составить программу для вычисления максимального элемента массива умноженного на среднее арифметическое этого массива
нужно составить программу для вычисления максимального элемента массива умноженного на среднее...

Все элементы этого массива, предшествующие первому по порядку элементу со значением max(a1, ...,a10), умножить на этот максимальный элемент
Дан одномерный массив из а элементов. Все элементы этого массива, предшествующие первому по порядку...

Присвоение переменной значения элемента массива из другого класса
Здравствуйте. В классе Player имеется массив public static int stats = { 40, 100, 15 }; Как...

Присвоение значения элементу двумерного массива
Почему я могу сделать так: Coors = 2560.6301, Coors = -1289.7698, Coors = 1044.1250;, а так: Coors...

5
Модератор
9252 / 6031 / 2378
Регистрация: 21.01.2014
Сообщений: 25,782
Записей в блоге: 3
10.03.2019, 21:41 2
Хм-м-м... А зачем Вам своя функция Min? Что, стандартной, из модуля Math не хватает?
0
0 / 0 / 0
Регистрация: 20.02.2012
Сообщений: 10
11.03.2019, 12:42  [ТС] 3
Про модуль не знал, спасибо, но вопрос был в другом)
0
0 / 0 / 0
Регистрация: 20.02.2012
Сообщений: 10
11.03.2019, 23:08  [ТС] 4
Я страшно сглупил.
133 строка
Delphi
1
B[x, y] := strtoint(StringGrid2.Cells[x, y]);
Должна быть такой
Delphi
1
B[x, y] := strtoint(StringGrid2.Cells[y, x]);
0
northener
12.03.2019, 02:24
  #5

Не по теме:

Цитата Сообщение от Васильев Дима Посмотреть сообщение
Я страшно сглупил.
Не.
Это не вы виноваты. Это разработчики TStringGrid ступили. С какого бодуна они решили первым индексом сделать номер колонки, а вторым - номер строки? Японцами/китайцами они были что-ли?
Практически во всём мире принято читать строки. Ну разве что некоторые читают их справа-налево.

0
D1973
12.03.2019, 06:33     Присвоение элементу массива значения другого элемента этого же массива
  #6

Не по теме:

Цитата Сообщение от northener Посмотреть сообщение
Японцами/китайцами они были что-ли?
Индусами!

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.03.2019, 06:33

Присвоение значения случайному элементу массива
Всем привет. Такой вопрос. Вот есть у меня массив, скажем, A, состоящий из десяти элементов....

Указатели и классы: присвоение значения элементу массива, который является полем класса
Доброго времени суток, делал задание, где надо создать класс, полем которого будет массив...

Построить массив В путем вычитания максимального значения исходного массива А из соответветствующего элемента этого массива
идет экзаем очень нужно... дан одномерный массив А из N элементов. По данному массиву построить...

Присвоить элементу одномерного массива значение другого элемента
Доброе время суток! За ранее благодарен, тому кто откликнется!!! Задача, головоломка! А кому...


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

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

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