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

Работа с очередью

23.12.2011, 10:41. Показов 2399. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дана очередь действительных чисел. Выведите на печать в начале все числа, меньшие заданного а, затем - все числа из отрезка [а, b], и, наконец, — все остальные числа, сохраняя исходный взаимный порядок в каждой из этих трёх групп чисел.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2011, 10:41
Ответы с готовыми решениями:

Работа с очередью в Delphi
Написал программу на паскале, а препод требует ещё написать на delphi. Нужно уже сдавать, а я не...

Проблемы с очередью
Добрый день уважаемые формучане. У меня возникли проблемы с решением классической задаче о...

Задача со Стеком и Очередью
Доброго времени суток, прошу помочь в решении задачи, ума не приложу как решать её. = (( Дана...

Выполнение действий с очередью
Заполнить очередь 9 случайными вещественными элементами из промежутка . Найти произведение целых...

4
7 / 7 / 2
Регистрация: 17.10.2009
Сообщений: 325
23.12.2011, 12:27 2
Pascal
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
program Ochered_1;
var
  i, j, N, a, b, p: integer;
  Ochered: array of integer;
 
begin
  randomize;
  writeln('Vvedite dlinu ocheredi');
  readln(N);
  SetLength(Ochered, N);
  for i := 0 to N - 1 do
  begin
    Ochered[i] := random(100) + 1;
    write(Ochered[i], ' ');
  end;
  writeln;
  writeln;
  writeln('Vvedite Chislo dlia poiska');
  readln(p);
  writeln;
  writeln('Chisla ocheredi, menshie ', p);
  for i := 0 to N - 1 do
    if Ochered[i] < p then
      write(Ochered[i], ' ');
  writeln;
  writeln;
  Writeln('Vvedite granici otrezka - chisla A & B');
  read(A, B);
  writeln;
  writeln('Chisla iz otrezka [', A, ', ', B, ']');
  for i := 0 to N - 1 do
    if (Ochered[i] >= A) and (Ochered[i] <= B) then
      write(Ochered[i], ' ');
  writeln;
  writeln;
  writeln('Ostavshiesia chisla');
  for i := 0 to N - 1 do
    if (Ochered[i] >= p) and (Ochered[i] < A) or (Ochered[i] > B) then
      write(Ochered[i], ' ');
  readln;
  readln;
end.
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
23.12.2011, 14:57 3
fredwriter, решение задачи в таком виде ничем не отличается от решения задачи с формулировкой о массиве: "Дан массив действительных чисел...".
На массиве должна быть построена очередь. И в программе работа должна идти с реализацией очереди.
0
0 / 0 / 0
Регистрация: 04.12.2011
Сообщений: 16
26.12.2011, 08:41  [ТС] 4
Цитата Сообщение от Mawrat Посмотреть сообщение
fredwriter, решение задачи в таком виде ничем не отличается от решения задачи с формулировкой о массиве: "Дан массив действительных чисел...".
На массиве должна быть построена очередь. И в программе работа должна идти с реализацией очереди.
вот в том то и дело что это не как реализовать не получается
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
26.12.2011, 20:45 5
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

Здесь можно по разному решать. Я сделал так - имеем исходную очередь и 3 дополнительные очереди. В эти 3 дополнительные очереди переливаем элементы из исходной очереди согласно трём условиям. А потом выполняем распечатку трёх сформированных очередей.
Но можно и по-другому делать. Например можно иметь 2 очереди и выполнять распечатку во время переливания элементов между этими очередями. Если в конце программы не требуется сохранять элементы очередей, то можно вообще одну очередь только использовать. - Извлекать из неё элементы, одновременно готовить распечатки по трём условиям и тут же извлечённые элементы удалять из памяти.
В решении используются несколько очередей для того, чтобы продемонстрировать технику переливания между очередями.
Все действия включены в обработчик события OnClick для кнопки.
Очередь построена на однонаправленном динамическом списке.
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
type
  //Указатель на элемент очереди.
  TPElem = ^TElem;
  //Элемент очереди.
  TElem = record
    Data : Integer;
    PNext : TPElem;
  end;
  //Очередь.
  TQueue = record
    PFirst, PLast : TPElem;
  end;
 
//Добавление элемента в конец очереди.
procedure QueuePush(var aQueue : TQueue; var aPElem : TPElem);
begin
  if aPElem = nil then Exit;
 
  aPElem^.PNext := nil;
  if aQueue.PFirst = nil then
    aQueue.PFirst := aPElem
  else
    aQueue.PLast^.PNext := aPElem
  ;
  aQueue.PLast := aPElem;
end;
 
//Изъятие элемента из начала очереди.
function QueuePop(var aQueue : TQueue; var aPElem : TPElem) : Boolean;
begin
  Result := False;
  if aQueue.PFirst = nil then Exit;
 
  aPElem := aQueue.PFirst;
  aQueue.PFirst := aPElem^.PNext;
  if aQueue.PFirst = nil then aQueue.PLast := nil;
  Result := True;
end;
 
//Удаление очереди из памяти (очистка очереди).
procedure QueueFree(var aQueue : TQueue);
var
  PDel : TPElem;
begin
  while QueuePop(aQueue, PDel) do Dispose(PDel);
end;
 
//Распечатка очереди.
function QueueText(var aQueue : TQueue) : String;
var
  QTmp : TQueue;
  PElem : TPElem;
  i : Integer;
begin
  Result := '';
  QTmp.PFirst := nil;
  QTmp.PLast := nil;
  //Переливаем элементы из исходной очереди во временную и при этом
  //выполняем распечатку.
  i := 0;
  while QueuePop(aQueue, PElem) do begin
    QueuePush(QTmp, PElem);
    //Распечатка.
    Inc(i);
    if i > 1 then Result := Result + ', ';
    //Индекс:Значение.
    Result := Result + IntToStr(i) + ':' + IntToStr(PElem^.Data);
  end;
  //Возвращаем элементы в исходную очередь.
  while QueuePop(QTmp, PElem) do QueuePush(aQueue, PElem);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  Q1, Q2, Q3, Q4 : TQueue;
  PElem : TPElem;
  i, Cnt, Num, A, B : Integer;
begin
  //Начальная инициализация очередей.
  Q1.PFirst := nil;
  Q1.PLast := nil;
  Q2.PFirst := nil;
  Q2.PLast := nil;
  Q3.PFirst := nil;
  Q3.PLast := nil;
  Q4.PFirst := nil;
  Q4.PLast := nil;
 
  //Количество элементов в исходной очереди.
  Cnt := StrToInt(Edit1.Text);
  //Наполняем исходную очередь.
  for i := 1 to Cnt do begin;
    New(PElem);
    PElem^.Data := i;
    QueuePush(Q1, PElem);
  end;
  //Распечатка исходной очереди.
  Memo1.Lines.Add('--------------------------------------------------');
  Memo1.Lines.Add('Сформирована очередь: ');
  Memo1.Lines.Add(QueueText(Q1));
 
  //Первое условие.
  Num := StrToInt(Edit2.Text);
  Memo1.Lines.Add(
    'Первое условие - распечатать все элементы, меньшие заданного: '
    + Edit2.Text
  );
  //Второе условие.
  A := StrToInt(Edit3.Text);
  B := StrToInt(Edit4.Text);
  Memo1.Lines.Add(
    'Второе условие - распечатать все элементы, попавшие в дипазан: ['
    + Edit3.Text + ', ' + Edit4.Text + '].'
  );
  Memo1.Lines.Add('Треть условие - распечатать все остальные элементы.');
 
  //Решение задачи.
 
  //Действовать будем так. Будем переливать значения из первой очереди - во вторую,
  //третью и четвёртую - согласно трём условиям.
  while QueuePop(Q1, PElem) do begin
    if PElem^.Data < Num then
      QueuePush(Q2, PElem)
    else if (PElem^.Data >= A) and (PElem^.Data <= B) then
      QueuePush(Q3, PElem)
    else
      QueuePush(Q4, PElem)
    ;
  end;
 
  //Распечатка результатов.
  Memo1.Lines.Add('Элементы, удовлетворяющие первому условию:');
  Memo1.Lines.Add(QueueText(Q2));
  Memo1.Lines.Add('Элементы, удовлетворяющие второму условию:');
  Memo1.Lines.Add(QueueText(Q3));
  Memo1.Lines.Add('Элементы, удовлетворяющие третьему условию:');
  Memo1.Lines.Add(QueueText(Q4));
 
  //Удаление очередей из памяти.
  QueueFree(Q1);
  QueueFree(Q2);
  QueueFree(Q3);
  QueueFree(Q4);
end;
Вложения
Тип файла: rar WorkWithQueue.rar (168.9 Кб, 18 просмотров)
0
26.12.2011, 20:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.12.2011, 20:45
Помогаю со студенческими работами здесь

Как сделать СМО с очередью?С отказами есть
var Form1: TForm1; NN,N,i,Nw:integer; t1,t2,w1,w2,dt,dw,t,Wn,Tw,Wotk,K:real; ...

Работа с очередью
Пишет: Ожидается &quot;.&quot; в 33 строке, где 2 end подряд Program Alex; uses crt; type...

Работа с очередью
Добавить элементы очереди OCHER1 к элементам очереди OCHER2, создав очередь OCHER3. Помогите...

работа с очередью
Нужно создать динамическую структуру очередь и найти определённое условие, мне вот выдаёт ошибку в...


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

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