Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Детская считалочка

Автор: TOPEHTO 18.11.2006 4:06

Привет народ! тут вот такая задачка:
должна быть реализованная с помощью двунаправленного списка...пользователь вводит последовательность чисел("номер ребенка в круге") и число (размер считалочки) и начиная с того числа которое он ввел, по часововй стрелочки идет отсчет, то число, на котором останавливает счет-запоминается и удаляется из последовательности и счет продолжается...
вообщем пример: если вводятся числа 1,2,3,4,5,6,7,8,9,10 и размер считалочки 4...то ответ должен быть таким: 4,8,2,7,3,10,9,1,6,5 если Я не ошибся...
Ума не приложу как делать эту прогу, есть только процедура заполнения, но по словам препода она слишком простая... norespect.gif ...
Если кто может, или тут была прогу-помогите ПЛИЗ...

Автор: volvo 18.11.2006 4:24

http://forum.pascal.net.ru/index.php?s=&showtopic=13211&view=findpost&p=76992
http://forum.pascal.net.ru/index.php?s=&showtopic=3483&view=findpost&p=31452

(обе реализации - с массивом... На списки попробуй переделать сам...)

Автор: TOPEHTO 18.11.2006 4:48

Окей, спасиБо огромное... smile.gif ...

ПРо казнь программу понял туго, да и разбиратсья в ней неохота+ считалочка мне подходит на 100% тока форму вывода надо поменять, чтобы в итоге выводил 1 строчку, или так оставить еще не решил...
В чужих прогах разбираюсь плохо, да и в программировании слабоват, постараюсь конечно, но обещать не могу что получиться-но ПОПРОБУЮ...

Автор: TOPEHTO 18.11.2006 23:49

Собрал все свои мозги в кучу...что-то не получается, даже 1% переделать...
А сразу со списками нет? просто знакомых программистов не имею, а вас просить не удобно...sad.gif...

Автор: мисс_граффити 19.11.2006 4:38

э... не поняла. ты нас НЕ просишь (раз неудобно)? или просишь?

в общем, FAQ по спискам читал? Создать список сможешь (пока без реализации алгоритма считалочки - просто создать)?

Автор: TOPEHTO 19.11.2006 4:53

мисс_граффити
Прошу конечно, просто неудобно у Вас время воровать своими детскими прогами... smile.gif ...
Процедуру создания списка писали на лекции, так что...наверное написать и отладить смогу...еще есть распечатка, но со слов парня, который её писал(он просто разбирается в программировании) это "Зеленая демо-бета версия" так что до ума её еще доводить и доводить... nea.gif ...

Автор: мисс_граффити 19.11.2006 5:42

Ну вот smile.gif Пробуй. Когда разберешься с этим - можно будет говорить о реализации какого-либо алгоритма обработки (переделки считалочки).
З.Ы. "Детские" - это, судя по всему, 2 курс?

Автор: TOPEHTO 19.11.2006 5:55

АГА... wacko.gif ...откуда ты знаешь?... smile.gif ...
по теме: вообщем создание списка постараюсь зава сделать... unsure.gif ...

Автор: TOPEHTO 19.11.2006 19:20

Цитата
type
lob=^zap
zap=record
info:integer
link:lob
end;
var
p,t:lob;
n,k:integer;
procedure zapol (n:integer, var t:lob)
var
i:integer;
begin t^.info:=1;
t^.link:=t;
for i:=2 to n do
degin
new(p);
p^.info=i;
t^.link:=p;
p^.link:=t;
end;
end;

Самое основное вспомнил, что начали мы её реализовавыть через циклические списки...вот процедура создания списка...пока больше ничего придумать не могу...ПОМОГИТЕ плиз... mega_chok.gif ...

Автор: мисс_граффити 19.11.2006 22:08

так циклические или двунаправленные? или циклические двунаправленные?
насколько я вижу,

zap=record
info:integer
link:lob
end;

