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

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

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

 
 Ответить  Открыть новую тему 
> Стек, рекрусивная фун-цию вывода нечёт чисел
Dunkel_L
сообщение 15.11.2005 13:02
Сообщение #1


Новичок
*

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

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


Нужна рекрусивная фун-ция вывода нечётных чисел в стеке
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 15.11.2005 13:06
Сообщение #2


Гость






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

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


Новичок
*

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

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


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


Гость






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


Новичок
*

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

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


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

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


Гость






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


Новичок
*

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

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


А нельзя ,когда проходишь по стеку и найдя нечётный элемент ,
создать новый указатель? И так каждый раз при нечётном элементе.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 15.11.2005 20:46
Сообщение #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);
...

а вот куда здесь рекурсию прицепить - я не знаю...
 К началу страницы 
+ Ответить 
Дож
сообщение 19.11.2005 16:43
Сообщение #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 
 К началу страницы 
+ Ответить 
Dunkel_L
сообщение 22.11.2005 7:03
Сообщение #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 - 22.11.2005 7:28
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 22.11.2005 10:41
Сообщение #11


Гость






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

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


Новичок
*

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

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


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


Гость






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

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

Тебе же объясняют, НЕ ПРЕДНАЗНАЧЕН для этого стек... Нет, ты опять за свое...
 К началу страницы 
+ Ответить 
volvo
сообщение 27.11.2005 20:31
Сообщение #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
сообщение 29.11.2005 14:07
Сообщение #15


Новичок
*

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

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


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

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

 



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