Помощь - Поиск - Пользователи - Календарь
Полная версия: Программа с очередью
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
rs-mms
Код

program ochered;
uses crt;
type
  PtrNode=^Node;
  Node=record;
  Info: Integer;
  Next: PetrNode;
end;

procedure prn_q(G: PtrNode);
var
  t: PtrNode;
begin
  t: G;
  while t<>Nil do
  begin
    write(t^.Info:5);
    t:=t^.Next;
  end;
  writeln;
  end;

var
  Q,P: PtrNode;
  HQ,HP: PtrNode;
  Tek: PtrNode;
  n1, n2, i: Integer;
begin
  clrscr;
  Q:=Nil;
  HQ:=Nil;
  repeat
  write('vvedite kol-vo elementov v ocheredi Q: ');
  readln(n1);
  until n1>0;
  i:=0;
  while i<n1 do
  begin
    New(Tek);
    Tek^.Info:=random(100);
    Tek^.Next:=Nil;
    if Q=Nil then
    begin
      Q:=Tek;
      HQ:=Tek;
    end
else
begin
  HQ^.Next:=Tek;
  HQ:=Tek;
end;
i:=i+1;
end;
writeln('sozdana ochered Q: ');
prn_q(Q);

P:=Nil;
HP:=Nil;
repeat
write('vvedite kol-vo elementov v ocheredi P(ne menshe 4): ');
readln(n2);
until n2>=4;
i:=0;
while i<n2 do
begin
  New(Tek);
  Tek^.Info:=random(100);
  Tek^.Next:=Nil;
  if P=Nil then
  begin
    P:=Tek;
    HP:=Tek;
  end
  else
  begin
    HP^.Next:=Tek;
    HP:=Tek;
  end;
  i:=i+1;
  end;
  writeln(sozdana ochered P: ');
  prn_q(P);

for i:=1 to 3 do
begin
  Tek:=P;
  HQ^.Next:=Tek;
  HQ:=Tek;
  P:=P^.Next;
  HQ^.Next:=Nil;
end;
writeln('ochered P posle udalenia is nee 3 elementov: ');
prn_q(P);
writeln('ochered Q posle dobavlenia v nee 3 elementov: ');
prn_q(Q);
readln;
end.
Krjuger
Слушай,если чесно оно у тебя вообще компилируется?
Код
t: G;

особенно после begin'a в процедуре печати очереди,меня лично как то настараживает.А еще посмотри по сути у тебя идет создание очереди Q и P практически идентичны,я думаю лучше создать одну процедуру.И напиши,что именно тебе не понятно,потому что каждую строчку коментировать врятли кто будет.
rs-mms
Все работает! И препод видел, сказал, нормально, только мне нужно будет в пятницу объяснить как и что тут работает. Мне непонятно как работают указатели, программу писала по кусочкам, по образцам, поэтому и непонятно что и как.

Добавлено через 6 мин.
пишу, что как понимаю, исправьте, если не права
type
PtrNode=^Node;
Node=record;
Info: Integer;
Next: PetrNode;
end;
здесь Node это запись с двумя полями

procedure prn_q(G: PtrNode);
var
t: PtrNode;
begin
t: G;
while t<>Nil do
begin
write(t^.Info:5);
t:=t^.Next;
end;
writeln;
end;

процедура наверное выводит очередь на экран, а вот как она это делает...
дальше идет создание очереди одной, потом второй, вывод их на экран при помощи процедуры.
а как именно происходит создание очереди?
New - это новый элемент, с циклом тоже понятно, а вот что на что указывает - непонятно))
ну и последний кусок, который с цикла начинается, это наверное собственно добавление и удаление элементов, опять же как это происходит непонятно...
volvo
Цитата
Все работает!
Скриншот посмотреть, на котором будет видно, что программа откомпилировалась, и при этом видно четвертую или 12-ю строки исходника, можно? Потому что:
Нажмите для просмотра прикрепленного файла

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

procedure prn_q(G: PtrNode);
var
t: PtrNode;
begin
t: =G;{мне все таки кажется "=" долно быть,мож я и ошибаюсь}
while t<>Nil do{до тех пор пока ты не наткнешся на отсутствие кусочка ты делаеш следующее}
begin
write(t^.Info:5);{выводиш на экран текущий кусочек}
t:=t^.Next;{передвигается к следующему кусочку}
end;
writeln;
end;


