Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
1

Сортировка массива методом прямого выбора

26.11.2016, 21:38. Показов 1326. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Сортирую массив методом прямого выбора, но вылетает ошибка :
Код
Project Project1.exe raised exception class EListError with message 'List index out of bounds (-1)'. 
Process stopped. Use Step or Run to continue.
Не понимаю где ошибка, вот код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm1.mniN4Click(Sender: TObject);
var i,j,buf: Integer;
begin
  sg1:=strngrd2;
  sg2:=strngrd3;
 
  for i:= 0 to sg1.ColCount - 2 do
    for j:= i + 1 to sg1.ColCount - 1 do
      if sort[i] > sort[j] then
      begin
        buf:= sort[i];
        sort[i]:= sort[j];
        sort[j]:= buf;
      end;
 
  for i:= 0 to sg1.ColCount - 1 do
    sg2.Cells[i-1,0]:= IntToStr(sort[i]);
end;
Постановка задачи, надо создать матрицу, заполнить её случайными числами(записать в stringgrid1), вывести в массив главную диагональ или побочную..(записать в stringgrid2) Затем отсортировать

Вот весь код:
Кликните здесь для просмотра всего текста

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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls, Menus;
 
type
  TForm1 = class(TForm)
    strngrd1: TStringGrid;
    lbl1: TLabel;
    edt1: TEdit;
    strngrd2: TStringGrid;
    mm1: TMainMenu;
    mniN1: TMenuItem;
    mniN2: TMenuItem;
    mniN4: TMenuItem;
    mniN5: TMenuItem;
    mniN6: TMenuItem;
    mniN7: TMenuItem;
    mniN8: TMenuItem;
    mniN9: TMenuItem;
    mniN10: TMenuItem;
    mniN3: TMenuItem;
    strngrd3: TStringGrid;
    mniN11: TMenuItem;
    procedure edt1Click(Sender: TObject);
    procedure mniN2Click(Sender: TObject);
    procedure mniN6Click(Sender: TObject);
    procedure mniN7Click(Sender: TObject);
    procedure mniN8Click(Sender: TObject);
    procedure mniN9Click(Sender: TObject);
    procedure mniN4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  sg,sg1,sg2: TStringGrid;
  a : array[1..10, 1..10] of integer;
  sort : array[0..10] of integer;
 
 
implementation
 
uses Math;
 
{$R *.dfm}
 
procedure ColRow(sg: TStringGrid);
var i,j: Integer;
begin
  for i:=0 to sg.RowCount do
    sg.Cells[i,0]:= IntToStr(i);
  for j:=0 to sg.ColCount do
    sg.Cells[0,j]:= IntToStr(j);
end;
 
procedure Filling(sg: TStringGrid);
var i,j,n: Integer;
begin
  Randomize;
  n := sg.ColCount - 1;
  for i:= sg.FixedRows to sg.RowCount - 1 do
    for j:= sg.FixedCols to n do
    begin
      a[i,j]:= random(10);
      sg.Cells[j,i]:= IntToStr(a[i,j]);
    end;
end;
 
procedure Listing(edt1: TEdit; sg:TStringGrid);
var SList: TStringList;
    s1,s2: String;
begin
  SList:=TStringList.Create;
    try
      SList.Delimiter;
      SList.DelimitedText:= edt1.Text;
      s1:=SList[0];
      s2:=SList[1];
      sg.RowCount:=StrToInt(s1) + 1;
      sg.ColCount:=StrToInt(s2) + 1;
    finally
      SList.Free;
    end;
end;
 
procedure TForm1.mniN2Click(Sender: TObject);
begin
  sg:=strngrd1;
  Listing(edt1,sg);
  ColRow(sg);
  Filling(sg);
end;
 
procedure TForm1.edt1Click(Sender: TObject);
begin
  edt1.Clear;
end;
 
procedure TForm1.mniN6Click(Sender: TObject);
var i,j,n: integer;
begin
  sg:=strngrd1;
  sg1:=strngrd2;
  sg2:=strngrd3;
  n := sg.ColCount - 1;
  for i:= sg.FixedRows to sg.RowCount - 1 do
  begin
    for j:= sg.FixedCols to n do
    begin
      if j=i then sg1.Cells[i-1,0]:= IntToStr(a[i,j]);
    end;
    sort[i]:= StrToInt(sg1.Cells[i-1,0]);
  end;