содержит только 1 указатель...

на циклических двунаправленный алгоритм вроде как будет намного проще, чем на массивах.

Автор: TOPEHTO 19.11.2006 22:34

Вообщем мне нуна:
или всю прогу на двунаправленных списках...
или всю на циклических...
3-го не дано... smile.gif ...но желательно черех двунаправленные сделать, то проца которую Я выложил, теоритически через циклические... wacko.gif ...

Автор: TOPEHTO 21.11.2006 2:25

Ну товарищи помогите плиз...почитал в FAQ начал творить потихоньку, но мозга не хватает...до следущего понедельника надо помочь... wink.gif ...

Автор: мисс_граффити 21.11.2006 2:59

Что не получается? Спрашивай конкретно.
Через циклические двусвязные проще всего.
Вопрос такой: куда выводить инфу? Просто печатать номера, или сохранять в список?

Автор: TOPEHTO 21.11.2006 3:43

Зава скину то что получилось, щас флехи нет рядом...
а вывод нужен 2-х типов...первый после того как ввел, т.е.информационная часть(номер дитя)...второй вот порядок их выбывания, т.е. примерно мона и такой вывод как в задачке с массивами, который выложил volvo, но луче сразу выводить число которое выбыло и все...
Выложить-Я то выложу, что сумел сотворить, но...на этом весь мой мозг закончитсяsad.gifsad.gifsad.gif
помогите уж тода процами какими...
Совсем забыл: должно быть сделано меню,
1-Ввод данных(ну там кол-во детей, номер каждого впринципе мона и авто заполнение, если мона сделать, и сама считалочка)
2-Вывод того что тока что заполнил
3-Вывод после считалочки
Если кто чем может помогите плиз... wink.gif ...

Автор: мисс_граффити 21.11.2006 5:41

что тебе нужно сделать для начала:
1. Обеспечить нормальный ввод (это ты вроде как разобрался более-менее. Домучивай)
2. Научиться "ходить" по списку, чтобы найти исключаемый элемент. Это делается в цикле. Умеешь?
3. Научиться удалять элемент из списка. Это делается при помощи перестановки указателей.

Менюшку и все такое можно сделать потом... пока что нужно создать основу.

Автор: TOPEHTO 21.11.2006 14:38

Цитата
Обеспечить нормальный ввод (это ты вроде как разобрался более-менее. Домучивай)

Дотворил откомпилировал-выложу на Ваш суд, чтобы глянули как оно... rolleyes.gif ...
Цитата
Научиться "ходить" по списку, чтобы найти исключаемый элемент. Это делается в цикле. Умеешь?

ВОт с этим Вам придется мне помочь... yes2.gif ...
Цитата
Научиться удалять элемент из списка. Это делается при помощи перестановки указателей.

Помойму Я что-то такое написал, но оно для линейных списков...ну тоже выложу...
Прога будет печером, поехал в универ за флехой, надеюсь на вашу помощь... wub.gif ...

Автор: TOPEHTO 21.11.2006 22:14

Код
type
lob=^zap;
zap= record
info:integer;
link:lob
end;
var
p,t:lob;
n,k:integer;
procedure ZAPOL(n:integer; var t:lob);
var i:integer;
begin
t^.info:=1;
t^.link:=t;
for i:=2 to n do
begin
new(p);
p^.info:=i;
t^.link:=p;
p^.link:=t;
end;
end;
{procedure print(var t:lob; k:integer);
var
i:integer;
begin
if (p^.link<>p) then
begin
I:=i+k;
t:=p^.link;
p^.link:=p^.link^.link;
dispose(t);
end;
end;}
procedure Print(p:lob);
var
r:lob;
begin
r:=p;
while r<>nil do
begin
writeln ('Ќ®¬Ґа = ' ,r^.info);
r:=r^.link;
end;
end;
procedure DEL(var p:lob);
var
r:lob;
begin
r:=p^.link;
p^.link:=p^.link^.link;
r^.link:=nil
end;
function menu:integer;
var
k:integer;
begin
writeln;
writeln;
writeln('1-‡ Ї®«­Ёвм бЇЁб®Є');
writeln('2-ђ бЇҐз в вм бЇЁб®Є');
writeln('3-ђ бЇҐз в вм Ї®а冷Є ўлЎлў ­Ёп н«Ґ¬Ґ­в®ў');
writeln('0-‚л室 Ё§ Їа®Ја ¬¬л');
writeln('‚ и ўлЎ®а');
readln(k);
menu:=k;
end;
   begin{Ћб­®ў­ п Їа®Ја ¬¬ }
   clrscr;
