Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2013, 22:40   #1
Lizoveta
Пользователь
 
Регистрация: 22.06.2013
Сообщений: 44
По умолчанию Паскаль, очереди.

Добрый вечер. Подскажите, пожалуйста, почему компьютер выдаёт ошибку?
Программа должна проверять - выполняется ли для последовательности такое правило: если входную последовательность разделить на положительные и отрицательные числа (записанные в том же порядке), то эти последовательности будут совпадать (без учета знака, конечно).

Ещё кое-что..как сделать так, чтобы учитывалось в каком порядке числа? У меня нет разница - а она должна быть.
Помогите, пожалуйста. Почему не работает?
Код:
uses crt;     
type pqueue=^queue;                        {описание очередиi}
     queue=record
        hislo: integer;
        next: pqueue;
     end;
type pqueue2=^queue2;                     {описание 2 очереди}
     queue2=record
        hislo2: integer;
        next2: pqueue2;
     end;
var pbegin,pend: pqueue;
    pbegin2,pend2: pqueue2;
    i,x,k: integer;
    f: boolean;

procedure enqueue (chto:integer);     {добавление элемента в конец очередиi}
begin
     if pbegin=nil then
         begin
              new(pend);
              pbegin:=pend;
         end
     else
         begin
              new(pend^.next);
              pend:=pend^.next;
         end;
     pend^.hislo:=chto;
     pend^.next:=nil;
end;
procedure enqueue2 (chto:integer);     {добавление элемента в конец очереди 2}
begin
     if pbegin2=nil then
         begin
              new(pend2);
              pbegin2:=pend2;
         end
     else
         begin
              new(pend2^.next2);
              pend2:=pend2^.next2;
         end;
     pend2^.hislo2:=chto;
     pend2^.next2:=nil;
end;

function dequeue : integer;      {удаление элемента из начала очереди}
var p: pqueue;
begin
     p:=pbegin;
     dequeue:=p^.hislo;
     pbegin:=p^.next;
     dispose(p);
end;

function dequeue2 : integer;      {удаление элемента из начала очереди 2}
var p: pqueue2;
begin
     p:=pbegin2;
     dequeue2:=p^.hislo2;
     pbegin2:=p^.next2;
     dispose(p);
end;

begin                          {тело программыi}
clrscr;
pbegin:=nil;  pbegin2:=nil;
pend:=nil;  pend2:=nil;
k:=0;
f:=true;
       repeat
             read(x);
             k:=k+1;
             if x>0 then enqueue(x);            {положительные - в 1 очередь}
             if x<0 then enqueue2(x);           {отрицательные - во 2 очередь}
       until x=0;
       for i:=1 to k-1 do
           begin
                if sqr(dequeue)<>sqr(dequeue2) then f:=false;   {если квадраты  не совпали - то правило не выполняется..}
           end;
       if f then write('Posledovatelnosti sovpali')
       else write('Posledovatelnosti ne sovpali');


end.
Lizoveta вне форума Ответить с цитированием
Старый 04.08.2013, 23:01   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
чтобы учитывалось в каком порядке числа? У меня нет разница - а она должна быть.
Как это нет? Если под словом "Порядок" понимается местоположение чисел в последовательности то у тебя он учтен - числа в очереди поступают по мере их ввода, а не абы как, значит и извлекаются точно так же - первое введенное извлекается первым.
Единственное что я бы добавил:
Код:
       for i:=1 to k-1 do
           begin
                if sqr(dequeue)<>sqr(dequeue2) then f:=false;   {если квадраты  не совпали - то правило не выполняется..}
                if (pbegin=nil) or (pbegin2=nil) then break;
           end;
I'm learning to live...

Последний раз редактировалось Stilet; 04.08.2013 в 23:03.
Stilet вне форума Ответить с цитированием
Старый 04.08.2013, 23:26   #3
Lizoveta
Пользователь
 
Регистрация: 22.06.2013
Сообщений: 44
По умолчанию