end;
 
procedure TForm1.mniN7Click(Sender: TObject);
var i,j,n: integer;
begin
  sg:=strngrd1;
  sg1:=strngrd2;
  n := sg.ColCount - 1;
  for i:= sg.FixedRows to sg.RowCount - 1 do
    for j:= sg.FixedCols to n do
    begin
      if j=n-i+1 then sg1.Cells[i-1,0]:= IntToStr(a[i,j]);
    end;
end;
 
procedure TForm1.mniN8Click(Sender: TObject);
var i,j,n: integer;
begin
  sg:=strngrd1;
  sg1:=strngrd2;
  n := sg.ColCount - 1;
  for i:= sg.FixedRows to sg.RowCount - 1 do
    for j:= sg.FixedCols to n-n+1 do
    begin
      sg1.Cells[i-1,0]:= IntToStr(a[j,i]);
    end;
end;
 
procedure TForm1.mniN9Click(Sender: TObject);
var i,j,n: integer;
begin
  sg:=strngrd1;
  sg1:=strngrd2;
  n := sg.ColCount - 1;
  for i:= sg.FixedRows to sg.RowCount - 1 do
    for j:= sg.FixedCols to n do
    begin
      sg1.Cells[i-1,0]:= IntToStr(a[j,i]);
    end;
end;
 
procedure TForm1.mniN4Click(Sender: TObject);
var i,j,buf: Integer;
begin
  sg1:=strngrd2;
  sg2:=strngrd3;
 
  for i:= 0 to sg1.ColCount - 2 do
    for j:= i + 1 to sg1.ColCount - 1 do
      if sort[i] > sort[j] then
      begin
        buf:= sort[i];
        sort[i]:= sort[j];
        sort[j]:= buf;
      end;
 
  for i:= 0 to sg1.ColCount - 1 do
    sg2.Cells[i-1,0]:= IntToStr(sort[i]);
end;
 
end.


Добавлено через 1 час 47 минут
Актуально
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.11.2016, 21:38
Ответы с готовыми решениями:

Сортировка массива методом прямого выбора и методом прямого обмена (пузырьковая)
Сортировка в Delphi массива из 6 двухзначных чисел. Методом прямого выбора и методом прямого...

Сортировка методом прямого выбора в массиве.
Привет всем! У меня снова проблемы с алгоритмами:wall:. На этот раз ступором встала сортировка...

Сортировка "Пузырьком" vs. Сортировка Методом прямого выбора.
Доброго времени суток программисты! У меня тут вопрос. Как вы считаете какой алгоритм сортировки...

Сортировка одномерного массива методом выбора
помогите пожалуйста с програмкой по одномерному массиву, где нужно произвести сортировку методом...

