БГПУ
Замкнутаяломаная без самопересечений
Содержание
Введение
Глава 1
§1. Понятие ломаной
§2. Прямая на плоскости
Глава 2
Введение: Перечень основных процедур и функций, используемыхв программах
§1. Function Peres, Блок Схема
п.2 Function Peres, на языке Turbo Pascal
§2. Рекурсивный способ построения простой замкнутой ломаной
§3. Верхняя оценка количества способов построения ПЗЛ
§4. Построения простой замкнутой ломаной методом«Треугольника»
п.1 Идея метода
п.2 Реализация на языке Паскаль
Список литературы
/>/>Введение
Тема бакалаврской работыявляется «Простая замкнутая ломаная кривая» (ПЗЛ).
Актуальность: выбранной темы заключается в том,что теория ПЗЛ имеет практическое применение например: прокладываниегазопровода, железнодорожных путей и т.д., но теория ПЗЛ не дает ответа как исколькими способами это возможно сделать. В теории ПЗЛ дано лишь определениеПЗЛ и ее компонентов без выделения, каких либо свойств. А так решение проблемывыбранной темы является, частным случаем решения задачи Коммивояжера её ещёназывают транспортной задачей.
Объект исследования: Планиметрия.
Предмет исследования: Простая замкнутая ломаная наплоскости.
Цели: Изучит понятие ПЗЛ, выделить егосвойства и составить алгоритм построения.
Задачи:
1) Составитьрекурсивный алгоритм позволяющий построить все возможные ПЗЛ через n произвольных точек плоскости(замечание эти точки должны быть вершинами ПЗЛ, и других вершин нет).Реализовать его в среде Turbo Pascal.
2) Дать верхнююоценку количества способов построения ПЗЛ через n произвольных точек плоскости.
3) Составить нерекурсивный алгоритм и реализовать его на языке Turbo Pascal, позволяющий строить ПЗЛ для большого количествапроизвольных точек
Гипотезы:
1. ПЗЛ можнопостроить всегда, кроме случая когда все точки лежат на одной прямой.
2. Пусть через n точек проходят S прямых имеющих не менее 4-хданных точек, тогда через эти nточек можно провести не более чем
/>
различных ПЗЛ, где k i-количество точек принадлежащих i-ой прямой, i=1,2…S
Глава 1§1. Понятие ломаной
Фигура,образованная конечным набором отрезков, расположенных так, что конец первогоявляется началом второго, конец второго – началом третьего и т.д., называетсяломаной линией или просто ломаной (рис. 1). Отрезки называются сторонамиломаной, а их концы – вершинами ломаной.
Ломанаяобозначается последовательным указанием ее вершин. Например, ломаная АВСDE, ломаная A1A2…An.
Ломанаяназывается простой, если она не имеет точек самопересечения (рис. 2).
/>
Ломанаяназывается замкнутой, если начало первого отрезка ломаной совпадает с концомпоследнего. Замкнутую ломаную, у которой точками самопересечения являютсятолько начальная и конечная точки, также называют простой (рис. 3).
Длинойломаной называется сумма длин ее сторон. §2. Прямая на плоскости.
п.1.Уравнение прямой на плоскости.
Из курса геометрииизвестно, что любая прямая на плоскости xOy имеет уравнение />(1)[2],где /> — постоянные.
Пусть даны двепроизвольные точки />и/>прямой l, тогда найдем уравнение прямой l, проходящей через эти точки.
Воспользуемся уравнением(1).
Рассмотрим два случая,когда 1)/> и 2)/>.
1) Если />то, уравнение(1) примет вид/>,/> т.е. прямая будет параллельнаоси Оу или совпадать с ней.
Замечание: так как коэффициенты а и с заданы неоднозначно, поэтому в алгоритмах, использующих уравнение прямой используетсятолько геометрическая интерпретация этого случая, т.е. тот факт если прямаяпроходит через две точки у которых первые координаты равны, то эта прямаяпараллельна оси Оy.
2) Если />тогда уравнение(1) можнопредставить в виде />(2), где />. Так как точки />и/>лежат на прямой l, то их координаты являются корнямиуравнения(2). Поэтому для нахождения коэффициентов уравнения(2) достаточнорешить систему уравнений
í/>
относительно этихпеременных k и d, получим решение,
í/>т.е. мы нашли уравнение прямой l.
Таким образом, еслипрямая не параллельна оси Оу то уравнение(1) равносильно уравнению />иначе уравнение(1)равносильно уравнению />.
п.2 Взаимноерасположение двух прямых на плоскости.
Еще из школьного курсагеометрии основной школы известно, что две прямые на плоскости либопересекаются, либо параллельны.
Пусть две прямые l: />,и g: /> тогдаесли эти прямые параллельны, то /> [2]иначе />.
Если две различные прямыеl и g не параллельны, то они имеют общую точку. Координаты этойточки являются решением системы уравнений.
í/>Þ í/>Þ í/>
Глава 2 Введение:Перечень основных процедур и функций, используемых в программах
FunctionS_3(T,B,C:tochka):Boolean;
Функция истина если триточки лежат на одной прямой.
Идея: находим уравнение прямой l,проходящей через точки В и С, и проверяем на принадлежность точки Т прямой l .
Vark1,b1:real;
Begin
If((B.x=C.x)and(B.x=T.x)) or
((B.y=C.y)and(B.y=T.y))thenS_3:=true
else
if B.x=C.xthen S_3:=false
else begin
k1:=(B.y-C.y)/(B.x-C.x);
b1:=B.y-k1*B.x;
ifround(T.y)=round(k1*T.x+b1) then S_3:=true
elseS_3:=false;
end
End;
FunctionPrin(T,B,C:tochka):boolean;
Функция истина если точкаТ принадлежит отрезку ВС.
Идея: Если точка Т лежит на отрезке ВС, тоона лежит на прямой проходящей через точки В и С, и заключена между ними.
Begin
If S_3(T,B,C)then
if(((B.x
(((B.y
thenPrin:=true
elsePrin:=false
elsePrin:=false
End;§1. Function Peres, БлокСхема
Истина если отрезки [AB] и [CD] имеют общие точки за исключением случаев:
1) если отрезкисовпадают;
2) если один конецотрезка совпадает с одним из концов другого отрезка, и других общих точек нет.
/>
/>
/>п.2 Function Peres, на языке Turbo Pascal
Function Peres(A, B, C, D: tochka): boolean;
Var O: tochka;
k1, k2, b1,b2: real;
s1, s2:Boolean;
Begin
{Проверка 1-го случая}
if(A.x=C.x)and(A.y=C.y) and (B.x=D.x)and(B.y=D.y) then Peres:=False
else
if(A.x=D.x)and(A.y=D.y) and (B.x=C.x)and(B.y=C.y) then Peres:=False
else
{Проверка 2-го случая}
If(A.x=C.x)and(A.y=C.y) then if Prin(D,A,B) or Prin(B,C,D) then Peres:=true elsePeres:=False
else
If (A.x=D.x)and (A.y=D.y) then if Prin(C, A, B) or Prin (B,C,D) then Peres:=true elsePeres:=False
else
If(B.x=C.x)and(B.y=C.y) then if Prin(D,A,B) or Prin(A,C,D) then Peres:=true elsePeres:=False
else
If(B.x=D.x)and(B.y=D.y) then if Prin(C,A,B) or Prin(A,C,D) then Peres:=true elsePeres:=False
else { общей случай}
If A.x=B.xthen begin if C.x=D.x then if Prin(A,C,D) or
Prin(B,C,D) or
Prin(C,A,B) or
Prin(D,A,B)then Peres:=true else Peres:=false
else begin
k2:=(C.y-D.y)/(C.x-D.x);
b2:=C.y-k2*C.x;
O.x:=A.x;
O.y:=k2*O.x+b2;
if Prin(O,C,D)and Prin(O,A,B) then Peres:=true
elsePeres:=False
end end
else ifC.x=D.x then begin
k1:=(A.y-B.y)/(A.x-B.x);
b1:=A.y-k1*A.x;
O.x:=C.x;
O.y:=k1*O.x+b1;
if Prin(O,C,D)and Prin(O,A,B) then Peres:=true
elsePeres:=False
end
else begin
k1:=(A.y-B.y)/(A.x-B.x);
k2:=(C.y-D.y)/(C.x-D.x);
if k1=k2 then{} if Prin(A,C,D) or
Prin(B,C,D) or
Prin(C,A,B) or
Prin(D,A,B)then Peres:=true
elsePeres:=false
else begin
b1:=A.y-k1*A.x;
b2:=C.y-k2*C.x;
O.x:=(b1-b2)/(k2-k1);
if k1=0 thenO.y:=b1
else if k2=0then O.y:=b2
elseO.y:=(b1/k1-b2/k2)/(1/k1-1/k2);
if Prin(O,C,D)and Prin(O,A,B)
thenPeres:=true
elsePeres:=false
end
end
End;§2. Рекурсивный способпостроения простой замкнутой ломаной
Идея: Чтобы перебрать все возможные способы построения простойзамкнутой прямой мы воспользовались следующим алгоритмом построения:
1. Зафиксировалиодну из n точек, т.к. не имеет значение, какаяточка будет начальной т.к ломаная замкнутая;
2. Соединяязафиксированную точку с одной из незанятых точек, получаем первую сторонуломаной.
3. Затем соединениепродолжаем рекурсивно полным перебором всех незанятых точек, при условиях:
Ø Новую точку можно соединить споследней присоединённой точкой, если отрезок, соединяющий эти точки, непересекает ни одну из уже построенных сторон ломаной;
Ø Продолжаем построение до тех пор,пока есть незадействованные точки,
Ø Если свободных точек нет и отрезок,соединяющий последнюю присоединенную точку с первой, не пересекает ни одну изсторон построенной ломаной то, построенная ломаная и этот отрезок будутобразовывать искомую замкнутую ломаную.
4. Возвращаемся кпункту 2 до тех пор пока не будут перебраны все незанятые точки.
Программа
Uses crt;
Const n=9 ;{Количество точек}
m=400;{}
Typetochka=record
x,y,r:real;
n:word;
end;
Mass=array[0..n]of tochka;
Var sch:word;
number:text;
ProcedureSozd_t(Var MT:Mass; n,m:Word);
Var i:word;
Beginrandomize;
For i:=1 to ndo
begin
MT[i].x:=random(m);
MT[i].y:=random(m);
MT[i].n:=i;
end;
End;
Procedure Sdvyg(Var MT:Mass;n1,n2:word);{n1- n2-}
Var i:word;
Begin
For i:=n1 ton2-1 do MT[i]:=MT[i+1];
MT[n2].x:=1000;MT[n2].y:=1000;
End;
{Сохраняем полученную ломаную}
ProcedureSave(MT:mass);
Var i:word;
st1,st2:string[n];
Begin
sch:=sch+1;st2:='';
For i:=1 to ndo
begin
Write(MT[i].n,'');
str(MT[i].n,st1);
st2:=st2+st1;
end;
Writeln('---',sch,'---');
Writeln(number,st2);
readkey;
End;
ProcedureRekurs(MT:Mass;Kol:word;T:word);
Vari,j,g:word;
s:boolean;
Begin
MT[0]:=MT[t];
Sdvyg(MT,t,kol);
MT[kol]:=MT[0];
Kol:=kol-1;
IF kol>0then
For j:=1 tokol do
begin s:=true;
for i:=kol+1to n-1 do
ifPeres(MT[j],MT[kol+1],MT[i],MT[i+1]) then s:=false;
if s thenRekurs(MT,kol,j)
end
ELSE begins:=true;
For g:=1 ton-1 do
ifPeres(MT[1],MT[n],MT[g],MT[g+1]) then s:=false;
if s thenSave(MT);
end;
End;
Procedure Recurs_Soed(MT:Mass);
Var v:word;
Begin
For v:=1 ton-1 do Rekurs(MT,n-1,v)
End;
ProcedureProseivanie(var f1,f2:text);
Varst1,st2,st3:string[n];
S:boolean;
i,j,v:byte;
Begin v:=1;
Read(f1,st1);
Writeln(f2,st1);
While noteof(f1) do
begin
Readln(f1,st1);
reset(f2);{гбвў«ЁўҐ¬ Єгаб®Є ў з»® д©"}
s:=true;
st3[n]:=st1[n];
for i:=1 ton-1 do st3[i]:=st1[n-i];
{Џа®ўҐаЄ б®ўЇ¤ҐЁҐ st1 б 㦥 §ЇЁбл¬Ё ў f2}
While noteof(f2) and s do
begin
Readln(f2,st2);
j:=0;
For i:=1 to ndo
if(st2[i]=st1[i]) or (st2[i]=st3[i]) then j:=j+1;
if j=n thens:=false;
end;
if s thenbegin Append(f2); Writeln(f2,st1); v:=v+1 end;
end;
writeln;
writeln('---',v,'---');
End;
Var MT:mass;
k,ch:word;
Loman:text;
BEGIN
clrscr;
sch:=0;
Sozd_T(MT,n,m);
assign(number,'number.txt');
Rewrite(number);
Recurs_Soed(MT);
readln;
Close(number);
Reset(number);
assign(Loman,'Loman.txt');
Rewrite(Loman);
Proseivanie(Number,Loman);
Close(Number);
Close(Loman);
readln;
END.§3. Верхняя оценкаколичества способов построения ПЗЛ
Гипотеза: Пусть через n произвольных точек плоскости проходит S прямых содержащих не менее чем по 4-реточки из данных, тогда через эти nточек возможно провести простых замкнутых ломанных не более чем /> где ki– количество точек из данных точеклежащих на i прямой, />.
Доказательство:
Ι Этап.
1) Количествоспособов построения ломаных />.
2) Количествоспособов построения замкнутых ломанных /> т.к.не имеет значение какая вершина будет начальной.
3) Очевидно, чтоколичество ПЗЛ будет не больше количества замкнутых ломаных. Пусть L – количество способов построения ПЗЛчерез n точек, тогда />.
ΙΙ Этап.
Дано ki– количество точек лежащих на i прямой, где />.
Пусть на каком-то шагепостроения ПЗЛ мы пришли в т.А.
Рассмотрим рисунок.
/>
Пусть т.АÎi-ой прямой с ki – точками из данных. Рассмотримслучаи соединения точки А с точками на i прямой.
Точку А можно соединитьмаксимум с двумя точками, лежащих на этой прямой, чтобы выполнялись условияпостроения. Количество же всевозможных случаев соединения точки А с другимиточками прямой равно (ki-1). Посчитаем наименьшее количество случаев, которые не удовлетворяютусловиям построения.
/>
При каждом j обращении к точкам этой прямой будутне удовлетворять /> случаев.
Но т.к. таких прямых S получаем
/>
случаев построенияломаных удовлетворяющих условиям построения.
Если не имеет значениянаправление обхода ломаной то, в итоге получаем количество способов построенияПЗЛ будет
/>§4. Построения простойзамкнутой ломаной методом «Треугольника» п.1Идея метода
Идея: Пусть даны n произвольных точек на плоскости.
1. Выбираем любую изних, назовем «первой». Затем берем две ближайшие к ней точки. На этихтрех выбранных точках строим треугольник.
2. Берем следующуюближайшую, не занятую точку к «первой».
3. Ищем ближайшийотрезок п.2Реализация на языке Паскаль
uses crt,graph;
Const n=10; {Задаём количество точек}
m=400;{Длина стороныквадрата на котором расположены точки}
Type
tochka=record
x,y,r:real;
end;
Mass=array[0..n]of tochka;
Var sch:word; {Счетчик точек}
{Задает произвольнымобразом n точек в квадрате со стороной m }
ProcedureSozd_t(Var A:Mass; n,m:Word);
Var i:word;
Begin randomize;
For i:=1 to ndo
begin
A[i].x:=random(m);
A[i].y:=random(m);
end;
End;
{Рисует отрезок ВС}
ProcedureLin(B,C:tochka);
Begin
Line(Round(B.x),Round(B.y),Round(C.x),Round(C.y))
End;
{Определяет расстояниемежду точками}
FunctionR_TT(Var A,B:tochka):real;
BeginR_TT:=Sqrt(sqr(A.x-B.x)+sqr(A.y-B.y));
End;
{Определяет расстояниемежду i-ой точкой и другими}
ProcedureRasst_TT(Var A:Mass; i,n:word);
Var j:word;
Begin
For j:=1 to ndo
A[j].r:=R_TT(A[i],A[j])
End;
{Устраняет отрицательныезначения расстояния}
Procedureabsal(Var A:Mass; n1,n2:word);
Var i:word;
Begin
For i:=n1 ton2 do A[i].r:=abs(A[i].r)
End;
{Ищет номер ближайшейточки к i-ой}
FunctionPoiskNT(Var A:Mass; n1,n2:word):word;
var i,j:word;
Begin j:=n1;
WhileA[j].r
For i:=n1 ton2 do
if(A[i].r>0) and (A[i].r
PoiskNT:=j;
End;
{Сдвигает точки в массивена 1 позицию влево начиная с n1 до n2}
ProcedureSdvyg(Var A:Mass;n1,n2:word);
Var i:word;
Begin
For i:=n1 ton2-1 do A[i]:=A[i+1];
A[n2].x:=1000;A[n2].y:=1000;
End;
{Ищет основаниеперпендикуляра опущенного из точки Т на прямую проходящую через точки В иС}
ProcedureOsn(T,B,C:tochka;var O:tochka);
Vark,b2,a1,b1,c1:real;
Begin
If (B.x=C.x)then begin O.x:=B.x; O.y:=T.y end
else begin
k:=(B.y-C.y)/(B.x-C.x);
b2:=B.y-k*B.x;
a1:=2*(B.x-C.x)+2*k*(B.y-C.y);
b1:=2*b2*(B.y-C.y)+(sqr(C.x)-sqr(B.x))+(sqr(C.y)-sqr(B.y));
c1:=sqr(B.x-T.x)+sqr(B.y-T.y)-sqr(C.x-T.x)-sqr(C.y-T.y);
O.x:=(-c1-b1)/a1;
O.y:=k*O.x+b2;
end;
End;
{Функция истина если триточки лежат на одной прямой}
FUNCTIONS_3(T,B,C:tochka):Boolean;
{Функция истина еслиточка Т принадлежит отрезку ВС}
FunctionPrin(T,B,C:tochka):boolean;
Begin
If S_3(T,B,C)then
if(((B.x
(((B.y
thenPrin:=true
else Prin:=false
else Prin:=false
End;
{Возвращает расстояниемежду точкой и отрезком ВС}
FunctionR_TO(T,B,C:tochka):real;
Var T1:tochka;
Begin
Osn(T,B,C,T1);
Ifprin(T1,B,C) then R_TO:=R_tt(T1,T)
else ifR_tt(T,B)
elseR_TO:=R_tt(T,C)
End;
{Строит ломанную черезточки с номера n1 до n2}
ProcedurePostr(A:Mass;n1,n2:word);
Var i:word;
Begin
for i:=n1 ton2 do begin PieSlice(Round(A[i].x), Round(A[i].y), 0, 360, 2);
if i=n2 then
Line(Round(A[n2].x),Round(A[n2].y),Round(A[n1].x),Round(A[n1].y))
elseLine(Round(A[i].x),Round(A[i].y),Round(A[i+1].x),Round(A[i+1].y))
end;
End;
{Выдает информацию околичестве задействованных точек}
ProcedureSchet;
Var st:string;
code:integer;
Begin sch:=sch+1;
str(sch,st);
OuttextXY(600,100,st)
End;
{Истина если отрезки [AB] и [CD] имеют общие точки за исключением случаев 1) если отрезкисовпадают;
2) если один конецотрезка совпадает с одним из концов другого отрезка и других общих точек нет.}
FunctionPeres(A,B,C,D:tochka):boolean;
Var A:mass;
B,C:tochka;
Danger,s1,s2,s3,s4:boolean;
T,OL,O,OK,OKP,i,j,t1,t2,o1,o2:word;
grDriver:Integer;
grMode:Integer;
ErrCode:Integer;
st:string;
BEGIN
sch:=0;
grDriver:=Detect;
InitGraph(grDriver,grMode, '');
ErrCode:=GraphResult;
clrScr;
Sozd_t(A,n,m);{‡¤Ґ¬ Їа®Ё§ў®«м® в®зЄЁ }
Rasst_TT(A,n);
{‘®§¤Ґ¬ ЇҐаўл© ваҐгЈ®»мЁЄ}
A[0]:=A[1];
Sdvyg(A,1,n);
A[n]:=A[0];
i:=PoiskNT(A,1,n-1);
A[0]:=A[i];{€йҐ¬ Ў«Ё¦йЁо в®зЄг Є T}
Sdvyg(A,i,n-1);
Sdvyg(A,n-1,n);
A[n]:=A[0];
i:=Poisknt(A,1,n-2);{€йҐ¬ 2-о Ў»Ё¦йоо в®зЄг Є T}
{Џа®ўҐаЁ¬ "Ґ¦в «Ё ®¤®© Їаאַ©}
While S_3(A[i],A[n-1],A[n])do {!!!!}
beginA[i].r:=-A[i].r; i:=Poisknt(A,1,n-2) end;
A[0]:=A[i];
Sdvyg(A,i,n-2);
Sdvyg(A,n-2,n);
A[n]:=A[0];
textcolor(1);
t1:=1; t2:=n-3;
o1:=n-2;o2:=n;
ClearDevice;
Postr(A,o1,o2);
readkey;
sch:=3;
Repeat
Absal(A,1,n);
{Ќе®¤Ё¬ Ў»Ё¦йЁо в®зЄг ў бв. Є®«мжҐ}
T:=Poisknt(A,t1,t2);
{‡ЇЁб뢥¬ аббв®пЁҐ ®в в®зЄЁ ¤® ®в१Є ў „Ґўл© Є®Ґж}
For i:=o1 too2-1 do
A[i].r:=R_TO(A[T],A[i],A[i+1]);
A[o2].r:=R_TO(A[T],A[O2],A[O1]);
{€йҐ¬ г¦л© ®в१®Є}
j:=t1-1;
Repeat
{§ЇгбвЁ¬ бзҐвзЁЄЇ®ўв®аҐЁ©}
j:=j+1;
{€йҐ¬ Ў“Ё¦йЁ© ®в१®Є}
O:=O1;
whileA[O].r
For i:=O1 toO2 do
if(A[i].r>0) and (A[i].r
{[O,O+1] Ў»Ё¦йЁ© ®в१®Є}
{ЋЇаҐ¤Ґ«пҐ¬ »ЁзЁҐ Ї"®еЁе ваҐгЈ®«мЁЄ®ў}
if O=O2 thenOk:=O1 else Ok:=O+1;
Cleardevice;
setcolor(blue);
postr(A,o1,o2);
PieSlice(Round(A[o1].x),Round(A[o1].y), 0, 360, 5);
PieSlice(Round(A[o2].x),Round(A[o2].y), 0, 360, 5);
PieSlice(Round(A[t].x),Round(A[t].y), 0, 360, 3);
setcolor(15);
lin(A[t],A[o]);lin(A[t],A[ok]);
setcolor(4);
lin(A[o],A[ok]);
readkey;
s4:=false;
For i:=o1 too2-1 do
ifPeres(A[T],A[O],A[i],A[i+1]) or
Peres(A[T],A[Ok],A[i],A[i+1])then begin s4:=true; setcolor(green); lin(A[i],A[i+1]);
str(A[i].x,st);OuttextXY(400,300,st);
str(A[i].y,st);OuttextXY(400,310,st);
str(A[i+1].x,st);OuttextXY(400,320,st);
str(A[i+1].y,st);OuttextXY(400,330,st);
str(A[T].x,st);OuttextXY(400,340,st);
str(A[T].y,st);OuttextXY(400,350,st);
str(A[O].x,st);OuttextXY(400,360,st);
str(A[O].y,st);OuttextXY(400,370,st);
str(A[Ok].x,st);OuttextXY(400,380,st);
str(A[Ok].y,st);OuttextXY(400,390,st);
readkey end;
ifPeres(A[T],A[O],A[o2],A[o1]) or
Peres(A[T],A[Ok],A[o2],A[o1])then begin s4:=true; setcolor(green); lin(A[i],A[i+1]);readkey end;
if s4 thenA[O].r:=-A[O].r;
until(A[O].r>0) {or (j=t2)};
if A[O].r>0then
Begin {ЏҐаҐ¬ҐйҐ¬ в®зЄг ’ ў ®ў®Ґ Є®»мж®}
ClearDevice;
setcolor(4);
PieSlice(Round(A[o1].x),Round(A[o1].y), 0, 360, 3);
setcolor(1);
Postr(A,o1,o2);
PieSlice(Round(A[t].x),Round(A[t].y), 0, 360, 5);
Lin(A[o],A[ok]);
delay(3000);
A[0]:=A[T];
Sdvyg(A,t,t2);
O1:=t2;
t2:=t2-1;
Sdvyg(A,O1,O);{Ћбў®Ў®¤Ё«Ё п祩Єг ¤»п ®ў®© в®зЄЁ}
A[O]:=A[0];
schet;
readkey;
End
elseDanger:=true;
Cleardevice;
Postr(A,o1,o2);
Until Dangeror (t2=0);
Textcolor(4);
Writeln('ђҐ§г«мвв аЎ®вл Їа®Ја¬¬л');
If Danger thenbegin CloseGraph; Writeln('‘®Ґ¤ҐЁвм в®зЄЁ Ґў®§¬®¦®'); readln; end
else beginClearDevice;
Postr(A,o1,o2);
readkey;
Closegraph;
end;
END.
Список литературы
1. Фаронов Turbo Pascal 7.0.
2. Погорелов А.В.Геометрия: Учебное пособие для вузов. – 2-е изд. – М.: Наука. Главная редакцияфизико-математической литературы, 1984. – 288с.
3. Дискретнаяматематика для программистов / Новиков Ф. А. – Спб.: Питер, 2001. – 304 с.: ил.