k:=1;
writeln('Џа®Ја ¬¬ ,Ї®Є §лў ой п Ї®а冷Є ўлЎлў ­Ёп ¤ҐвҐ© Ё§ ЈагЇЇл ЇаЁ § ¤ ­­®¬ Є®«ЁзҐб⢥ б«®ў ў бзЁв «®зЄҐ ');
writeln('‚ўҐ¤ЁвҐ Є®«ЁзҐбвў® ¤ҐвҐ©');
readln(n);
writeln('‡ Ї®«­ЁвҐ ¬ ббЁў, ўўҐ¤ЁвҐ ' , n ,' н«Ґ¬Ґ­в®ў ¬ ббЁў ');
for i:=1 to n do read(a[i]);
while k<>0 do
begin

k:=menu;
Case k of

1:Sort1(b,n,m);
2:Sort2(b,n,m);
3:Sort3(b,n,m);
0: writeln('Љ®­Ґж а Ў®вл Їа®Ја ¬¬л');
end;
BblBOD(b,n,m);
end
end.
begin{Ћ‘ЌЋ‚ЌЂџ ЏђЋѓђЂЊЊЂ}


Воть...собсна, вроде компилируется, сильно не судите, т.к. в программирование слабоват... yes2.gif ...
Плиз помоги с выводом данных и самой работой проги... mega_chok.gif ...

Автор: мисс_граффити 21.11.2006 23:08

вообще "хождение" имеет вид примерно такой:

for i:=1 to step-1 do {делаем заданное количество шагов.}
p:=p^.link;{каждый раз переходя на следующий элемент}
writeln(p^.info); {а теперь выводим, на какой элемент указывает p}

поскольку список циклический, можно не волноваться, что p^.link=nil
а вот проверить, чтобы изначально список был не пустой - имеет смысл.

для упрощения алгоритма (если мы работаем с односвязными списками, то есть перейти на предыдущий элемент нет возможности) можно делать на шаг меньше и останавливаться на элементе, предшествующем удаляемому. Это упростит удаление... А вывод примет вид:
writeln((p^.link)^.info)

Автор: TOPEHTO 21.11.2006 23:15

СпасиБо...вы мне ТТТТТТТТТТААААААААААКККККККККК помогли... smile.gif ...

Автор: Гость 3.12.2006 21:39

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

Код
uses crt;
type
lob=^zap;
zap= record
info:integer;
link:lob
end;
var
p,t:lob;
n,k,i:integer;
procedure ZAPOL(n:integer; var t:lob);
var i:integer;
p,z:lob;
begin
t^.info:=1;
t^.link:=t;
for i:=n downto 2 do
begin
new(p);
z:=t^.link;

p^.link:=z;
t^.link:=p;
p^.info:=i;
end;
end;

procedure Print(r:lob);
var
i:integer;
begin
r:=p;
while p<>r^.link do
begin
writeln ('Ќ®¬Ґа = ' ,r^.info);
r:=r^.link;
end;
writeln('Ќ®¬Ґа = ', r^.info);
end;
procedure DEL(var p:lob);
var
r:lob;
begin
r:=p^.link;
p^.link:=p^.link^.link;
dispose®;
r^.link:=nil
end;

