![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
Dunkel_L |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: ![]() ![]() ![]() |
Нужна рекрусивная фун-ция вывода нечётных чисел в стеке
|
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
To: Dunkel_L
Уточни, что именно тебе надо? Удалять из стека ВСЕ числа и распечатывать только нечетные, или ты хочешь оставить стек как он есть, но пройти по нему и напечатать все нечетные числа? (скажу сразу, для этого стек НЕ предназначен, у стека есть только 2 операции: Push(положить в стек) и Pop(изъять из стека), никаких просмотров быть не может.) + к этому, сам стек у тебя реализован? |
Dunkel_L |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: ![]() ![]() ![]() |
Да, сам стек реализован.
Мне нужно пройти по нему и напечатать все нечетные числа. Если в стеки это нельза, то в очереди можно ![]() Тогда помогите в очередь написать фун-цию.(очередь так же реализована) |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
To: Dunkel_L
Мне не хотелось бы тебя огорчать, но это и в очереди не реализуется (Очереди и стек - фактически одно и то же, только у стека и запись и чтение происходят с одной стороны, а у очереди - с разных, но НИ там, НИ здесь нет функции доступа к отдельным элементам)... Из всех динамических структур данных это возможно только в списках. Сейчас подумаю, куда тут рекурсию за уши притянуть (ибо она в таком задании не нужна совершенно...) |
Dunkel_L |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: ![]() ![]() ![]() |
Нам задали, цитирую:
Написать рекурсивную процедуру, печатающую нечетные по порядку элементы. Вот так! Может нужно пройтись по шагам по стеку ,выбирая нечётные числа? Сообщение отредактировано: Dunkel_L - |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
To: Dunkel_L
Ну пойми, ты не можешь ВЫБИРАТЬ четные или нечетные элементы из стека. Ты обязан это делать со всеми подряд. Обойму пистолета видел? Ты можешь извлечь 3, 5 и 7 патрон, не трогая остальных? |
Dunkel_L |
![]()
Сообщение
#7
|
Новичок ![]() Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: ![]() ![]() ![]() |
А нельзя ,когда проходишь по стеку и найдя нечётный элемент ,
создать новый указатель? И так каждый раз при нечётном элементе. |
volvo |
![]()
Сообщение
#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 Пол: Мужской Репутация: ![]() ![]() ![]() |
Код 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: |
Dunkel_L |
![]()
Сообщение
#10
|
Новичок ![]() Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: ![]() ![]() ![]() |
Это всё хорошо, но куда этот код всавить.Теперь с этим помогите(Нужно вывод нечётных чисел забить под клавишу 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 - |
volvo |
![]()
Сообщение
#11
|
Гость ![]() |
Dunkel_L, ты сначала процедуру menu перепиши как положено (без рекурсии), а потом будешь думать, как добавлять что-то в программу...
Твоя программа вылетит с сообщением Stack Overflow, если ты будешь добавлять/удалять/распечатывать данные достаточно много раз... У тебя Menu вызывает Menu, которая в свою очередь вызывает Menu, ... |
Dunkel_L |
![]()
Сообщение
#12
|
Новичок ![]() Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: ![]() ![]() ![]() |
Показал преподу лабу.Всё хорошо работает, НО это не через рекурсию.
![]() Мне нужно не создовать новый список, а нужно с одним единственным, через рекурсию. |
volvo |
![]()
Сообщение
#13
|
Гость ![]() |
Цитата нужно с одним единственным, через рекурсию Ну, когда научишься из обоймы вытаскивать 3, 5, 7 патроны, НЕ держа остальные в руках, и НЕ ставя их на стол, и в то же время НЕ теряя их, приходи, поделись алгоритмом... Тебе же объясняют, НЕ ПРЕДНАЗНАЧЕН для этого стек... Нет, ты опять за свое... |
volvo |
![]()
Сообщение
#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 указывает туда же, куда и указывал ДО нее... Но все нечетные элементы уже распечатаны... |
Dunkel_L |
![]()
Сообщение
#15
|
Новичок ![]() Группа: Пользователи Сообщений: 25 Пол: Мужской Репутация: ![]() ![]() ![]() |
БОЛЬШОЕ СПАСИБО Все нормально, СДАЛ!!! Ура!!!
|
![]() ![]() |
![]() |
Текстовая версия | 22.04.2025 19:29 |