Добро пожаловать, гость
:: алгоритмы  и методы :: :: олимпиадные задачи :: :: связь :: :: о сайте :: :: форум ::

Форум работает в режиме архива, только для чтения и поиска.
Архив 2004 Архив 2007 Архив 2013

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.12.2010, 22:56
Новичок

Отправить личное сообщение для Artishok Посмотреть профиль Найти все сообщения от Artishok
 
Регистрация: 17.12.2010
Сообщений: 3

дек через массив
Код:
uses crt;
const razm=100;
var deck :record
mas:array[1..razm] of real;
tail,head:integer;
end;
key:integer;
el:real;

function isEmpty: boolean; 
begin
isEmpty:=deck.head=(deck.tail mod razm)+1
end;

procedure push_front(x:real); 
begin
if deck.head=(deck.tail+1) mod razm + 1 then
writeLn('deck is full')
else
begin
if deck.head=1 then
deck.head:=razm
else
deck.head:=deck.head-1;
deck.mas[deck.head]:=x;
end;
end;

procedure push_back(x:real); 
begin
if deck.head=(deck.tail+1) mod razm + 1 then
writeLn('deck is full')
else
begin
if deck.tail=razm then
deck.tail:=1
else
inc(deck.tail);
deck.mas[deck.tail]:=x
end
end;

procedure pop_front(var x:real); 
begin
if isEmpty then
writeLn('dec is empty')
else
begin
x:=deck.mas[deck.head];
if deck.head=razm then
deck.head:=1
else
inc(deck.head);
writeln('You have deleted ', x, '.');
end
end;

procedure pop_back(var x:real); 
begin
if isEmpty then
writeLn('dec is empty')
else
begin
x:=deck.mas[deck.tail];
if deck.tail=1 then
deck.tail:=razm
else
deck.tail:=deck.tail-1;
writeln('You have deleted ', x, '.');
end
end;

procedure show; 
var count:integer;
begin
count:=deck.head;
if not isEmpty then
repeat
write(deck.mas[count], ' ');
count:=(count mod razm) +1;
until count=deck.tail+1
else
writeln('deck is empty');
readkey;
end;

function find(x:real):integer; // Поиск элемента
var i, count: integer;
found: boolean;
begin
if isEmpty then
begin
writeLn('deck is empty');
result:=0
end
else
begin
found:=FALSE;
i:=deck.head;
count:=1;
while (i<>deck.tail) and not found do
if deck.mas[i]=x then
found:=TRUE
else
begin
inc(i);
inc(count);
if i>100 then
i:=1
end;
if deck.mas[deck.tail]=x then
found:=TRUE;
if found then
result:=count
else
result:=0
end
end;

begin
deck.head:=2;
deck.tail:=1;
while true do
begin
clrscr;
writeln('1-push_front');
writeln('2-pop_front');
writeln('3-push_back');
writeln('4-pop_back');
writeln('5-show');
writeln('6-search');
readln(key);
case key of
1: begin
clrscr;
writeln('enter element');
read(el);
push_front(el);
end;
2: begin
clrscr;
pop_front(el);
readLn
end;
3: begin
clrscr;
writeln('enter element');
read(el);
push_back(el);
end;
4: begin
clrscr;
pop_back(el);
readLn
end;
5: begin
clrscr;
show;
readln;
end;
6: begin
clrscr;
writeln('enter element');
readln(el);
el:=find(el);
if el=0 then
write('element doesn''t exist.')
else
write('element found on ', el, ' position.');
readLn
end;
end;

end;
end.
я задачу мучаю уже который месяц а она все равно при последовательности push_front->pop_back->push_front->show зацикливается.спасите!!

Последний раз редактировалось MBo, 18.12.2010 в 08:13.
  #2  
Старый 18.12.2010, 08:18
MBo MBo вне форума
Местный

Отправить личное сообщение для MBo Посмотреть профиль Найти все сообщения от MBo
 
Регистрация: 21.09.2006
Адрес: Новосибирск
Сообщений: 1,374

Вставил тег кода, но читаемость от этого особо не повысилась.
Форматируй код с отступами.

>deck.head:=2;
>deck.tail:=1;
Почему такая странная инициализация? В остальное не всматривался.
  #3  
Старый 18.12.2010, 12:25
Пользователь

Отправить личное сообщение для lordKelvin Посмотреть профиль Найти все сообщения от lordKelvin
 
Регистрация: 25.01.2010
Сообщений: 51

Код:
uses crt;
const razm = 100;
var
    deck : record
        mas : array[ 1 .. razm ] of real;
        tail, head : integer;
    end;
    key : integer;
    el : real;

function isEmpty : boolean;
begin
    isEmpty := deck.head = ( deck.tail mod razm ) + 1
end;

procedure push_front( x : real );
begin
    if deck.head = ( deck.tail + 1 ) mod razm + 1 then
        writeLn( 'deck is full' )
    else
    begin
        if deck.head = 1 then
            deck.head := razm
        else deck.head := deck.head - 1;
        deck.mas[ deck.head ] := x;
    end;
end;

procedure push_back( x : real );
begin
    if deck.head = ( deck.tail + 1 ) mod razm + 1 then
        writeLn( 'deck is full' )
    else
    begin
        if deck.tail = razm then
            deck.tail := 1
        else inc( deck.tail );
        deck.mas[ deck.tail ] := x
    end
