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

Очистка очереди

22.11.2016, 19:05. Показов 1303. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как с помощью Button5 очистить всю очередь?
Очередь.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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    Button4: TButton;
    Button5: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
type
  //Тип основных данных.
  TData = String;
  //Указатель на элемент списка (это элемент очереди).
  TPElem = ^TElem;
  //Элемент списка.
  TElem = record
    Data : TData; //Основные данные.
    PNext : TPElem; //Указатель на следующий элемент списка.
  end;
  //Очередь.
  TQueue = record
    PFirst, PLast : TPElem; //Указатели на первый и на последний элемент очереди.
  end;
 
//Инициализация очереди. Внимание! Эту процедуру можно выполнять только в том
//случае, если очередь пуста. Иначе, произойдут утечки памяти.
//Эту процедуру следует выполнять только для начальной инициализации очереди.
procedure QueueInit(var aQueue : TQueue);
begin
  aQueue.PFirst := nil;
  aQueue.PLast := nil;
end;
 
//Добавление элемента в конец очереди.
procedure QueuePush(var aQueue : TQueue; const aData : TData);
var
  PElem : TPElem;
begin
  New(PElem);
  PElem^.Data := aData;
  PElem^.PNext := nil;
  if aQueue.PFirst = nil then
    aQueue.PFirst := PElem
  else
    aQueue.PLast^.PNext := PElem
  ;
  aQueue.PLast := PElem;
end;
 
//Изъятие элемента из начала очереди.
//Если очередь не пуста, то из её начала изымается элемент и возвращается
//через параметр aData. В этом случае, функция возвращает значение True.
//Если очередь пуста, то операция отменяется, а функция возвращает значение False.
function QueuePop(var aQueue : TQueue; var aData : TData) : Boolean;
var
  PElem : TPElem;
begin
  Result := False;
  if aQueue.PFirst = nil then Exit;
 
  PElem := aQueue.PFirst;
  aData := PElem^.Data;
  aQueue.PFirst := PElem^.PNext;
  if aQueue.PFirst = nil then aQueue.PLast := nil;
  Dispose(PElem);
  Result := True;
end;
 
//Удаление очереди из памяти (очистка очереди).
procedure QueueFree(var aQueue : TQueue);
var
  Data : TData;
begin
  while QueuePop(aQueue, Data) do;
end;
 
//Распечатка очереди.
function QueueToStr(var aQueue : TQueue) : String;
var
  QTmp : TQueue;
  Data : TData;
begin
  if aQueue.PFirst = nil then begin
    Result := 'Очередь пуста.';
    Exit;
  end;
  Result := '';
 
  //Инициализация вспомогательной очереди.
  QueueInit(QTmp);
  //Переливаем элементы из исходной очереди во временную и при этом
  //выполняем распечатку.
  while QueuePop(aQueue, Data) do begin
    QueuePush(QTmp, Data);
    if Result <> '' then Result := Result + ', ';
    Result := Result + Data;
  end;
 
  aQueue := QTmp;
end;
 
var
  //Очередь.
  Q : TQueue;
 
//Обработчик события, которое возникает сразу после создания формы.
procedure TForm1.FormCreate(Sender: TObject);
begin
  //Начальная инициализация очереди.
  QueueInit(Q);
end;
 
//Обработчик события, которое возникает перед уничтожением формы.
procedure TForm1.FormDestroy(Sender: TObject);
begin
  //Удаление очереди из памяти.
  QueueFree(Q);
end;
 
//Добавление элемента в конец очереди.
procedure TForm1.Button1Click(Sender: TObject);
var
  S : String;
begin
  S := Edit1.Text;
  if S = '' then begin
    ShowMessage('Пустая строка не будет добавлена в очередь. Действие отменено.');
    Exit;
    Edit1.Text:='';
  end;
  QueuePush(Q, S);
  Memo1.Lines.Add('В конец очереди добавлен элемент: ' + S);
  Edit1.Clear;
end;
 
//Изъятие элемента из начала очереди.
procedure TForm1.Button2Click(Sender: TObject);
var
  S : String;
begin
  if QueuePop(Q, S) then
    Memo1.Lines.Add('Из начала очереди удалён элемент: ' + S)
  else
    ShowMessage('Очередь пуста. Действие отменено.');
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  Memo1.Lines.Add('Очередь (начало - конец):');
  Memo1.Lines.Add(QueueToStr(Q));
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
Close;
end;
 
procedure TForm1.Button5Click(Sender: TObject);
begin
 
end;
 
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.11.2016, 19:05
Ответы с готовыми решениями:

В первой очереди найти максимальный элемент и за ним вставить элементы второй очереди
задание:Создать две очереди из случайных целых чисел. В первой найти максимальный элемент и за ним...

Заменить по очереди три слова test по очереди тремя строками из переменной Arr.Text
Есть 3 строки в переменной Arr.Text (переменная типа TStringList) Есть 3 слова test в Memo1.Text ...

COM порт и очистка очереди
Почему, если я очищаю очередь COM-порта функцией PurgeComm(hPort, PURGE_TXCLEAR or PURGE_RXCLEAR)...

Очистка очереди печати
Ноутбук и принтер HP LaserJet Pro MFP M127-M128 PCLmS соединены локальной сетью. Все связанное с...