Насчет того как ты очередь создаеш я не очень понимаю твой алфавит.

volvo,ну не реагирай ты так язвительно,тебя бояться будут))))
Кстати она скинула лиш кусок кода, поэтому и не компилируетя,весь код в первом посте,так что тут ты немного не прав.

З.Ы а забавная в твоем паскале подсветочка.
volvo
Для слепых - я скопировал код из первого поста целиком... Дальше флеймить будешь? Я бы поостерегся на твоем месте... И, это, я как-нибудь сам разберусь, как мне реагировать, язвительно или еще как...

(сообщение на автоудалении, ссылаться на него не надо...)
Krjuger
Я бы на твоем месте сделал бы как нить так.

type
TElem = Integer;
TList = ^Telement;
TElement = record{Volvo говорит что после рекорда ничего стоять не должно, и это действительно так,так что видно,что программа сдается скорее на листочке,чем компьютере}
INFO:TElem;
NEXT : TList
end;
TQueue = record
head:TList;
tail:TList;
end;
var
Q,P:Tlist;

Function QueueEmpty(Q:TQueue):boolean;{проверяет пуста ли наша очередь}
begin
QueueEmpty:=(Q.HEAD=nil)
end;

Procedure OueuePush(var q:TQueue;E:TElem);{добавляет элемент в очередь}
var temp:Tlist;
begin
new(temp);
temp^.info:=random(100);
temp^.next:=nil;
If QueueEmpty(q) then
q.head:=z
else
q.tail^.next:=z;

q.tail:=z
end;

Procedure CreateOueue(var q:TQueue;n:integer);{содаем всю очередь}
var i,e:integer;
begin
i:=0;
while i<=n do begin
e:=random(100);
OueuePush(q,e);
i:=i+1;
end;
end;
{тогда код твоей главное программы будет выглядеть так}

clrscr;
repeat
write('vvedite kol-vo elementov v ocheredi Q: ');
readln(n1);
until n1>0;
CreateOueue(Q,n1);
writeln('sozdana ochered Q: ');
prn_q(Q);
repeat
write('vvedite kol-vo elementov v ocheredi P(ne menshe 4): ');
readln(n2);
until n2>=4;
CreateOueue(P,n2);
.................
.................

кстати потом,когда ты будеш добавлять в очередь Q элементы ты можеш воспользоваться процедурой OueuePush,кстати,если что Volvo поправит,но я не помню надо ли обьявлять "е" глобально.


Volvo,извини,но посмотри на свой скрин,я лично по нему могу увидеть лиш ее третий пост,а что ниже скопировано,сори не вижу.Наверно я реально слепой......
rs-mms
Цитата(volvo @ 26.05.2009 16:55) *

Скриншот посмотреть, на котором будет видно, что программа откомпилировалась, и при этом видно четвертую или 12-ю строки исходника, можно? Потому что:
Нажмите для просмотра прикрепленного файла

Как программа, не прошедшая компиляцию, может выполняться - это на форум писателей фантастов... Здесь - программисты.


нуу...всего лишь не поставила второпях знак. конечно же он присутствует и все работает.

Добавлено через 2 мин.
так что видно,что программа сдается скорее на листочке,чем компьютере}

программа сдается в виде файла pas

Добавлено через 10 мин.
Вы конечно очень добры и терпеливы, спасибо за новый код, но, препод уже видел первоначальный вариант и исправлять не буду - это будет подозрительно непохоже на работу первокурсника, будет видно что работали профессионалы! Мне еще нужно блок-схему к этой очереди, я конечно понимаю, что сначала составляется алгоритм, а потом уже пишется код, но у меня вот так не получается. А блок-схему не могу составить, пока не пойму "как это работает"))

ну вот хотя бы про эти строчки(добавление и удаление элемента) - что на что указывает и в каком месте добавляется а в каком удаляется?

for i:=1 to 3 do
begin
Tek:=P;
HQ^.Next:=Tek;
HQ:=Tek;
P:=P^.Next;
HQ^.Next:=Nil;
end;
Krjuger
Ну как тебе сказать,я не профессионал и мне до него далеко,я такой же первокурсник,просто профиль прикладная математика и информатика smile.gif

