Помощь - Поиск - Пользователи - Календарь
Полная версия: Очередь
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
setare
Здравствуйте! Не могли бы вы сказать как можно изменить строчку
newtail:=(Q.tail mod MaxN) + 1; в программе очереди с помощью массива? Пожалуйста, подскажите. В faqe у вас только очередь в дин памяти. Мне нужно, чтобы очередь заполнялась полностью, а не оставляла одно звено. Программа по работе с очередями-добавление и удаление. Сама программа:
Код

program ochered_mas;
const
 MaxN=100;
  type
   Telem=integer;
   Telements=array[1..MaxN]of Telem;
   TQueue=record
    Elements:Telements;
    Head:integer;
    Tail:integer
   end;
    procedure InitQueue(var Q:TQueue);
     begin
      Q.Head:=1;
      Q.tail:=1;
     end;
    procedure PushQ(var Q:Tqueue;E:Telem;var c:boolean);
    var
     newtail:integer;
      begin
       newtail:=(Q.tail mod MaxN) + 1;
      with Q do
       if newtail<>head then
        begin
         tail:=newtail;
         elements[tail]:=E;
         c:=true;
        end
       else
        c:=false;
      end;
    procedure popQ(var Q:tQueue;E:Telem;var c:boolean);
     begin
      if (Q.head<>Q.tail) then
       begin
        with Q do
         begin
          E:=Elements[head];
          head:=(Head mod MaxN)+1;
         end;
       end;
     end;
  var
   Q:Tqueue;
   number:integer;
   E:telem;
   c:boolean;
  begin
     InitQueue(Q);
      repeat
       writeln('1:Push');
       writeln('2:Pop');
       writeln('3:Exit');
       writeln('Vvedite luboy nomer.');
       readln(number);
        case number of
      1:
       begin
        writeln('Vvedite chislo dlya dobavleniya.');
        readln(E);
        pushQ(Q,E,c);
       end;
      2:
       begin
        writeln('Vvedite chislo dlya izvlecheniya.');
        readln(E);
        PopQ(Q,E,c);
        writeln('izvlechonnoye chislo= ',E);
       end;
      end;
     if (Q.head=Q.tail) then
      writeln('Ochered pusta');
    until number=3
  end.
volvo
setare, я бы переписал процедуры PushQ и PopQ вот так:
procedure PushQ(var Q: Tqueue;E: Telem;var c: boolean);
var
newtail:integer;
begin
newtail := (Q.tail mod MaxN) + 1;
with Q do begin
if newtail<>head then begin
elements[tail]:=E; c:=true
end
else c:=false
end;
q.tail:=newtail
end;

procedure popQ(var Q: tQueue;var E: Telem;var c:boolean);
begin
if (Q.head<>Q.tail) then begin
with Q do begin
E:=Elements[head];
head:=(Head mod MaxN)+1;
c := (head <> tail)
end;
end
else c := false;
end;

Так она полностью работоспособна...

Кстати, обрати внимание на то, что в процедуре PopQ перед E:Telem стоит Var, иначе как же ты собираешься возвращать значение из процедуры? blink.gif

Цитата
как можно изменить строчку
А вот эту строчку как раз менять не нужно. Зачем тебе лишний If в программе?
setare
Мне лишний иф как раз не нужен. Он нужен преподу. Спасиб за обьяснения! Следовательно изменить нельзя?
volvo
Ну почему же нельзя?
head:=(Head mod MaxN)+1;

полностью аналогично
if head < maxN then
head := head + 1
else head := 1;
setare
Спасибо! Вы мне очень помогли! И извините за беспокойство! Кстати, возвращаясь к спискам. Они все-таки не работают. Ни ваш модуль ни то, что я написала. sad.gif
volvo
Я не принимаю вот таких голословных утверждений. Если они "не работают", то они не будут в FAQ-е. А если Вы нашли ошибку, то предоставьте полный код, который не выдает правильный результат, потому что я могу написать десяток ссылок на те посты, где ВСЕ эти программы отработали и никаких проблем НЕ возникло.
buy hydroxychloroquine sulfate o
Faux Viagra Inde
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.