3
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
23.11.2016, 07:35 2
тут слегка перемешано ООП и процедурное программирование
Если у нас есть класс TQueue и процедуры QueuePush, QueueInit, QueuePop...
то в сумме это должно быть так
Delphi
1
2
3
4
5
6
7
8
9
10
TQueue=class
public
  First:TData;
  Last:TData;
  procedure Init;
  procedure Push(aData: TData);
  function Pop:TData;
  ...
  procedure Clear; // сейчас это QueueFree
end;
соответственно
Delphi
1
2
3
4
procedure TForm1.B5Click(..);
begin
  Q.clear;
end;
0
0 / 0 / 0
Регистрация: 21.11.2016
Сообщений: 5
23.11.2016, 18:15  [ТС] 3
Не особо разобрался где и что поправить мне нужно...
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
23.11.2016, 21:36 4
процесс всегда похож
в отдельном месте создаем модель данных и инструменты для работы с ней
новый юнит MyQueue:
Кликните здесь для просмотра всего текста
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
unit MyQueue;
 
interface
uses classes;
 
type
 
TData=class
public
  s:string;
  next:TData;
end;
 
TMyQueue=class
public
  First:TData;
  Last:TData;
  constructor Create;
  destructor Destroy; override;
  procedure Push(s:string);
  function Pop:TData;
  procedure Clear;
  function AsString:string;
  procedure Output(L:TStrings);
end;
 
 
implementation
 
 
{ TMyQueue }
 
function TMyQueue.AsString: string;
var
  t:TData;
begin
  result := '';
  t:=First;
  while T<>NIL do
  begin
    if result<>'' then
      result := result + ',';
    result := Result + t.s;
    t:=t.next;
  end;
end;
 
procedure TMyQueue.Clear;
var
  d:TData;
begin
  while First<>NIL do
  begin
    d:=Pop;
    if (d<>NIL) then
      d.Free;
  end;
end;
 
constructor TMyQueue.Create;
begin
  First:=nil;
  Last:=nil;
end;
 
destructor TMyQueue.Destroy;
begin
  Clear;
  inherited;
end;
 
procedure TMyQueue.Output(L: TStrings);
var d:TData;
begin
  d:=First;
  l.Clear;
  while d<>NIL do
  begin
    l.add(d.s);
    d:=d.next;
  end;
end;
 
function TMyQueue.Pop: TData;
var
  t:TData;
begin
  result := First;
  if First=nil then
    exit;
 
  if (First=Last) then
  begin
    first:=nil;
    last:=nil;
  end
  else
  begin
    First:=First.next;
  end;
end;
 
procedure TMyQueue.Push(s:string);
var
  d:TData;
begin
  d:=TData.Create;
  d.s:=s;
 
  if First=nil then
  begin
    First:=d;
    Last:=d;
  end
  else
  begin
    Last.next := d;
    last := d;
  end;
end;
 
end.

потом в модуле с формой делаем Uses MyQueue
и в классе формы заводим и инициализируем поле класса TMyQueue
а потом остается только по каждой кнопке выполнять действия с моделью данных

Кликните здесь для просмотра всего текста
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs, StdCtrls,
  MyQueue;
 
type
  TForm1 = class(TForm)
    m1: TMemo;
    e1: TEdit;
    bPush: TButton;
    bPop: TButton;
    bClear: TButton;
    bAsString: TButton;
    m2: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure bPushClick(Sender: TObject);
    procedure bPopClick(Sender: TObject);
    procedure bClearClick(Sender: TObject);
    procedure bAsStringClick(Sender: TObject);
  private
  public
    Q: TMyQueue;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.bAsStringClick(Sender: TObject);
begin
  m2.Lines.Text := q.AsString;
end;
 
procedure TForm1.bClearClick(Sender: TObject);
begin
  q.Clear;
  q.Output(m1.Lines);
end;
 
procedure TForm1.bPopClick(Sender: TObject);
var
  d:TData;
begin
  d:=q.Pop;
  if (d<>NIL) then
    d.Free;
  q.Output(m1.Lines);
end;
 
procedure TForm1.bPushClick(Sender: TObject);
begin
  if e1.Text<>'' then
    q.Push(e1.Text);
  q.Output(m1.Lines);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  q:=TMyQueue.Create;
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeAndNil(q);
end;
 
end.
Миниатюры
Очистка очереди  
0
23.11.2016, 21:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.11.2016, 21:36
Помогаю со студенческими работами здесь

Очистка очереди функций
Доброго времени суток. Реализован эффект анимированного появления блока при наведении на родителя....

Очистка динамической памяти очереди
Доброго времени суток! Я вот думаю-думаю, но докумекать не могу. Я пишу очередь (основываюсь на...

Очистка очереди событий в jquery
Этот код должен перемещать слайды назад, вперед. Когда нажимаешь много раз на кнопку, то события...

Очистка очереди печати принтера при ошибке
Всем доброе время суток! Столкнулся с проблемой зависания принтеров при ошибках. Притом эти...

"Очереди" - очистка памяти
Привет всем, у меня возникла такая проблема, есть функция которая делает выборку из очереди: ...

Очистка консоли, очистка строки, установка курсора
Здравствуйте! Подскажите как можно после очистки консоли поставить курсор в самый вверх, чтоб то...


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

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