Спасибо Большое!
Единственный нюанс..Компьютер почему-то какую бы последовательность я не ввела, всегда выдаёт, что "совпали".
А если я введу только положительные или только отрицательные числа - сразу выдаёт об ошибке.
Что с этим делать?
Lizoveta вне форума Ответить с цитированием
Старый 05.08.2013, 08:23   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Тогда так:
Код:
   f:=false;    while  (pbegin<>nil) and (pbegin2<>nil) do
           begin 
                if sqr(dequeue)=sqr(dequeue2) then begin f:=true; end
                else begin f:=false;  break; end
               
           end;

       if f then write('Posledovatelnosti sovpali')
       else write('Posledovatelnosti ne sovpali');
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.08.2013, 08:23   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Тогда так:
Код:
   f:=false;    i:=1; while (i<k) and (pbegin<>nil) and (pbegin2<>nil) do
           begin 
                if sqr(dequeue)=sqr(dequeue2) then begin f:=true; end
                else begin f:=false;  break; end
           end;

       if f then write('Posledovatelnosti sovpali')
       else write('Posledovatelnosti ne sovpali');
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.08.2013, 09:32   #6
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Так вроде работает, если правильно понял суть.
Код:
uses crt;
type pqueue=^queue;                        {îïèñàíèå î÷åðåäèi}
     queue=record
        hislo: integer;
        next: pqueue;
     end;
type pqueue2=^queue2;                     {îïèñàíèå 2 î÷åðåäè}
     queue2=record
        hislo2: integer;
        next2: pqueue2;
     end;
var pbegin,pend: pqueue;
    pbegin2,pend2: pqueue2;
    i,x,kp,ko: integer;
    f: boolean;

procedure enqueue (chto:integer);     {äîáàâëåíèå ýëåìåíòà â êîíåö î÷åðåäèi}
begin
     if pbegin=nil then
         begin
              new(pend);
              pbegin:=pend;
         end
     else
         begin
              new(pend^.next);
              pend:=pend^.next;
         end;
     pend^.hislo:=chto;
     pend^.next:=nil;
end;
procedure enqueue2 (chto:integer);     {äîáàâëåíèå ýëåìåíòà â êîíåö î÷åðåäè 2}
begin
     if pbegin2=nil then
         begin
              new(pend2);
              pbegin2:=pend2;
         end
     else
         begin
              new(pend2^.next2);
              pend2:=pend2^.next2;
         end;
     pend2^.hislo2:=chto;
     pend2^.next2:=nil;
end;

function dequeue : integer;      {óäàëåíèå ýëåìåíòà èç íà÷àëà î÷åðåäè}
var p: pqueue;
begin
     p:=pbegin;
     dequeue:=p^.hislo;
     pbegin:=p^.next;
     dispose(p);
end;

function dequeue2 : integer;      {óäàëåíèå ýëåìåíòà èç íà÷àëà î÷åðåäè 2}
var p: pqueue2;
begin
     p:=pbegin2;
     dequeue2:=p^.hislo2;
     pbegin2:=p^.next2;
     dispose(p);
end;

begin                          {òåëî ïðîãðàììûi}
clrscr;
pbegin:=nil;  pbegin2:=nil;
pend:=nil;  pend2:=nil;
kp:=0;ko:=0;
repeat
 read(x);
 if x>0 then
  begin
   kp:=kp+1;
   enqueue(x);            {ïîëîæèòåëüíûå - â 1 î÷åðåäü}
  end;
 if x<0 then
  begin
   ko:=ko+1;
   enqueue2(x);           {îòðèöàòåëüíûå - âî 2 î÷åðåäü}
  end;
until x=0;
if kp<>ko then f:=false //åñëè ïëîæèòåëüíûõ è îòðèöàòåëüíûõ íå ïîðîâíó
else  //ïîðîâíó
 begin
  f:=true;
  for i:=1 to kp do
   begin
    if (pbegin=nil) or (pbegin2=nil) or (sqr(dequeue)<>sqr(dequeue2)) then f:=false;   {åñëè êâàäðàòû  íå ñîâïàëè - òî ïðàâèëî íå âûïîëíÿåòñÿ..}
    if (pbegin=nil) or (pbegin2=nil) then break;
   end;
 end;
if f then write('Posledovatelnosti sovpali')
else write('Posledovatelnosti ne sovpali');
end.
puporev вне форума Ответить с цитированием
Старый 06.08.2013, 17:37   #7
Lizoveta
Пользователь
 
Регистрация: 22.06.2013
Сообщений: 44
По умолчанию

Спасибо Большое! Теперь всё правильно, всё работает
Lizoveta вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программа очереди с относительным приритетом(паскаль) vikeshek Помощь студентам 0 09.12.2012 05:26
С заданной целочисленной очереди организовать две: первая содержит все положительные элементы данной очереди, вторая - отрицательн wowan30002 Общие вопросы C/C++ 0 20.11.2012 17:39
Реализация выигрышной стратегии на Паскаль: В первом ящике 68 шаров, а во втором - 97. Игроки берут шары по очереди. Дим Паскаль, Turbo Pascal, PascalABC.NET 10 29.05.2012 15:00
Очереди Lucefer2007 Общие вопросы C/C++ 1 13.03.2011 16:58