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

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

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

> Стек, рекрусивная фун-цию вывода нечёт чисел
сообщение
Сообщение #1


Новичок
*

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

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


Нужна рекрусивная фун-ция вывода нечётных чисел в стеке
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 14)
сообщение
Сообщение #2


Гость






To: Dunkel_L
Уточни, что именно тебе надо? Удалять из стека ВСЕ числа и распечатывать только нечетные, или ты хочешь оставить стек как он есть, но пройти по нему и напечатать все нечетные числа?
(скажу сразу, для этого стек НЕ предназначен, у стека есть только 2 операции: Push(положить в стек) и Pop(изъять из стека), никаких просмотров быть не может.)

+ к этому, сам стек у тебя реализован?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

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

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


Да, сам стек реализован.
Мне нужно пройти по нему и напечатать все нечетные числа.
Если в стеки это нельза, то в очереди можно nea.gif
Тогда помогите в очередь написать фун-цию.(очередь так же реализована)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






To: Dunkel_L
Мне не хотелось бы тебя огорчать, но это и в очереди не реализуется (Очереди и стек - фактически одно и то же, только у стека и запись и чтение происходят с одной стороны, а у очереди - с разных, но НИ там, НИ здесь нет функции доступа к отдельным элементам)... Из всех динамических структур данных это возможно только в списках. Сейчас подумаю, куда тут рекурсию за уши притянуть (ибо она в таком задании не нужна совершенно...)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

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

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


Нам задали, цитирую:
Написать рекурсивную процедуру, печатающую нечетные по порядку элементы.
Вот так!
Может нужно пройтись по шагам по стеку ,выбирая нечётные числа?

Сообщение отредактировано: Dunkel_L -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






To: Dunkel_L
Ну пойми, ты не можешь ВЫБИРАТЬ четные или нечетные элементы из стека. Ты обязан это делать со всеми подряд. Обойму пистолета видел? Ты можешь извлечь 3, 5 и 7 патрон, не трогая остальных?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

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

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


А нельзя ,когда проходишь по стеку и найдя нечётный элемент ,
создать новый указатель? И так каждый раз при нечётном элементе.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Тогда так (используй 2 стека):
stack_1, stack_2: TStack;
...
while not stack_1.empty do begin
if odd(stack_1.top) then writeln(stack_1.top);
stack_2.push(stack_1.pop);
end;

while not stack_2.empty do
stack_1.push(stack_2.pop);
...

а вот куда здесь рекурсию прицепить - я не знаю...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Бывалый
***

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

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


Код

Procedure oddNumber(var stack_1, stack_2: TStack);
begin
If not(stack_1.empty) then begin
 if odd(stack_1.top) then writeln(stack_1.top);
   stack_2.push(stack_1.pop);
   oddNumber(stack_1, stack_2); {Рекурсия!}
   stack_1.push(stack_2.pop);
 end;
end;

Протестировал, вроде бы работает...


--------------------
Доброго времени суток.
:nnn:
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

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

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


Это всё хорошо, но куда этот код всавить.Теперь с этим помогите(Нужно вывод нечётных чисел забить под клавишу 4).За ранее СПАСИБО.

Вот и сам код


program laba4;
Uses CRT;
type ptr=^node;
node=record
info:integer;
link:ptr;
end;
var
top,q:ptr;
a,b,c,d,s:word;
procedure Push(n:integer);
var
p:ptr;
begin
new(p);
p^.info:=n;
p^.link:=top;
top:=p;


end;

function Pop:integer;
var
l:ptr;

begin
if top <> nil then


begin
l:=top^.link;
Pop:=top^.info;
dispose (top);
top:=l;
end
else begin
Writeln(' !Ошибка:Стэк пуст');
pop:=0;
end;
end;


procedure menu;
var n:integer;
begin
write(' Введите команду и нажмите ВВОД: ');
read(a);

if a=1 then
begin
write(' Введите число: ');
readln(b);
Push(b);
menu;
end
else
if a=2 then
begin
Writeln;
Write(Pop);
writeln(' удалено из стека');
menu;
end
else

if a=3 then
begin
Write(' Стэк:');
q:=top;
while q<>nil do
begin
write(q^.info,' ');
q:=q^.link;

end;
Writeln;
menu;
end

else
if a>=6 then
Begin
Writeln;
Writeln(' Ввод не коректен ');
Writeln(' Введите команду ещё раз (от 1 до 5)');
Writeln;
menu;
end;
end;
begin
clrscr;
writeln(' 1-Ввод числа стека');
writeln(' 2-Удаление числа из стека');
writeln(' 3-Вывод стека на экран');
writeln(' 4-Вывод нечётных чисел стека на экран');
writeln(' 5-Выход из программы');
menu;
end.


Сообщение отредактировано: Altair -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Dunkel_L, ты сначала процедуру menu перепиши как положено (без рекурсии), а потом будешь думать, как добавлять что-то в программу...

Твоя программа вылетит с сообщением Stack Overflow, если ты будешь добавлять/удалять/распечатывать данные достаточно много раз... У тебя Menu вызывает Menu, которая в свою очередь вызывает Menu, ...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Новичок
*

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

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


Показал преподу лабу.Всё хорошо работает, НО это не через рекурсию. no1.gif
Мне нужно не создовать новый список, а нужно с одним единственным, через рекурсию.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Цитата
нужно с одним единственным, через рекурсию

Ну, когда научишься из обоймы вытаскивать 3, 5, 7 патроны, НЕ держа остальные в руках, и НЕ ставя их на стол, и в то же время НЕ теряя их, приходи, поделись алгоритмом...

Тебе же объясняют, НЕ ПРЕДНАЗНАЧЕН для этого стек... Нет, ты опять за свое...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






А вот обмануть компилятор можно:
procedure Odds(const p: ptr);
begin
if p = nil then exit;
if odd(p^.info) then writeln('next odd = ', p^.info);
odds(p^.link); { Рекурсия !!! }
end;

После окончания работы этой процедуры top указывает туда же, куда и указывал ДО нее... Но все нечетные элементы уже распечатаны...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Новичок
*

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

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


БОЛЬШОЕ СПАСИБО Все нормально, СДАЛ!!! Ура!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 28.05.2024 16:59
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name