end;

procedure pop_front( var x : real );
begin
    if isEmpty then
        writeLn( 'dec is empty' )
    else
    begin
        x := deck.mas[ deck.head ];
        if deck.head = razm then
            deck.head := 1
        else inc( deck.head );
        writeln( 'You have deleted ', x, '.' );
    end
end;

procedure pop_back( var x : real );
begin
    if isEmpty then
        writeLn( 'dec is empty' )
    else
    begin
        x := deck.mas[ deck.tail ];
        if deck.tail = 1 then
            deck.tail := razm
        else deck.tail := deck.tail - 1;
        writeln( 'You have deleted ', x, '.' );
    end
end;

procedure show;
var count : integer;
begin
    count := deck.head;
    if not isEmpty then
        repeat
            write( deck.mas[ count ], ' ' );
            count := ( count mod razm ) + 1;
        until count = deck.tail + 1
    else writeln( 'deck is empty' );
    readkey;
end;

function find( x : real ) : integer; // Поиск элемента
var
    i, count : integer;
    found : boolean;
begin
    if isEmpty then
    begin
        writeLn( 'deck is empty' );
        result := 0
    end
    else
    begin
        found := false;
        i := deck.head;
        count := 1;
        while ( i <> deck.tail ) and not found do
            if deck.mas[ i ] = x then
                found := true
            else
            begin
                inc( i );
                inc( count );
                if i > 100 then
                i := 1
            end;
        if deck.mas[ deck.tail ] = x then
            found := true;
        if found then
            result := count
        else result := 0
    end
end;

begin
    deck.head := 2;
    deck.tail := 1;
    while true do
    begin
        clrscr;
        writeln( '1-push_front' );
        writeln( '2-pop_front' );
        writeln( '3-push_back' );
        writeln( '4-pop_back' );
        writeln( '5-show' );
        writeln( '6-search' );
        readln( key );
        case key of
            1 :
            begin
                clrscr;
                writeln( 'enter element' );
                read( el );
                push_front( el );
            end;
            2 :
            begin
                clrscr;
                pop_front( el );
                readLn
            end;
            3 :
            begin
                clrscr;
                writeln( 'enter element' );
                read( el );
                push_back( el );
            end;
            4 :
            begin
                clrscr;
                pop_back( el );
                readLn
            end;
            5 :
            begin
                clrscr;
                show;
                readln;
            end;
            6 :
            begin
                clrscr;
                writeln( 'enter element' );
                readln( el );
                el := find( el );
                if el = 0 then
                    write( 'element doesn''t exist.' )
                else write( 'element found on ', el, ' position.' );
                readLn
            end;
        end;
    end;
end.

Последний раз редактировалось lordKelvin, 18.12.2010 в 12:58.
  #4  
Старый 18.12.2010, 14:52
Новичок

Отправить личное сообщение для Artishok Посмотреть профиль Найти все сообщения от Artishok
 
Регистрация: 17.12.2010
Сообщений: 3

Сообщение от MBo Посмотреть сообщение
Вставил тег кода, но читаемость от этого особо не повысилась.
Форматируй код с отступами.

>deck.head:=2;
>deck.tail:=1;
Почему такая странная инициализация? В остальное не всматривался.
потому что указатель на голову должен быть больше 1 т.к. при добавлении в начало он смещается на 1 вперед а позицию назад а 0 позиции нет.

но почему все-таки зацикливается?
и ещё если несколько раз подряд извлечь с конца то зацикливается.получается что голова становится так что условие выхода из цикла при выводе не выполняется?

Последний раз редактировалось Artishok, 18.12.2010 в 14:54.
  #5  
Старый 18.12.2010, 15:04
MBo MBo вне форума
Местный

Отправить личное сообщение для MBo Посмотреть профиль Найти все сообщения от MBo
 
Регистрация: 21.09.2006
Адрес: Новосибирск
Сообщений: 1,374

>при добавлении в начало он смещается на 1 вперед а позицию назад а 0 позиции нет.
Но в push_front это ведь не пугает?

Рекомендую перейти на нумерацию массива с нуля, упростятся операции с модулем - не понадобится с доп. единицей возиться.
Например, код
if deck.tail=razm then
deck.tail:=1
else
inc(deck.tail);
будет проще:
deck.tail := (deck.tail + 1) mod razm;

Потом отладить все операции на бумаге в клеточку.
  #6  
Старый 18.12.2010, 17:05
Новичок

Отправить личное сообщение для Artishok Посмотреть профиль Найти все сообщения от Artishok
 
Регистрация: 17.12.2010
Сообщений: 3

в том то и дело что я не знаю как от шибки избавиться.я знаю как работает дек но суть в том при выводе от deck.head->Deck.tail.а когда deck.tail становится больше это невозможно.если бы вывода не было то все норм
 


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив гость Реализация, исходники, языки 0 10.03.2010 21:55
массив класов гость Реализация, исходники, языки 6 20.03.2009 10:44
Массив Белла Вычислительная геометрия 1 19.02.2008 09:03
Массив Белла Математические алгоритмы (другое) 3 09.02.2008 22:25