{procedure ydal (var t:lob; d:integer);
var
i:integer;p:lob;
begin
}
function menu:integer;
var
k:integer;
begin
writeln;
writeln;
writeln('1-‡ Ї®«­Ёвм бЇЁб®Є');
writeln('2-ђ бЇҐз в вм бЇЁб®Є');
writeln('3-ђ бЇҐз в вм Ї®а冷Є ўлЎлў ­Ёп н«Ґ¬Ґ­в®ў');
writeln('0-‚л室 Ё§ Їа®Ја ¬¬л');
writeln('‚ и ўлЎ®а');
readln(k);
menu:=k;
end;
   begin{Ћб­®ў­ п Їа®Ја ¬¬ }
   clrscr;
k:=1;
writeln('Џа®Ја ¬¬ ,Ї®Є §лў ой п Ї®а冷Є ўлЎлў ­Ёп ¤ҐвҐ© Ё§ ЈагЇЇл ЇаЁ § ¤ ­­®¬ Є®«ЁзҐб⢥ б«®ў ў бзЁв «®зЄҐ ');

{writeln('‚ў®¤ЁвҐ а §¬Ґа бзЁв «®зЄЁ');
readln(k);}

while k<>0 do
begin

k:=menu;
Case k of

1:begin
writeln('‚ўҐ¤ЁвҐ Є®«ЁзҐбвў® ¤ҐвҐ©');
readln(n);
zapol(n,t);
end;
2:print(t);
{3:}
0:begin
writeln('Љ®­Ґж а Ў®вл Їа®Ја ¬¬л');
readln;
end;
end;
end
end.

осталось 3 процедуру только сделать... mega_chok.gif mega_chok.gif mega_chok.gif ...

Автор: TOPEHTO 4.12.2006 1:02

Ребят ну помогите плиз...Я в начале обрадовался, когда мии_графити идею дала, но не воплотилась она у мну в жизнь...Завтра сдавать надо, плиз помогите... wink.gif ...

Автор: TOPEHTO 4.12.2006 23:24

Все сдал...всем спасибо кто помог... blum.gif ...

Автор: iceman 8.05.2007 23:09

Всем привет!
У меня точно такая же задача. Написал через однонаправленный кольцевой список. У меня вот так (пока черновой вариант) получилось:


uses crt;
type
point=^item;
item=record
number:integer;
next:point;
end;
var
first,r:point;
n,k,l,e:integer;
procedure create(n:integer; var first,r:point);
var
m:integer;
begin
m:=n;
n:=n-1;
first:=nil;
while n>0 do
begin
new®;
r^.next:=first;
r^.number:=n;
first:=r;
n:=n-1;
end;
while r^.next<>nil do
begin
r:=r^.next;
end;
new(r^.next);
r^.next^.number:=m;
r^.next^.next:=first;
end;
procedure print(e:integer;first:point);
var
r:point;
i:integer;
begin
r:=first;
for i:=1 to e do
begin
write(' ',r^.number);
r:=r^.next;
end;
end;
procedure main(first,r:point; n,k:integer);
var
i,a:integer;
q,curr:point;
begin
writeln;
curr:=first;
for a:=1 to n do
begin
i:=0;
for i:=1 to k-1 do
begin
r:=r^.next;
end;
q:=r^.next;
r^.next:=r^.next^.next;
q^.next:=nil;
dec(e);
print(e,r);
writeln;
end;
end;
begin
clrscr;
write('Vvedite n: ');readln(n);
write('Vvedite k: ');readln(k);
create(n,first,r);
e:=n;
write('Kolco: ');
print(e,first);
writeln;
main(first,r,n,k);
readkey;
end.


В общем дело вот в чем, результат(n=7,k=4):

1 2 3 4 5 6 7

2 4 5 6 7 1
6 1 2 4 5
4 6 1 2
2 6 1
2 1
1

Т.е. первое значение, почему-то определяется неправильно. Прошу помощи. Заранее благодарен.