Задание. Рассмотрите приведенные примеры задач, решенные с помощью динамической структуры – кольцо. Наберите их на компьютере, проверьте их действие, вставьте комментарий.
Задача 1. N ребят располагаются по кругу. Начав отсчет от первого, удаляют каждого k-го, смыкая при этом круг. Определить порядок удаления ребят из круга.
Для хранения данных об участниках игры используется список.
Наберите предложенный ниже текст программы, проверьте его работу, дополните комментариями.
Program Schitalka;
Type
Children = ^Child;
Child = record
Data: integer;
Next: Children;
end;
Var
Circl, p, Temp: Children;
i, j, NumName: integer;
text: string;
Function NumSlov(Var S: string): integer;
Var
i, d: integer;
Begin
d:= 0;
i:= 1;
while i < Length(S) do
begin
while S[i] = ' ' do
Inc(i);
while S[i] <> ' ' do
Inc(i);
d:= d+1;
end;
if S[Length(S)] = ''
then
d:= d-1;
NumSlov:= d;
End;
Procedure AddName(Var Old, Young: Children);
Begin
Young^.Next:= Old;
Young^.Prev:= Old^.Prev;
Old^.Prev^.Next:= Young;
Old^.Prev:= Young;
End;
Procedure DeleteName(Var Old: Children);
Begin
Old^.Next^.Prev:= Old^.Prev;
Old^.Prev^.Next:= Old^.Next;
End;
Begin
new(Circl);
Circl^.Next:= Circl;
Circl^.Prev:= Circl;
Circl^.Name:= '';
writeln('Считалка');
writeln('Введите текст считалки >');
readln(text);
writeln('Сколько человек в кругу? >');
readln(NumName);
if NumName>0
then
begin
write('Введите ',i,'-е имя: ');
new(p);
readln(p^.name);
temp:= head^.next;
while temp <> head do
temp:= temp^.next;
AddName(temp, p);
end;
for i:= 1 to NumName-1 do
begin
temp:= head;
for j:= 1 to NumSlov(text) do
begin
temp:= temp^.next;
if temp^.name = ''
then
temp:=temp^.next;
end;
writeln(temp^.name, '- вышел');
deleteName(temp);
end;
writeln(head^.next^.name, '- остался');
End.
Пример 2. Вывести на экран работающий светофор.
Program GrushinK;
Uses
Crt, Graph;
Type
TypeCircle = ^K;
K = record
Data: char;
Next: TypeCircle;
end;
Const
XX = 80;
R = 50;
Var
Svetofor, x: TypeCircle;
FraphDriver, GraphMode, Y: integer;
Procedure Picture;
Begin
SetViewPort(240, 1, 400, 477, ClipOff);
Line(0, 1, 0, 477);
Line(160, 1, 160, 477);
Line(0, 1, 160, 1);
Line(0, 477, 160, 477);
Line(0, 150, 156, 150);
Line(0, 330, 156, 330);
Line(-240, 480, 0, 100);
Line(400, 480, 160, 100);
Line(380, 460, 160, 460);
Line(160, 440, 368, 440);
Line(368, 440, 380, 460);
Line(-220, 460, -208, 440);
SetFillStyle(1, White);
FloodFill(375, 455, White);
FloodFill(-215, 455, White);
SetFillStyle(7, 6);
FloodFill(-230, 200, White);
SetColor(4);
Line(-240, 150, -120, -1);
Line(400, 150, 240, -1);
SetColor(15);
SetFillStyle(9, 4);
FloodFill(-240, 0, 4);
FloodFill(390, 10, 4);
SetFillStyle(1, 8);
FloodFill(-100, 470, White);
Y:= 74;
Circle(XX, Y, R);
Y:= 240;
Circle(XX, Y, R);
Y:= 405;
Circle(XX, Y, R);
SetFillStyle(9, 6);
FloodFill(5, 5, White);
End;
Procedure Yellow(Y: integer);
Begin
Picture;
Y:= 240;
SetFillStyle(1, 14);
FloodFill(XX, Y, 15);
Delay(850);
ClearViewPort;
End;
Procedure Green(Y: integer);
Begin
Picture;
Y:= 405;
SetFillStyle(1, 2);
FloodFill(XX, Y, 15);
Delay(1500);
ClearViewPort;
End;
Procedure Red Yellow(Y: integer);
Begin
Picture;
Y:= 240;
SetFillStyle(1, 14);
FloodFill(XX, Y, 15);
Delay(1500);
ClearViewPort;
End;
Procedure Red(Y: integer);
Begin
Picture;
Y:= 74;
SetFillStyle(1, 4);
FloodFill(XX, Y, 15);
Delay(2000);
ClearViewPort;
End;
Procedure Vibor;
Begin
case x^.Data of
'R': Red(Y);
'2': Red Yellow(Y);
'G': Green(Y);
'Y': Yellow(Y);
End;
Begin
GraphDriver:= Detect;
InitGraph(GraphDriver, GraphMode, '..\BGI');
new(x);
u:= x;
x^.Data:= 'R';
new(x^.Next);
x:= x^.Next;
x^.Data:= '2';
new(x^.Next);
x:= x^.Next;
x^.Data:= 'G';
new(x^.Next);
x:= x^.Next;
x^.Data:= 'Y';
x^.Next:= u;
x:= u;
while not KeyPressed do
begin
Vibor;
x:= x^.Next;
end;
End.
Задание. Придумайте интересную задачу из жизни и решите ее с помощью динамической структуры кольцо.
Список