Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмдеу жане багдарламалау негиздери 4 г.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
2.73 Mб
Скачать

2 Мысал: Күн жүйесінің динамикалық моделі.

Program Example_2;

uses crt, graph;

const pi=3.1415;

Var gD,gM: integer;

fi,h,fil,hl: real;

x0, y0, x,y,r,rl: integer;

Begin

gD:=Detect; InitGraph(gD,gM,' ');

h:=5; hi:=1;fi:=0; fil:=0; r:=20;

rl:=100; circle(320,240,10);

repeat

x0:=round(rl*sin(fil))+320;

y0:=round(rl*cos(fil))+240;

x:=x0+round(r*sin(fi)) ;

y:=y0+round(r*cos(fi));

fi:=fi+2*pi*h/360;

fil:=fil+2*pi*hl/360;

putpixel(x0,y0,15);

putpixel(x,y,15);

delay(50);

putpixel(x,y,0);

putpixel(x0,y0,0);

until keypressed;

CloseGraph;

End.

44-45 жұмыс

Тақырыбы: Рекурсивті алгоритм және графика

Тапсырмалар:

Төмендегі бейне алатын программа құрастыр.

Төменде 1 және 2 дәрежелі Серпин бейнесі бейнеленген. N-ретті Серпин прокладкасының программасын құрастыр.

Серпиннің 1 және 2-ші дәрежелі кілемшесі бейнеленген. N-ретті Серпин кілемінің программасын құрастыр.

әдебиет:

1.Негізгі – 3, 5, 9-12

2. Қосымша - 4

Әдістемелік нұсқау:

Для того чтобы проследить последовательность рисования окружностей при рекурсивных вызовах, можно дополнительно включить в тело процедуры про­стой цикл, обеспечивающий некоторую паузу перед выводом на экран очеред­ной окружности.

Изменяя в процессе демонстрации работы программы значения kl, kl, n, можно получать множество привлекательных рисунков.

Пример 1. Написать программу построения изображения, представленного на сле­дующем рисунке:

Анализ изображения: на рисунке большая окружность окружена четырьмя окружностями поменьше, каждая из которых в свою очередь окружена четырьмя окружно­стями с еще меньшим радиусом. Всего изображено четыре уровня окружностей.

Для того, чтобы составить программу построения этого изображения, можно:

• описать процедуру изображения одной окружности с четырьмя окружностями поменьше;

• для изображения каждой окружности следующего уровня использовать эту же процедуру, только с другими значениями параметров — координат центров, вели­чин радиусов и т. д.

Опишем алгоритм рисования окружности радиуса r с центром в точке (х,у) с четырьмя окружностями вокруг. При этом необходимо знать расстояния (rl) от точки (х,у) до центров окружностей окружения (радиусы орбиты), которые, очевидно, равны. Пусть , где r' — радиус окружности окружения, .

Procedure Picturel (x,y,r,rl:Integer);

Begin {изобразить окружность с центром (х,у) и радиусом r} ;

{вычислить rl};

For i:=l To 4 Do

Begin {вычислить координаты центра (xl,yl) i-й окружности};

Picturel(xl,yl,<новое значение r>, rl) ;

End;

End.

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

Как вычислить значения хl, y1? Они зависят от х и у следующим образом: х1 = х + dx, y1 = у + dy. Необходимо выразить значения приращений координат dx, fy. Воспользуемся определениями тригонометрических функций sin и cos:

dx = r1 • cos(cc)

dy = r1-sin(a), где a = /2, , З /2, 2 .

Если осуществить вызов этой же процедуры из основной программы с началь-шми параметрами, то рекурсивные вызовы никогда не закончатся и программа зудет работать бесконечно. Для того, чтобы этого не случилось, можно ввести в сачестве аргумента процедуры некоторую величину п, которая при каждом новом зызове процедуры будет уменьшаться на 1, а в тело процедуры включить условие, что его операторы должны выполняться только при п > 0, то есть это условие будет играть роль своеобразной «заглушки», ограничивающей число вызовов процедуры.

Ниже приведена программа, полностью решающая поставленную задачу.

В основной программе запрашиваются радиус r самой большой окружности и гасло уровней п, а также задаются значения коэффициентов k1 и k2. Центр самой эолылой окружности располагается в центре экрана.

Program Example_1;

Uses Graph;

Var x, у, n, r, rl,cd,gm:Integer;

kl,k2:Real;

Procedure Picture2 (x,y,r,rl,n:Integer);

Var xl,yl:Integer;

i:Integer;

Begin

If n>0 Then {"заглушка"} Begin

circle(x,у, r);

rl:=trunc(r*k2);

For i:=l To 4 Do

Begin

xl:=trunc(x+rl*cos(pi/2*i)); yl:=trunc(y+rl*sin(pi/2*i)); {координаты центра i-й окружности}

picture2(xl,yl,trunc (r*kl),rl,n-1);

{вызов процедуры с новыми параметрами}

End;

End;

End;

Begin {задание начальных значений n }

Writeln('Введите число уровней.');

Readln(n); x:=600 Div 2; у:=400 Div 2;

Writeln('Введите радиус первой окружности r'); Readln(r);

kl:=0.3; k2:=2;

cd:=detect; gm:=l; {инициализация графики}

initgraph(cd, gm, 'c:\tp7_0\bin'); picture2(x,y,r,rl, n) ;

Readln; {задержка на экране}

closegraph;

End.

2 мысал. Төмендегі бейне салатын программа жазу.

Program Example_2;

Uses Graph;

Var xc,xa,xb,ya,yb,ус:Integer; {үшбұрыш төбесінің координаттары}

n,cd,gm:Integer;

Procedure Triangle(xa, ya, xb, yb, xc, yc, n:Integer);

Var xp, xq, xr, yp, yq, yr: Integer;

Begin

If n>0 Then {«заглушка»}

Begin

xp:=(xb+xc) div 2;

yp:=(yb+yc) Div 2; xq:=(xa+xc) Div 2; yq:=(ya+yc) Div 2;

xr:=(xb+xa) Div 2; yr:=(yb+ya) Div 2;

line(xp,yp,xq,yq); line(xq,yq,xr,yr);

line(xp,yp,xr,yr);

Triangle(xa,ya,xr,yr,xq,yq,n-1);

Ttriangle(xb,yb,xp,yp,xr,yr,n-1);

Triangle(xc,yc,xq,yq,xp,yp,n-1);

End;

End;

Begin {бастапқы мәндерін беру}

хс:=300; ус:=0; xb:=600; yb:=400; ха:=0; уа:=400; cd:=detect; gm:=l;

initgrciph (cd, gm, ' с: \tp7_0\Bin ') ;

line(xa,ya,xb, yb); line(xb,yb,xc,yc); line(xa,ya,xc,yc);

Triangle(xa,ya,xb,yb,xc,yc,6);

Readln; {экранда кідіру}

Closegraph;

End.