for i:=1 to 3 do{тут цикл,ты же передать 3 элемента хочеш}
begin
Tek:=P;{записываеш эkемент второй очереди во временную переменную}
HQ^.Next:=Tek;
HQ:=Tek;
P:=P^.Next;{сдвигаешся к следующему элементу в очереди}
HQ^.Next:=Nil;{показываеш,что следующего элемента не существует,чтобы на следующем витке цикла написать в эту "ячейку"}
end;

Насчет HQ я не совсем уверен,это имеется в виду HeadQ?тобиш начало очереди?
amega
Цитата
Мне непонятно как работают указатели


при выполнение(запуске программы) память распределятся так: на код, локальние переменые, "куча" (динамическая память)
Нажмите для просмотра прикрепленного файла
дак вот допустим ми обявили переменную А типа масив о 1 до 5 типа интежер , при компиляции в то место де локальние переменные занеслась А (5*4 байт). Все прекрасно мы работаем с этим масивом но вдруг к нам нужно 6 значений, каждый раз не побижим к програмисту чобы менял диапазон масива, для этого используется динамическая память.
Указатель - это переменная которая содержит адрес ячейки памяти в динамической памяти.
дак вот когда мы делаем New() мы просим менеджер кучи чтоб он нашол нам место в "кучи" для хранения, нашолши место она записывает адрес где хранится инф.
Нажмите для просмотра прикрепленного файла
для того чтоб добратся до информации хранящийся мы используем ^

Цитата
- это будет подозрительно непохоже на работу первокурсника, будет видно что работали профессионалы!


а при чем здесь первый курс, я тож щс на первом курси и что мне теперь не делать тежолые задачи по томучто на первом курсе неповерят??

Цитата
"как это работает"

а как очередь в магазине работает, также и здесь только здесь переменные smile.gif
Krjuger
Цитата

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

чтоб ты вреш и не краснееш!!!!.В магазине, из начала удаляют а в хвост добавляют,а в очереди не так,это уже дек получается smile.gif
amega
Очередь - упорядоченный набор элеменотов, которые могут удалятся с одного ее конца ( начало очереди) и помещатся в другой конец (конец очереди). очередь обеспечивают диссциплину обслуживания "первый пришол первый ушол".
Krjuger
Ладно не понял ты шутки)))Разьяснять не буду,тупо получиться.В общем про очередь амега правильно говорит)))Только не в магазине.
amega
Цитата
Разьяснять не буду,тупо получиться.

ну а ты постарайся чтоб умно получилось
Lapp
Цитата(Krjuger @ 26.05.2009 23:21) *
чтоб ты вреш и не краснееш!!!!
Вот это ты называешь шуткой?
Я бы извинился на твоем месте..
Krjuger
А я извинился,в привате,потому что это уже флуд,который никак не относится к теме,хотя создатель топа явно уже забил на эту тему.........
rs-mms
ничего я не "забила"! еще пытаюсь разобраться до сих пор....
Krjuger
Господи....Короче береш листочек и ресуеш паровозик.В кадом вагоне сидит какая то информация(число ,буква,слово не важно),и у каждого вагончика есть ссылка на следующий вагончик.Суть очереди в чем,ты с начала твоего поезда можеш отсоединять вагоны и к концу поезда можеш присоединять ваготы.при это когда ты отсоединяеш вагон,ты разрываеш связ между отсоединяемым и следующим за ним,а когда добакляеш в конец,то ты добавляемому элементу должна показать,что бывший последний вагон стоит перед ним.Блин я уж хз как по другому обяснить.
rs-mms
Ладно, больше не пристаю. Про вагончики понятно, спасибо большое)) Теорию читала, принцип понятен. Я имела в виду, что непонятно в самом коде, путаница с переменными, которые показывают одна на другую. Вот говорите, что каждую строчку комментировать никто не будет, а вышло бы быстрее и мне понятнее. Ну уже ладно, все сдала, в пятницу расскажу уж про вагончики!
Krjuger
Да не в этом дело,просто конкретно обознач,за что отвечает каждая переменная.из того куска,что ты скидывала,я лиш 2 строчки не откоментировал.
rs-mms
Поздравляю господа! Вашими стараниями я получила пятерку!
Krjuger
Что вариант с паровозиком или очередь в магазине помогли?))))Делись пятеркой,она лишней не бывает.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.