Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 16

Кнопки НАЗАД/ВПЕРЕД. Очередь и дек (DEQ). Основные действия, циклический сдвиг элементов (циклическая прокрутка)

10.06.2013, 19:35. Показов 3386. Ответов 28

Студворк — интернет-сервис помощи студентам
Собственно программа, Очередь на основе циклического массива.
Очень помогла тема Очередь посредством циклического массива

Помогите! Мне остаётся реализовать кнопки Назад/Вперед что бы передвигаться по результатам так сказать...
Не знаю как сделать(( Так-то предлагалось создать "создать двумерный массив x_s, каждая строчка которого будет содержать одномерный массив x на каждом шаге алгоритма."


Файл:Очередь StringGrid.rar


Код:
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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, ComCtrls;
 
type
  TForm1 = class(TForm)
    btn2: TButton;
    btn3: TButton;
    btn4: TButton;
    edt1: TEdit;
    edt2: TEdit;
    edt3: TEdit;
    edt4: TEdit;
    lbl1: TLabel;
    lbl2: TLabel;
    lbl3: TLabel;
    lbl4: TLabel;
    btn1: TButton;
    btn6: TButton;
    btn7: TButton;
    lbl5: TLabel;
    StringGrid1: TStringGrid;
    lbl6: TLabel;
    lbl7: TLabel;
    btn5: TButton;
    btn8: TButton;
    btn9: TButton;
    procedure FormCreate(Sender:TObject);
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender:TObject);
    procedure btn3Click(Sender:TObject);
    procedure btn4Click(Sender:TObject);
 
    procedure btn6Click(Sender: TObject);
    procedure btn7Click(Sender: TObject);
    procedure btn9Click(Sender: TObject);
    procedure btn5Click(Sender: TObject);
    procedure btn8Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1:TForm1;
  d:integer;
 
implementation
 
{$R *.dfm}
 
type
  TData=Integer;
  TQueue=record
   a:array of TData;
   value:Integer; 
  end;
var
  gQueue:TQueue;
 
procedure Init(var aQueue:TQueue);
begin
  aQueue.a:=nil;
  aQueue.value:=0; 
end;
 
 
 
function Push(var aQueue:TQueue; const aData:TData):Boolean;
begin
  Push:=False;
  with aQueue do
    if (value < Length(a)) then begin
      Inc(value);
      a[value-1]:=aData;
      Push:=True;
    end;
end;
 
 
function Del(var aQueue:TQueue; var aData:TData):Boolean;
var
  i : Integer;
begin
  Del:=False;
  with aQueue do
    if (value > 0) then begin
      aData:=a[0];
      Dec(value);
      for i:=1 to value do a[i-1]:=a[i];
      Del:=True;
    end;
end;
 
 
procedure QueueToSg(const aQueue:TQueue; aSg:TStringGrid);
var
  i:integer;
begin
  aSg.Rows[0].Clear;
  if (aQueue.value = 0) then begin
    aSg.ColCount:=1;
    aSg.Cells[0,0]:='';
  end else begin
    aSg.ColCount:=aQueue.value;
    for i:=0 to aQueue.value-1 do
      aSg.Cells[i,0]:=IntToStr(aQueue.a[i]);
  end;
end;
 
 
 
procedure Delay(Value: Cardinal);
var
  F, N: Cardinal;
begin
  N := 0;
  while N <= (Value div 10) do
  begin
    SleepEx(1, True);
    Application.ProcessMessages;
    Inc(N);
  end;
  F := GetTickCount;
  repeat
    Application.ProcessMessages;
    N := GetTickCount;
  until (N - F >= (Value mod 10)) or (N < F);
end;
 
 
//TForm1
procedure TForm1.FormCreate(Sender:TObject);
begin
  Init(gQueue);
  d:=0;
end;
 
 
 
 
procedure TForm1.btn2Click(Sender:TObject);
var
  Len,Num:Integer;
begin
  if (not TryStrToInt(edt2.Text, Num)) then begin
   lbl7.Caption:='Çíà÷åíèå ýëåìåíòà çàäàíî íåâåðíî. Ñëåäóåò ââåñòè öåëîå ÷èñëî.';
   Exit;
  end;
  Len:=Abs(StrToInt(edt1.text));
  SetLength(gQueue.a,Len);
  if Push(gQueue, Num) then begin
    lbl7.Caption:=' î÷åðåäü äîáàâëåí ýëåìåíò : '+IntToStr(Num);
    edt4.Text:=IntToStr(gQueue.value);
    QueueToSg(gQueue, StringGrid1);
  end else
    lbl7.Caption:='Ïåðåïîëíåíèå. Íå óäàëîñü äîáàâèòü ýëåìåíò â î÷åðåäü. Çàäàéòå ìàêñ. äëèíó î÷åðåäè...';
end;
 
 
//Èçâëå÷ ýëåìåíò èç î÷åðåäè
procedure TForm1.btn3Click(Sender:TObject);
var
  Num:Integer;
begin
  if Del(gQueue, Num) then begin
    lbl7.Caption:='Ýëåìåíò '+IntToStr(Num)+' èçâëå÷åí èç î÷åðåäè';
    edt3.Text:=IntToStr(Num);
    edt4.Text:=IntToStr(gQueue.value);
    QueueToSg(gQueue, StringGrid1);
  end else
    lbl7.Caption:='Î÷åðåäü ïóñòà. Íå óäàëîñü âçÿòü ýëåìåíò èç î÷åðåäè.';
end;
 
//Î÷èñòèòü î÷åðåäü
procedure TForm1.btn4Click(Sender:TObject);
begin
  gQueue.value:=0;
  edt4.Text:=IntToStr(gQueue.value);
  QueueToSg(gQueue, StringGrid1);
  lbl7.Caption:='Î÷åðåäü ïóñòà.  Äîáàâüòå ýëåìåíòû î÷åðåäè âðó÷íóþ èëè àâòîìàòè÷åñêè...';
end;
 
procedure TForm1.btn6Click(Sender: TObject);
begin
  d:=d-100;
  if d<=0 then d:=0;
  lbl5.Caption:=IntToStr(d);
end;
 
procedure TForm1.btn7Click(Sender: TObject);
 
begin
  d:=d+100;
  lbl5.Caption:=IntToStr(d);
end;
 
 
procedure TForm1.btn1Click(Sender: TObject);
var
   Len,Num,i,j,k,d:Integer;
begin
  d:=StrToInt(lbl5.Caption);
  Randomize;
  gQueue.value:=0;
  edt4.Text:=IntToStr(gQueue.value);
  QueueToSg(gQueue, StringGrid1);
  Len:=Abs(StrToInt(edt1.text));
  SetLength(gQueue.a,Len);
  for j:=1 to Len do begin
  for i:=1 to Len do begin
    Num:=random(10);
  if Push(gQueue, Num) then begin
    edt4.Text:=IntToStr(gQueue.value);
    QueueToSg(gQueue, StringGrid1);
    lbl7.Caption:=' î÷åðåäü äîáàâëåí ýëåìåíò : '+IntToStr(Num);
    Delay(d);
  end;
  end;
  Del(gQueue, Num);
    lbl7.Caption:='Ýëåìåíò '+IntToStr(Num)+' èçâëå÷åí èç î÷åðåäè';
    edt3.Text:=IntToStr(Num);
    edt4.Text:=IntToStr(gQueue.value);
    QueueToSg(gQueue, StringGrid1);
    Delay(d);
  end;
  for k:=1 to Len do begin
  Del(gQueue, Num);
    edt3.Text:=IntToStr(Num);
    edt4.Text:=IntToStr(gQueue.value);
    QueueToSg(gQueue, StringGrid1);
    lbl7.Caption:='Ýëåìåíò '+IntToStr(Num)+' èçâëå÷åí èç î÷åðåäè';
    Delay(d);
end;
  lbl7.Caption:='Äîáàâüòå ýëåìåíòû î÷åðåäè âðó÷íóþ èëè àâòîìàòè÷åñêè...';
end;
 
 
procedure TForm1.btn9Click(Sender: TObject);
begin
  lbl7.Caption:='Âûõîä èç ïðîãðàììû...';
  Delay(1000);
  close;
end;
 
procedure TForm1.btn5Click(Sender: TObject);
begin
 
end;
 
procedure TForm1.btn8Click(Sender: TObject);
begin
 
end;
 
end.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.06.2013, 19:35
Ответы с готовыми решениями:

Сдвиг массива вперед или назад
Скажите, а как можно сдвинуть массив вперед или назад на одно значение?

кнопки назад вперед
Я сделал БД в SQL вывел таблицу в datagriev. Помогите написать код на кнопки в &quot;начало&quot;, &quot;конец&quot;, и по одной записи вперед,...

FoxPro - кнопки вперед, назад
не могу не как вспомнить в FoxPro при создание базы данных, в форме кнопки вперед, назад я вот DO WHILE !EOF() SKIP +1 ENDDO ...

28
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 16
10.06.2013, 20:09  [ТС]
Ещё главно возможность отката на любое количество шагов назад, вперед...
0
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 16
12.06.2013, 09:06  [ТС]
up темы
0
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 16
13.06.2013, 19:52  [ТС]
Немного ближе...Работает неправильно(

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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, ComCtrls;
 
type
  TForm1 = class(TForm)
    btn2: TButton;
    btn3: TButton;
    btn4: TButton;
    edt1: TEdit;
    edt2: TEdit;
    edt3: TEdit;
    edt4: TEdit;
    lbl1: TLabel;
    lbl2: TLabel;
    lbl3: TLabel;
    lbl4: TLabel;
    btn1: TButton;
    btn6: TButton;
    btn7: TButton;
    lbl5: TLabel;
    StringGrid1: TStringGrid;
    lbl6: TLabel;
    lbl7: TLabel;
    btn5: TButton;
    btn8: TButton;
    btn9: TButton;
    procedure FormCreate(Sender:TObject);
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender:TObject);
    procedure btn3Click(Sender:TObject);
    procedure btn4Click(Sender:TObject);
 
    procedure btn6Click(Sender: TObject);
    procedure btn7Click(Sender: TObject);
    procedure btn9Click(Sender: TObject);
    procedure btn5Click(Sender: TObject);
    procedure btn8Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1:TForm1;
  d:integer;
  mas:array[1..100, 0..1] of integer;
  cur, ab, b:integer;
 
implementation
 
{$R *.dfm}
 
type
  TData=Integer;
  //Очередь
  TQueue=record
   a:array of TData;
   value:Integer; //Количество элементов в очереди
  end;
var
  gQueue:TQueue;
 
//Инициализация очереди
procedure Init(var aQueue:TQueue);
begin
  aQueue.a:=nil;
  aQueue.value:=0; //Первоначялно пустая
end;
 
 
//Добавление элемента в конец очереди
function Push(var aQueue:TQueue; const aData:TData):Boolean;
begin
  Push:=False;
  with aQueue do
    if (value < Length(a)) then begin
      inc(ab);
      cur:=ab;
      mas[ab, 0]:= aData;
      mas[ab, 1]:= 1;      //был 1!
      Inc(value);
      a[value-1]:=aData;
      Push:=True;
    end;
end;
 
 
 
 
//Удаление элемента из начала очереди
function Del(var aQueue:TQueue; var aData:TData):Boolean;
var
  i : Integer;
begin
  Del:=False;
  with aQueue do
    if (value > 0) then begin
      inc(cur);
      ab:=cur;
      mas[ab, 0]:= a[0];                    
      mas[ab, 1]:= 1;    //был 0!!
      aData:=a[0];
      Dec(value);
      for i:=1 to value do a[i-1]:=a[i];
      Del:=True;
    end;
end;
 
//Запись очереди в таблицу
procedure QueueToSg(const aQueue:TQueue; aSg:TStringGrid);
var
  i:integer;
begin
  aSg.Rows[0].Clear;
  if (aQueue.value = 0) then begin
    aSg.ColCount:=1;
    aSg.Cells[0,0]:='';
  end else begin
    aSg.ColCount:=aQueue.value;
    for i:=0 to aQueue.value-1 do
      aSg.Cells[i,0]:=IntToStr(aQueue.a[i]);
  end;
end;
 
 
//Delay, не загружающий процессор
procedure Delay(Value: Cardinal);
var
  F, N: Cardinal;
begin
  N := 0;
  while N <= (Value div 10) do
  begin
    SleepEx(1, True);
    Application.ProcessMessages;
    Inc(N);
  end;
  F := GetTickCount;
  repeat
    Application.ProcessMessages;
    N := GetTickCount;
  until (N - F >= (Value mod 10)) or (N < F);
end;
 
//TForm1
//Инициализация очереди, выполняется при создании формы
procedure TForm1.FormCreate(Sender:TObject);
begin
  Init(gQueue);
  d:=0;    cur:=0; ab:=0; b:= 0;
end;
 
 
 
//Добавить элемент в очередь
{procedure TForm1.btn2Click(Sender:TObject);
var
  Len,Num:Integer;
begin
  if (not TryStrToInt(edt2.Text, Num)) then begin
   lbl7.Caption:='Значение элемента задано неверно. Следует ввести целое число.';
   Exit;
  end;
  Len:=Abs(StrToInt(edt1.text));
  SetLength(gQueue.a,Len);
  if Push(gQueue, Num) then begin
    lbl7.Caption:='В очередь добавлен элемент : '+IntToStr(Num);
    edt4.Text:=IntToStr(gQueue.value);
    QueueToSg(gQueue, StringGrid1);
  end else
    lbl7.Caption:='Переполнение. Не удалось добавить элемент в очередь. Задайте макс. длину очереди...';
end;}
 
 //Добавить элемент в очередь
procedure TForm1.btn2Click(Sender:TObject);
var
  Len,Num,Num2:Integer;
begin
  if (not TryStrToInt(edt2.Text, Num)) then begin
   lbl7.Caption:='Значение элемента задано неверно. Следует ввести целое число.';
   Exit;
  end;
  Len:=Abs(StrToInt(edt1.text));
  SetLength(gQueue.a,Len);
  if Push(gQueue, Num) then begin
    lbl7.Caption:='В очередь добавлен элемент : '+IntToStr(Num);
    edt4.Text:=IntToStr(gQueue.value);
    QueueToSg(gQueue, StringGrid1);
  end else  begin
   if (not TryStrToInt(edt2.Text, Num)) then begin
   lbl7.Caption:='Значение элемента задано неверно. Следует ввести целое число.';
   Exit;
  end;
 
  if Del(gQueue, Num2) then begin
    lbl7.Caption:='Элемент '+IntToStr(Num2)+' извлечен из очереди';
    edt3.Text:=IntToStr(Num2);
    edt4.Text:=IntToStr(gQueue.value);
    QueueToSg(gQueue, StringGrid1);
  end;
  Delay(700);
  if Push(gQueue, Num) then begin
    lbl7.Caption:='В очередь добавлен элемент : '+IntToStr(Num);
    edt4.Text:=IntToStr(gQueue.value);
    QueueToSg(gQueue, StringGrid1);
  end
end;
end;
 
 
 
//Извлеч элемент из очереди
procedure TForm1.btn3Click(Sender:TObject);
var
  Num:Integer;
begin
  if Del(gQueue, Num) then begin
    lbl7.Caption:='Элемент '+IntToStr(Num)+' извлечен из очереди';
    edt3.Text:=IntToStr(Num);
    edt4.Text:=IntToStr(gQueue.value);
    QueueToSg(gQueue, StringGrid1);
  end else
    lbl7.Caption:='Очередь пуста. Не удалось взять элемент из очереди.';
end;
 
//Очистить очередь
procedure TForm1.btn4Click(Sender:TObject);
begin
  gQueue.value:=0;
  edt4.Text:=IntToStr(gQueue.value);
  QueueToSg(gQueue, StringGrid1);
  lbl7.Caption:='Очередь пуста.  Добавьте элементы очереди вручную или автоматически...';
end;
 
 
//Задержка -100 или 0...
procedure TForm1.btn6Click(Sender: TObject);
begin
  d:=d-100;
  if d<=0 then d:=0;
  lbl5.Caption:=IntToStr(d);
end;
 
//Задержка +100
procedure TForm1.btn7Click(Sender: TObject);
 
begin
  d:=d+100;
  lbl5.Caption:=IntToStr(d);
end;
 
//Авторабота...
procedure TForm1.btn1Click(Sender: TObject);
var
   Len,Num,i,j,k,d:Integer;
begin
  d:=StrToInt(lbl5.Caption);
  Randomize;
  gQueue.value:=0;
  edt4.Text:=IntToStr(gQueue.value);
  QueueToSg(gQueue, StringGrid1);
  Len:=Abs(StrToInt(edt1.text));
  SetLength(gQueue.a,Len);
  for j:=1 to Len do begin
  for i:=1 to Len do begin
    Num:=random(10);
  if Push(gQueue, Num) then begin
    edt4.Text:=IntToStr(gQueue.value);
    QueueToSg(gQueue, StringGrid1);
    lbl7.Caption:='В очередь добавлен элемент : '+IntToStr(Num);
    Delay(d);
  end;
  end;
  Del(gQueue, Num);
    lbl7.Caption:='Элемент '+IntToStr(Num)+' извлечен из очереди';
    edt3.Text:=IntToStr(Num);
    edt4.Text:=IntToStr(gQueue.value);
    QueueToSg(gQueue, StringGrid1);
    Delay(d);
  end;
  for k:=1 to Len do begin
  Del(gQueue, Num);
    edt3.Text:=IntToStr(Num);
    edt4.Text:=IntToStr(gQueue.value);
    QueueToSg(gQueue, StringGrid1);
    lbl7.Caption:='Элемент '+IntToStr(Num)+' извлечен из очереди';
    Delay(d);
end;
  lbl7.Caption:='Добавьте элементы очереди вручную или автоматически...';
end;
 
 
//Выход
procedure TForm1.btn9Click(Sender: TObject);
begin
  lbl7.Caption:='Выход из программы...';
  Delay(1000);
  close;
end;
 
 
//Кнопка назад
procedure TForm1.btn5Click(Sender: TObject);
var Num:integer;
begin
  if cur > 0 then begin
    if mas[cur, 1] = 0 then push(gQueue, mas[cur, 0])
    else del(gQueue, Num);
    dec(cur);
  end;
  QueueToSg(gQueue, StringGrid1);
end;
 
 
//Кнопка вперед
procedure TForm1.btn8Click(Sender: TObject);
var Num:integer;
begin
  if cur < ab then begin
    inc(cur);
    if mas[cur, 1] = 1 then push(gQueue, mas[cur, 0])
    else del(gQueue, Num);
  end;
  QueueToSg(gQueue, StringGrid1);
end;
 
end.
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
13.06.2013, 21:21
Цитата Сообщение от Hardcore_MD Посмотреть сообщение
Мне остаётся реализовать кнопки Назад/Вперед что бы передвигаться по результатам так сказать.
Т. е., по этим кнопкам изменять очередь не надо и нужно только показывать элементы очереди - предыдущий или следующий?

Добавлено через 2 минуты
Например, у нас в очереди числа: 10 20 30 40 50 60. Индексация элементов от нуля. Тогда если Cur = 2, то, например, в каком-нибудь Edit мы показываем: 30. Жмём "Назад" и в Edit должно вывестись: 20. Потом если нажмём "Вперёд", то в Edit опять выведется: 30. Ещё раз нажмём "Вперёд" и в Edit будет показано: 40. Правильно я понимаю, что требуется сделать?
1
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 16
13.06.2013, 21:25  [ТС]
Цитата Сообщение от Mawrat Посмотреть сообщение
Т. е., по этим кнопкам изменять очередь не надо и нужно только показывать элементы очереди - предыдущий или следующий?
Если я правильно понял...если удалил(изъял) элемент то по нажатию на кнопку назад востановило на его позицию, вперед удалило снова, или наоборот ввел 10 элементов нажал 10 шагов назад и ввёл другие 10.

Добавлено через 2 минуты
Например, у нас в очереди числа: 10 20 30 40 50 60. Индексация элементов от нуля. Тогда если Cur = 2, то, например, в каком-нибудь Edit мы показываем: 30. Жмём "Назад" и в Edit должно вывестись: 20. Потом если нажмём "Вперёд", то в Edit опять выведется: 30. Ещё раз нажмём "Вперёд" и в Edit будет показано: 40. Правильно я понимаю, что требуется сделать?
Да, точно, я это и имел ввиду...спасибо.
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
13.06.2013, 21:28
Что значит "вперёд удалило"? В очереди есть 2 действия - изъять элемент из начала очереди (удалить из начала очереди) и добавить элемент в конец очереди. Изначально задание как было сформулировано?

Добавлено через 33 секунды
Цитата Сообщение от Hardcore_MD Посмотреть сообщение
Да, точно, я это и имел ввиду...спасибо.
Сейчас покажу как это реализовать...
1
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 16
13.06.2013, 21:33  [ТС]
Что значит "вперёд удалило"? В очереди есть 2 действия - изъять элемент из начала очереди (удалить из начала очереди) и добавить элемент в конец очереди. Изначально задание как было сформулировано?
Суть задания такая:
Разработанный визуализатор должен обеспечивать:
1. наглядную графическую иллюстрацию всех особенностей работы алгоритма
2. вывод пояснения к каждому шагу алгоритма
3. работу в пошаговом и автоматическом режиме,
4. регулировку скорости автоматического выполнения
5. возможность отката на любое количество шагов назад,
6. работу как с предварительно заданными, так и со случайными и введёнными пользователем данными,
7. корректную обработку частных и вырожденных случаев

Некоторые сложности в реализации может вызывать пошаговое выполнение алгоритма и откат в об-ратную сторону. Простейший способ реализации этих функций состоит в том, чтобы предварительно полно-стью выполнить реализуемый алгоритм и сохранить все его переменные на каждом шаге. Например, если визуа-лизируемый алгоритм использует одномерный массив x, то можно создать двумерный массив x_s, каждая строчка которого будет содержать одномерный массив x на каждом шаге алгоритма. Тогда выполнение шага вперед или назад не будет представлять никакой сложности.

"вперед удалило" я имел ввиду(мне кажется это тоже надо реализовать точно не знаю...), что допустим мы ввели 0 1 2 3 потом изъяли 0 нажали назад ноль появился снова, нажали вперед осталось 1 2 3
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
13.06.2013, 21:40
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//Кнопка назад
procedure TForm1.btn5Click(Sender: TObject);
begin
  if gQueue.Value = 0 then begin
    ShowMessage('Очередь пуста. Действие отменено.');
    Exit;
  end;
  
  Cur := (gQueue.Value + Pred(Cur)) mod gQueue.Value;
  Edit5.Text := IntToiStr( gQueue.A[Cur] );
end;
 
//Кнопка вперёд
procedure TForm1.btn8Click(Sender: TObject);
begin
  if gQueue.Value = 0 then begin
    ShowMessage('Очередь пуста. Действие отменено.');
    Exit;
  end;
  
  Cur := (gQueue.Value + Succ(Cur)) mod gQueue.Value;
  Edit5.Text := IntToiStr( gQueue.A[Cur] );
end;
Здесь используются функции Pred() и Succ(), они означают следующее: Pred(Cur) = Cur - 1, Succ(Cur) = Cur + 1.
Edit5 нужно добавить на форму.

Добавлено через 3 минуты
Лучше даже выводить не только значение элемента, но и его индекс в очереди:
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
//Кнопка назад
procedure TForm1.btn5Click(Sender: TObject);
begin
  if gQueue.Value = 0 then begin
    ShowMessage('Очередь пуста. Действие отменено.');
    Exit;
  end;
  
  Cur := (gQueue.Value + Pred(Cur)) mod gQueue.Value;
  Edit5.Text := IntToiStr( gQueue.A[Cur] );
  Edit6.Text := IntToiStr( Cur ); //Индекс.
end;
 
//Кнопка вперёд
procedure TForm1.btn8Click(Sender: TObject);
begin
  if gQueue.Value = 0 then begin
    ShowMessage('Очередь пуста. Действие отменено.');
    Exit;
  end;
  
  Cur := (gQueue.Value + Succ(Cur)) mod gQueue.Value;
  Edit5.Text := IntToiStr( gQueue.A[Cur] );
  Edit6.Text := IntToiStr( Cur ); //Индекс.
end;
Добавлено через 1 минуту
Это циклический перебор. Т. е., если мы жмём кнопку "Вперёд", то когда мы дойдём до последнего элемента очереди и ещё раз нажмём на "Вперёд", то следующим элементом окажется первый элемент очереди. И т. д. - по кругу. Аналогично в обратном направлении - если мы находимся на первом элементе и нажали на кнопку "Назад", то перейдём на последний элемент очереди.
1
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 16
13.06.2013, 21:40  [ТС]
Mawrat, спасибо большое, да работает правильно выводит элементы в edit5.
Полагаю мне остаётся реализовать это с выводом в StringGrid...
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
13.06.2013, 21:44
Хотя тут немного надо подправить. Сейчас...

Добавлено через 1 минуту
Цитата Сообщение от Hardcore_MD Посмотреть сообщение
Полагаю мне остаётся реализовать это с выводом в StringGrid...
А, т. е., надо в StringGrid "прокручивать" элементы назад/вперёд?

Добавлено через 2 минуты
Если разрешить прокручивать очередь в обоих направлениях - то это уже не очередь, а двунаправленная очередь - DEQ (Dual Ended Queue) называется.
1
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 16
13.06.2013, 21:44  [ТС]
А, т. е., надо в StringGrid "прокручивать" элементы назад/вперёд?
Да,да, извиняюсь я плохо объясняю...
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
13.06.2013, 21:45
Обыкновенную очередь (не DEQ) можно "прокручивать" только в одном направлении: от конца - к началу.
1
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 16
13.06.2013, 21:46  [ТС]
Если разрешить прокручивать очередь в обоих направлениях - то это уже не очередь, а двунаправленная очередь - DEQ (Dual Ended Queue) называется.
Странно так-то сказано что 'Очередь на основе циклического массива.'

Добавлено через 32 секунды
Но требуют делать прокручивание туда сюда...
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
13.06.2013, 21:46
Предлагаю пока сделать прокрутку в одном направлении - как положено для обыкновенной очереди. Если переделать очередь в DEQ, то можно тогда в обоих направлениях "крутить".
1
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 16
13.06.2013, 21:48  [ТС]
Хорошо, тогда похоже задание немного некорректно сформировано!(
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
13.06.2013, 21:50
Цитата Сообщение от Hardcore_MD Посмотреть сообщение
Но требуют делать прокручивание туда сюда...
Тогда надо доделать очередь до уровня DEQ.
---
Hardcore_MD, если время терпит, предлагаю завтра продолжить (вечером). Я набросаю вариант, как это всё должно работать - выложу здесь в виде проекта.
1
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 16
13.06.2013, 21:52  [ТС]
Hardcore_MD, если время терпит, предлагаю завтра продолжить (вечером). Я набросаю вариант, как это всё должно работать - выложу здесь в виде проекта.
Если вам будет удобней так, то да я не против...пока надо и в этом разобраться...спасибо что помогаете.
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
13.06.2013, 21:55
Хорошо, договорились. Завтра продолжим.
1
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
14.06.2013, 22:48
Вот первый вариант. Реализация получилась сложной.
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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  
implementation
 
{$R *.dfm}
 
const
  //Величина приращения/уменьшения длины динамического массива.
  Capacity1 = 5;
  {Разность между длиной массива и количеством элементов, при которой
  принимается решение об уменьшении длины массива.}
  Capacity2 = Capacity1 * 2;
 
type
  //Основные данные элементов дека.
  TData = Integer;
  //Тип, описывающий очередь/дек.
  TDeq = record
    //Индекс конца дека. - Индекс последнего элемента в деке.
    IEnd : Integer;
    //Массив данных дека.
    Arr : array of TData;
  end;
 
var
  gDeq : TDeq;
 
//Очистка дека.
procedure Init(var aDeq : TDeq);
begin
  aDeq.IEnd := -1;
  SetLength(aDeq.Arr, 0);
end;
 
//Добавление элемента в начало дека.
procedure PushB(var aDeq : TDeq; const aData : TData);
var
  i : Integer;
begin
  {Если массив уже полностью заполнен, то для того, чтобы продолжить
  добавлять в него элементы мы должны увеличить размер массива.}
  if aDeq.IEnd = High(aDeq.Arr) then
    SetLength(aDeq.Arr, Length(aDeq.Arr) + Capacity1); //Или так: SetLength(aDeq.Arr, aDeq.IEnd + 1 + Capacity1);
  //Сдвигаем элементы с индексами 0..IEnd на позиции: 1..(IEnd+1).
  for i := aDeq.IEnd downto 0 do aDeq.Arr[i + 1] := aDeq.Arr[i];
  //Индекс последнего элемента становится на 1 больше.
  Inc(aDeq.IEnd);
  //Добавляем новый элемент в начало массива.
  aDeq.Arr[0] := aData;
end;
 
{Изъятие элемента из начала дека.
Если дек непустой, то из начала дека изымается элемент и фукнция
возвращает значение True. Иначе, если дек пуст, то операция отменяется
и функция возвращает значение False.}
function PopB(var aDeq : TDeq; var aData : TData) : Boolean;
var
  i : Integer;
begin
  Result := False;
  if aDeq.IEnd = -1 then Exit;
 
  //Берём первый элемент дека.
  aData := aDeq.Arr[0];
  //Сдвигаем элементы с индексами 1..IEnd на позиции: 0..(IEnd-1).
  for i := 0 to aDeq.IEnd - 1 do aDeq.Arr[i] := aDeq.Arr[i + 1];
  //Количество элементов теперь стало на 1 меньше.
  Dec(aDeq.IEnd);
  {Если количество элементов в массиве уменьшилось на столько, что разность
  между количеством элементов и длиной массива достигла велечины Capacity2,
  то уменьшаем размер динамического массива на величину Capacity1.}
  if High(aDeq.Arr) - aDeq.IEnd = Capacity2 then
    SetLength(aDeq.Arr, Length(aDeq.Arr) - Capacity1);
  Result := True;
end;
 
//Добавление элемента в конец дека.
procedure PushE(var aDeq : TDeq; const aData : TData);
begin
  {Если массив уже полностью заполнен, то для того, чтобы продолжить
  добавлять в него элементы мы должны увеличить размер массива.}
  if aDeq.IEnd = High(aDeq.Arr) then
    SetLength(aDeq.Arr, Length(aDeq.Arr) + Capacity1); //Или так: SetLength(aDeq.Arr, aDeq.IEnd + 1 + Capacity1);
  //Индекс последнего элемента становится на 1 больше.
  Inc(aDeq.IEnd);
  //Добавляем новый элемент в конец массива.
  aDeq.Arr[aDeq.IEnd] := aData;
end;
 
{Изъятие элемента из конца дека.
Если дек непустой, то из конца дека изымается элемент и фукнция
возвращает значение True. Иначе, если дек пуст, то операция отменяется
и функция возвращает значение False.}
function PopE(var aDeq : TDeq; var aData : TData) : Boolean;
begin
  Result := False;
  if aDeq.IEnd = -1 then Exit;
 
  //Берём последний элемент дека.
  aData := aDeq.Arr[aDeq.IEnd];
  //Количество элементов теперь стало на 1 меньше.
  Dec(aDeq.IEnd);
  {Если количество элементов в массиве уменьшилось на столько, что разность
  между количеством элементов и длиной массива достигла велечины Capacity2,
  то уменьшаем размер динамического массива на величину Capacity1.}
  if High(aDeq.Arr) - aDeq.IEnd = Capacity2 then
    SetLength(aDeq.Arr, Length(aDeq.Arr) - Capacity1);
  Result := True;
end;
 
//Запиь элементов дека в экземпляр типа TStringGrid.
procedure DeqToSg(const aDeq : TDeq; aSg : TStringGrid);
var
  i : Integer;
begin
  {Очистка таблицы и установка её размеров в соотвествии с количеством
  элементов в деке.}
  aSg.Rows[0].Clear;
  aSg.ColCount := aDeq.IEnd + 1;
  //Запись элементов дека в таблицу.
  for i := 0 to aDeq.IEnd do
    aSg.Cells[i, 0] := IntToStr(aDeq.Arr[i]);
end;
 
//Добавление элемента в начало дека.
procedure TForm1.Button1Click(Sender: TObject);
var
  S : String;
  Data : TData;
begin
  S := Edit1.Text;
  if not TryStrToInt(S, Data) then begin
    MessageBox(Handle, 'Элемент не задан или задан неверно. Действие отменено.'
      ,'Отмена!', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
 
  PushB(gDeq, Data);
  DeqToSg(gDeq, StringGrid1);
end;
 
//Добавление элемента в конец дека.
procedure TForm1.Button2Click(Sender: TObject);
var
  S : String;
  Data : TData;
begin
  S := Edit1.Text;
  if not TryStrToInt(S, Data) then begin
    MessageBox(Handle, 'Элемент не задан или задан неверно. Действие отменено.'
      ,'Отмена!', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
 
  PushE(gDeq, Data);
  DeqToSg(gDeq, StringGrid1);
end;
 
//Взять элемент из начала дека.
procedure TForm1.Button3Click(Sender: TObject);
var
  Data : TData;
begin
  if PopB(gDeq, Data) then begin
    Edit2.Text := IntToStr(Data);
    DeqToSg(gDeq, StringGrid1);
  end else begin
    Edit2.Text := '';
    MessageBox(Handle, 'Дек пуст!'
      ,'Внимание!', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
  end;
end;
 
//Взять элемент из конца дека.
procedure TForm1.Button4Click(Sender: TObject);
var
  Data : TData;
begin
  if PopE(gDeq, Data) then begin
    Edit2.Text := IntToStr(Data);
    DeqToSg(gDeq, StringGrid1);
  end else begin
    Edit2.Text := '';
    MessageBox(Handle, 'Дек пуст!'
      ,'Внимание!', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
  end;
end;
 
//Прокрутить вперёд.
procedure TForm1.Button5Click(Sender: TObject);
var
  S : String;
  Data : TData;
  Scr, Cnt, i : Integer;
begin
  S := Edit3.Text;
  if not TryStrToInt(S, Scr) then begin
    MessageBox(Handle, 'Значение не задано или задано неверно. Действие отменено.'
      ,'Отмена!', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
 
  //Количество элементов в деке.
  Cnt := gDeq.IEnd + 1;
  //Определяем количество позиций прокрутки с учётом цикличности по Cnt.
  if Cnt <> 0 then
    Scr := Scr mod Cnt
  else
    Scr := 0;
  if Scr >= 0 then begin
    for i := 1 to Abs(Scr) do
      if PopB(gDeq, Data) then PushE(gDeq, Data);
  end else
    for i := 1 to Abs(Scr) do
      if PopE(gDeq, Data) then PushB(gDeq, Data);
  DeqToSg(gDeq, StringGrid1);
end;
 
//Прокрутить назад.
procedure TForm1.Button6Click(Sender: TObject);
var
  S : String;
  Data : TData;
  Scr, Cnt, i : Integer;
begin
  S := Edit3.Text;
  if not TryStrToInt(S, Scr) then begin
    MessageBox(Handle, 'Значение не задано или задано неверно. Действие отменено.'
      ,'Отмена!', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
    Exit;
  end;
 
  //Количество элементов в деке.
  Cnt := gDeq.IEnd + 1;
  //Определяем количество позиций прокрутки с учётом цикличности по Cnt.
  if Cnt <> 0 then
    Scr := Scr mod Cnt
  else
    Scr := 0;
  if Scr >= 0 then begin
    for i := 1 to Abs(Scr) do
      if PopE(gDeq, Data) then PushB(gDeq, Data);
  end else
    for i := 1 to Abs(Scr) do
      if PopB(gDeq, Data) then PushE(gDeq, Data);
  DeqToSg(gDeq, StringGrid1);
end;
 
initialization
  //Начальная инициализация дека.
  Init(gDeq);
 
end.
Я сейчас напишу ещё один вариант - попроще.
Вложения
Тип файла: rar WorkWithDeq-01-(сложно).rar (191.5 Кб, 8 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.06.2013, 22:48
Помогаю со студенческими работами здесь

Отключены кнопки вперед - назад
Здравствуйте пользователи компов, помогите разобраться в дебрях &quot;Win 7 starter&quot;? дело в том что не работают кнопки назад и вперед, несмотря...

Отключены кнопки вперед - назад
Здравствуйте! Такая проблема: в панели инструментов кнопочки вперед - назад стали не активными, и теперь окна открываются каждое отдельно....

Пагинатор кнопки вперед назад
ребят как сделать в данном классе кнопки вперед и назад? &lt;?php /* * Класс для генерации постраничной навигации */ ...

Добавить кнопки для перелистывания вперед/назад
И опять в очередной раз прошу помощи. Есть каталог в интернет магазине и при подробном виде какого-то изображения с описанием нужно...

Кнопки вперед\назад для просмотра фотографий на Delphi 7
Здравствуйте уважаемые программисты и сисадмины!!! Не могу сообразить как сделать кнопки вперед\назад для просмотра фотографий в поле...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru