IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Очередь, в статической памяти
setare
сообщение 20.04.2005 17:50
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 152
Пол: Женский

Репутация: -  0  +


Здравствуйте! Не могли бы вы сказать как можно изменить строчку
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.


--------------------
Ты спрашиваешь, как я переношу длинные бессонные ночи?Как свеча: как только настает утро, я гасну, тем самым, имея возможность заново загореться.

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 20.04.2005 19:07
Сообщение #2


Гость






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
сообщение 20.04.2005 19:23
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 152
Пол: Женский

Репутация: -  0  +


Мне лишний иф как раз не нужен. Он нужен преподу. Спасиб за обьяснения! Следовательно изменить нельзя?


--------------------
Ты спрашиваешь, как я переношу длинные бессонные ночи?Как свеча: как только настает утро, я гасну, тем самым, имея возможность заново загореться.

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 20.04.2005 19:41
Сообщение #4


Гость






Ну почему же нельзя?
head:=(Head mod MaxN)+1;

полностью аналогично
if head < maxN then
head := head + 1
else head := 1;
 К началу страницы 
+ Ответить 
setare
сообщение 20.04.2005 19:43
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 152
Пол: Женский

Репутация: -  0  +


Спасибо! Вы мне очень помогли! И извините за беспокойство! Кстати, возвращаясь к спискам. Они все-таки не работают. Ни ваш модуль ни то, что я написала. sad.gif


--------------------
Ты спрашиваешь, как я переношу длинные бессонные ночи?Как свеча: как только настает утро, я гасну, тем самым, имея возможность заново загореться.

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 20.04.2005 19:47
Сообщение #6


Гость






Я не принимаю вот таких голословных утверждений. Если они "не работают", то они не будут в FAQ-е. А если Вы нашли ошибку, то предоставьте полный код, который не выдает правильный результат, потому что я могу написать десяток ссылок на те посты, где ВСЕ эти программы отработали и никаких проблем НЕ возникло.
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 21.07.2025 11:04
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"