11
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
27.11.2016, 10:53 2
Цитата Сообщение от Azazel-San Посмотреть сообщение
Сортирую массив методом прямого выбора,
Где Вы сортируете массив? Вы пытаетесь сортировать содержимое ячеек StringGrid.
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
27.11.2016, 11:07  [ТС] 3
Puporev, в 119 строке, паралельно заполняю одномерный массив.. Или это не верно?
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
27.11.2016, 11:08 4
Цитата Сообщение от Azazel-San Посмотреть сообщение
заполняют одномерный массив.
Так и сортировать нужно его, а результат выводить в таблицу 2.
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
27.11.2016, 11:10  [ТС] 5
Puporev, а я что делаю? Или это надо все делать в 1й процедуре? Я что-то не шарю(
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
27.11.2016, 11:22 6
А, нет, все верно. Не туда глянул, сортируется массив.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm1.mniN4Click(Sender: TObject);
var i,j,buf: Integer;
begin
  sg1:=strngrd2;
  sg2:=strngrd3;
 
  for i:= 0 to sg1.ColCount - 2 do
    for j:= i + 1 to sg1.ColCount - 1 do
      if sort[i] > sort[j] then
      begin
        buf:= sort[i];
        sort[i]:= sort[j];
        sort[j]:= buf;
      end;
 
  for i:= 0 to sg1.ColCount - 1 do
    sg2.Cells[i-1,0]:= IntToStr(sort[i]);
end;
Добавлено через 4 минуты
А ошибка с индексом например здесь.
Delphi
1
2
3
for i:= 0 to sg1.ColCount - 2 do//массив [1..10] индекс с 1, а не с 0.
    for j:= i + 1 to sg1.ColCount - 1 do //-1 не нужно и вообще лучше оперировать размерами массива, например m,n
                                                    // а не размерами таблицы
Добавлено через 2 минуты
Если не разберетесь, скиньте сюда архив проекта, я посмотрю.
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
27.11.2016, 11:25  [ТС] 7
Puporev, я задал массив как [0..10], и я выше уже писал с нулём, только через FixedRows, они у меня по дефолту = 0, а как мне тогда задавать размеры массива если они могут постоянно меняется?
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
27.11.2016, 11:28 8
Цитата Сообщение от Azazel-San Посмотреть сообщение
если они могут постоянно меняется?
Динамический массив и матрица.
Delphi
1
2
var a:array of array of integer;
     sort:array of integer;
Если не знаете, почитайте про динамические массивы в Делфи.
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
27.11.2016, 11:35  [ТС] 9
Puporev, да я знаю) просто это надо опять часть кода переделывать) разве если наша сортировка натыкается на пустую ячейку, она не проигнорит её? Или может можно удалять пустые ячейки динамически? К примеру когда я заполняю первый стринггрид рандомными числами он автоматически удаляет пустые
Ну шас сяду за комп, посмотрю как оно будет
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
27.11.2016, 12:07 10
Вот по сути вся твоя программа.
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
var
  Form1: TForm1;
  a:array of array of integer;
  n:integer;
implementation
 
{$R *.dfm}
//создать матрицу
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
n:=strtoint(Edit1.Text);
stringgrid1.RowCount:=n;
stringgrid1.ColCount:=n;
setlength(a,n,n);
randomize;
for i:=0 to n-1 do
for j:=0 to n-1 do
 begin
  a[i,j]:=random(100);
  stringgrid1.Cells[j,i]:=inttostr(a[i,j])
 end;
end;
 //создать и отсортировать массив
procedure TForm1.Button2Click(Sender: TObject);
var b:array of integer;
    i,j,k,x:integer;
begin
setlength(b,n);
with stringgrid2 do
 begin
  colcount:=n;
  rowcount:=1
 end;
with stringgrid3 do
 begin
  colcount:=n;
  rowcount:=1
 end;
//масив главной диагонали
for i:=0 to n-1 do
 begin
  b[i]:=a[i,i];
  StringGrid2.Cells[i,0]:=IntToStr(b[i]);
 end;
//сортируем
for i:=0 to n-2 do
for j:=i+1 to n-1 do
if b[i]>b[j]then
 begin
   x:=b[i];
   b[i]:=b[j];
   b[j]:=x;
 end;
for i:=0 to n-1 do
stringgrid3.Cells[i,0]:=inttostr(b[i])
end;
1
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
27.11.2016, 22:47  [ТС] 11
Puporev, а побочную тогда как?

Добавлено через 14 минут
разобрался уже ))

Добавлено через 6 часов 10 минут
Puporev, а можешь помочь с бинарным поиском?
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
28.11.2016, 09:50 12
Зайди в поиск->расширенный поиск, набери ключевые слова Бинарный поиск и выбери раздел Делфи для начинающих, там куча тем, если мало, выбери раздел Паскаль, там еще больше.
0
28.11.2016, 09:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.11.2016, 09:50
Помогаю со студенческими работами здесь

Отсортировать (по неубыванию) методом прямого выбора массив вещественных чисел
Отсортировать (по неубыванию) методом прямого выбора массив вещественных чисел A, n> 100. Найти...

Сортировка методом выбора
Здраствуйте на паре задали задание сделать сортировку методом выбора, нужно написать или...

Сортировка методом выбора
Подскажите, пожалуйста, в чем у меня ошибка. Сортировка выполняется не полностью и выходят...

Сортировка методом выбора в файле
Привет всем. Помогите мне, пожалуйста, с решением следующего задания. Необходимо написать...


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

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

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