Алгоритмы, реализуемые с помощью вложенных циклов типа ПОКА




Схема вложенных циклов типа пока:
 
 нц пока  <условие 1> 
   тело внешнего цикла 
   . . . . . . .
 нц пока  <условие 2> 
   тело внутренного цикла 
   . . . . . . 
 кц
   . . . . . . . 
 кц
 
Пример 5.1. Определить, имеется ли в заданном целочисленном массиве A(N) хотя бы одна пара совпадающих по значению чисел.
 
Система тестов
Номер 
теста
Проверяемый 
случай
Данные
Результат
N
Массив А
Otvet
1
2
Имеется
Не имеется
3
(1,3,2,3)
(1,2,3)
"Есть совпадающие числа"
"Нет совпадающих чисел"
Демонстрация
Школьный АЯ 
алг Равенство(арг цел N, арг цел таб A[1:N], 
                        рез лит Otvet)
нач цел i, j, лит Flag
  i:=1;  Flag:="Нет"
  нц пока (i<=N–1) и (Flag="Нет")
     | цикл по первому числу из пары
     j:=i+1
     нц пока (j<=N) и (Flag="Нет")
        | цикл по второму числу из пары
       если A[i]=A[j] | проверка равенства чисел
         то Flag:="Да"
         иначе  j:=j+1
       все
     кц
     i:=i+1
  кц 
  если Flag="Да"
     то Otvet:="Есть совпадающие числа"
     иначе  Otvet:="Нет совпадающих чисел"
  все
кон
Блок-схема (фрагмент)
Исполнение алгоритма
Обозначения проверяемых условий:
(i <= N-1) и (Flag = "Нет")  => (1)
(i <= N) и (Flag = "Нет")   => (2)
 
N теста
i
Flag
(1)
j
(2)
A[i]=A[j]
Otvet
 
 
 
 
1
1
 "Нет"
+
2
3
4
5
+
+
+
-(кц)
-
-
-
 
2
  "Да"
+
3
4
+
+
-(кц)
-
+
 
3
 
  -(кц)
 
 
 
"Есть совп.числа"
2
1
2
3
 "Нет"
+
+
-(кц)
2
3
4
3
4
+
+
-(кц)
+
-(кц)
-
-
-
 
 
 
 
 "Нет совп.чисел"
 
Turbo Pascal
Program Equal;
  Uses Crt;
  Type Mas = Array [1..20] of Integer;
  Var A       : Mas;
      i, j, N : Integer;
      Flag    : Boolean;
{------------------------------------------}
Procedure InputOutput; {Описание процедуры ввода-вывода данных}
 Begin ClrScr;
   Write('N = '); ReadLn(N);
   For i := 1 to N do
     begin Write('A[' , i , '] = ') ; ReadLn(A[i]) end;
   WriteLn; WriteLn('Массив А');
   For i := 1 to N do Write(A[i] : 4);
   WriteLn; WriteLn
 End; 
{------------------------------------------} 
Procedure Search(Var A:Mas; Var Flag:Boolean); {Описание процедуры} 
 Begin                                         {поиска решения    } 
   i:=1; Flag:= FALSE; 
   While (i<=N-1) and not Flag do   {цикл по первому числу из пары} 
    begin 
      j:=i+1; 
      While (j<=N) and not Flag do  {цикл по второму числу из пары} 
         If A[i]=A[j] then Flag:=TRUE else j:=j+1; 
      i:=i+1 
    end; 
 End; 
{------------------------------------------} 
BEGIN 
  InputOutput;     {вызов процедуры ввода-вывода данных  } 
  Search(A, Flag); {вызов процедуры поиска решения задачи} 
  WriteLn( 'О т в е т : '); 
  If Flag then WriteLn('Есть совпадающие числа.' ) 
          else WriteLn('Нет совпадающих чисел.'); 
  ReadLn 
END.
 
QBasic
CLS 
INPUT "N = ", N : DIM A(N)    ' ввод массива А
FOR i = 1 TO N PRINT "A(" ; i ; ") = " ;
  INPUT A(i)
NEXT i
PRINT : PRINT "Массив А"      ' вывод массива А
FOR i = 1 TO N
  PRINT A(i) ;
NEXT i : PRINT
i = 1 : Flag = 0            ' поиск совпадающих чисел
WHILE (i <= N - 1) AND (Flag = 0)
  j = i + 1
  WHILE (j <= N) AND (Flag = 0)
    IF A(i)=A(j) THEN Flag=1 ELSE j=j+1
 WEND
 i = i + 1
WEND
PRINT : PRINT "О т в е т :"
IF Flag = 1 THEN
    PRINT "Есть совпадающие числа."
  ELSE PRINT "Нет совпадающих чисел."
END IF
END
 
Пример 5.2. Дана целочисленная матрица A(N, N). Определить, имеются ли среди её элементов, лежащих ниже главной диагонали, отрицательные числа.
 
Система тестов
Номер 
теста
Проверяемый 
случай
Данные
Результат
N
Массив А
Otvet
1
Имеются
4
 1 -1  2  1
 2  3  1  0
 1 -1  2 -1
-2  1  0  1
 ''Есть отрицательные числа''
2
Не имеются
3
1 -1  2
1  0  1
2  1  1
''Нет отрицательных чисел''
Демонстрация
Школьный АЯ 
алг Ниже диагонали (арг цел N, арг цел таб
                   A[1:N, 1:N], рез лит Otvet) 
нач цел i, j, лит Flag 
  Flag:="Нет"; i:=2 
  нц пока (i< =N) и (Flag="Нет") | цикл по строкам
    j:=1 
    нц пока (j<i) и (Flag="Нет")
              | цикл по элементам строки 
      если A[i, j]<0 | условие прерывания циклов
         то Flag:="Да" 
         иначе  j:=j+1 | продвижение по строке 
      все
    кц
    i:=i+1 | переход на новую строку 
  кц 
 если Flag="Да"
  то Otvet:="Есть отрицательные ниже диагонали" 
  иначе Otvet:="Нет отрицательных ниже диагонали"
 все
кон 
Блок-схема (фрагмент) 
Исполнение алгоритма
Обозначения проверяемых условий:
(i <= N) и (Flag = "Нет")  => (1)
(j < i) и (Flag = "Нет")   => (2)
N теста
i
Flag
(1)
j
(2)
A[i]=A[j]
Otvet
 1
2
 "Нет"
+
1
2
+
-(кц)
-
 
3
"Да"
+
1
2
3
+
+
-(кц)
-
+
 
4
 
 -(кц)
 
 
 
"Есть отрицательные"
2
2
 "Нет"
+
1
2
+ 
-(кц)
-
 
3
 
+
1
2
3
+
+
-(кц)
-
-
 
4
 
-(кц)
 
 
 
"Нет отрицательных"
 
Turbo Pascal
Program UnderDiagonal; 
  Uses Crt; 
  Type Mas = Array [1..10, 1..10] of Integer; 
  Var A       : Mas; 
      N, i, j : Integer; 
      Flag    : Boolean; 
{-----------------------------------} 
Procedure InputOutput(Var A : Mas);  {описание процедуры } 
 Begin                               {ввода-вывода данных} 
  ClrScr; 
  Write('Количество строк и столбцов - '); ReadLn(N); 
  For i := 1 to N do 
    For j := 1 to N do 
      begin Write('A[' , i , ', ' , j , ']= ? '); 
            ReadLn(A[i, j]) 
      end; WriteLn;
  WriteLn('Матрица :'); 
  For i := 1 to N do 
   begin 
     For j := 1 to N do Write(A[i, j] : 5); 
     WriteLn 
   end; WriteLn 
End; { of InputOutput } 
{------------------------------------} 
Procedure Solution(Var A : Mas); {описание процедуры поиска решения} 
 Begin 
  i := 2 ; Flag := FALSE;
  While (i<=N) and not Flag do 
    begin 
      j:=1; 
      While (j<i) and not Flag do 
        If (A[i, j]<0) 
          then Flag:=TRUE 
          else j:=j+1; 
      i:=i+1 
    end; 
End; { of Solution } 
{--------------------------------------------} 
Procedure OutResult; 
Begin 
  WriteLn('О т в е т :'); 
  Write('Среди элементов, лежащих ниже главной диагонали, '); 
  If Flag then WriteLn('есть отрицательные.') 
          else WriteLn('нет отрицательных.'); 
  ReadLn 
End; { of OutResult } 
{--------------------------------------------} 
BEGIN 
  InputOutput(A); {вызов процедуры ввода-вывода данных } 
  Solution(A); {вызов процедуры поиска решения задачи} 
  OutResult {вызов процедуры вывода результата } 
END.
 
QBasic
CLS : INPUT "Количество строк и столбцов матрицы = ", N
DIM A(N, N)
FOR i = 1 TO N
  FOR j = 1 TO N
    PRINT "A(" ; i ; ", " ; j ; ") = " ;
    INPUT A(i, j)
  NEXT j
NEXT i
CLS : PRINT "Матрица А"
FOR i = 1 TO N
  FOR j = 1 TO N
    PRINT A(i, j);
  NEXT j : PRINT
NEXT i
i = 2 : Flag = 0
WHILE (i < = N) AND (Flag = 0)
  j = 1
  WHILE (j < i ) AND (Flag = 0)
    IF A(i, j) < 0 THEN Flag = 1 ELSE j = j + 1
  WEND
  i = i + 1
WEND
PRINT : PRINT "О т в е т :"
PRINT "Среди элементов матрицы, лежащих ниже главной диагонали, ";
IF Flag = 1 THEN
     PRINT "есть отрицательные."
  ELSE PRINT "нет отрицательных."
END IF
END
 
Пример 5.3. Выяснить, есть ли в баскетбольных командах "Спартак" и "Зенит" игроки одинакового роста.
 
Система тестов
  Обозначения:
  N -  количество игроков в команде "Спартак";
  M -  количество игроков в команде "Зенит";
  S(N) - массив ростов игроков команды "Спартак" (см);
  Z(N) - массив ростов игроков команды "Зенит" (см).
 
Номер теста
Проверяемый случай
Данные
Результат
Спартак
Зенит
 Otvet
N
S(N)
M
Z(M)
 1  Есть
3
200
195
205
4
198
200
206
192
"Есть игроки одинакового роста"
2
 Нет
2
200
195
2
198
201
"Нет игроков одинакового роста"
Демонстрация
Школьный АЯ 
алг Рост (арг цел N, M, арг целтаб S[1:N],
          Z[1:M], резлит Otvet) 
нач цел i, j, лит Flag  
  i:=1; Flag:="Нет" 
  нц пока (i<=N) и (Flag="Нет") 
         |цикл по игрокам "Спартака"  
    j:=1  
    нц пока (j<=M) и (Flag="Нет") 
         |цикл по игрокам "Зенита"  
      если S[i]=Z[j] |проверка равенства ростов  
        то Flag:="Да 
        иначе  j:=j+1  
      все 
    кц 
    i:=i+1  
  кц 
  если Flag="Да" 
    то Otvet:="Есть игроки одинакового роста 
    иначе Otvet:="Нет игроков одинакового роста 
  все 
кон 
Блок-схема (фрагмент) 
 Исполнение алгоритма
Обозначения проверяемых условий:
(i <= N) и (Flag = "Нет")  => (1)
 (j < i)  и (Flag = "Нет") => (2)
Номер  
теста
 i 
Flag
(1)
j
(2)
 S[i]=Z[j]
Otvet
1
1
 "Нет"  
 "Да"
+
 1 
 2
+
-
-(кц)
-
+
 
2
   -(кц)      
"Есть"
2
1
 "Нет"
+
1
2
3
+
+
-(кц)
-
-
 
2
 
+
1
2
3
+
+
-(кц)
-
-
 
3
 
-(кц)
     
"Нет"
 
Turbo Pascal
Program EqualHeight;
  Uses Crt;
  Type Mas = Array [1..20] of Integer;
  Var
    Spart, Zenit : Mas;     {массивы ростов игроков}
    N, M, i, j   : Integer; {N - к-во игроков "Спартака", M - "Зенита"}
    Flag         : Boolean;
    Name         : String;  {название команды}
{------------------------------------------}
Procedure Input(NCommand : Integer; Var Number : Integer; Var Rost:Mas);
               {NCommand - номер команды (равен 1 или 2)}
 Begin {описание процедуры ввода данных по команде}
    If NCommand=1 then Name:='Спартак' else Name:='Зенит';
    Write('Введите количество игроков команды ', Name, ': ');
    ReadLn(Number);
    WriteLn('Введите роста игроков:');
    For i := 1 to Number do
      begin Write(i, ' игрок - '); ReadLn(Rost[i]) end;
    WriteLn
 End;
{------------------------------------------}
Procedure Search; {описание процедуры поиска решения задачи}
 Begin
   i:=1; Flag:=FALSE;
   While (i<=N) and not Flag do {цикл по игрокам Спартака}
     begin
       j:=1;
       While (j<=M) and not Flag do {цикл по игрокам Зенита}
         If Spart[i]=Zenit[j] then Flag:=TRUE else j:=j+1;
       i:=i+1
     end;
 End;
{------------------------------------------------------------}
Procedure OutResult; {описание процедуры вывода результата}
  Begin
    Write('О т в е т : в командах Спартак и Зенит ');
    If Flag then Write('есть игроки ') else Write('нет игроков ');
    WriteLn('одинакового роста.');
    ReadLn
  End;
{------------------------------------------}
BEGIN ClrScr; {вызов процедур}
  Input(1, N, Spart); {ввод данных для первой команды}
  Input(2, M, Zenit); {ввод данных для второй команды}
  Search;             {поиск решения задачи}
  OutResult           {вывод результата}
END.
 
QBasic
CLS
INPUT "Введите количество игроков команды Спартак : " , N
DIM Spart(N)
PRINT "Введите роста игроков:"
FOR i = 1 TO N
  PRINT i ; " игрок - " ; : INPUT Spart(i)
NEXT i 
INPUT "Введите количество игроков команды Зенит : " , M
DIM Zenit(M)
PRINT "Введите роста игроков:"
FOR i = 1 TO M
  PRINT i ; " игрок - " : INPUT Zenit(i)
NEXT i 
i = 1 : Flag = 0
WHILE (i <= N) AND Flag = 0 'цикл по игрокам Спартака
  j = 1
  WHILE (j <= M) AND Flag = 0 'цикл по игрокам Зенита
    IF Spart(i) = Zenit(j) THEN Flag = 1 ELSE j = j + 1
  WEND
  i = i + 1
WEND 
PRINT "О т в е т : в командах Спартак и Зенит ";
IF Flag = 1 THEN PRINT "есть игроки "; ELSE PRINT "нет игроков ";
PRINT "одинакового роста."
END
 
Пример 5.4. Из партии шин отобрать две шины, диаметры которых отличаются не более, чем на D см, а вес — не более, чем на W грамм.
 
Система тестов
N теста
Проверяемый случай
Данные
Результат
N шины
Диаметр
Вес
Допуски
Otvet
диам.
вес
1
Есть такие шины
1
2
3
4
103
100
99
101
98
100
101
99
 1
 1
"2-я и 3-я шины"
 2
Нет таких шин
1
2
3
100
98
100
100
100
98
1
1
"Подходящих шин нет"
Демонстрация

Школьный АЯ

алг МоиШины (арг цел N, арг вещ таб Диам[1 : N] , Вес[1 : N] , 
             арг вещ ДопДиам, ДопВес, рез цел Шина1, Шина2, 
             рез лит Otvet) 
нач цел i, j, лит Flag 
  i:=1; Flag:="Нет" 
  нц пока (i< =N-1) и (Flag="Нет") | цикл по первой шине из пары 
    j:=i+1 
    нц пока (j< =N) и (Flag="Нет") | цикл по второй шине из пары 
      если (abs(Диам[i] - Диам[j]) <= ДопДиам)  | условие соче- 
          и (abs(Вес[i] - Вес[j]) <= ДопВес )   | таемости шин 
        то Flag:="Да"; Шина1:=i; Шина2:=j 
        иначе  j:=j+1 
      все 
    кц 
    i:=i+1 
  кц
  если Flag="Да" 
    то Otvet := "По параметрам подходят друг другу " 
             + Шина1 + "-ая и " + Шина2 + "-ая шины." 
    иначе  Otvet := "Шин, подходящих друг другу, в партии нет." 
  все
кон
Исполнение алгоритма 
Обозначения проверяемых условий:
(i <= N-1) и (Flag = "Нет")   => (1) 
(i < N) и (Flag = "Нет")    => (2) 
(abs(Диам[i] - Диам[j]) <= ДопДиам)  
и (abs(Вес[i] - Вес[j]) <= ДопВес) => (3) 
 
N теста
i
Flag
(1)
j
(2)
(3)
Шина 1
Шина 2
1
1
"Нет"
+
2
3
4
5
+
+
+
-(кц)
-
-
-
   
2
"Да"
+
3
+
-(кц)
+
2
3
3
 
-(кц)
         
 2
1
 
"Нет"
+
2
3
4
+
+
-(кц)
-
-
   
2
 
+
3
4
+
+
-
   
3
 
-(кц)
         
 
Блок-схема (фрагмент)
Turbo Pascal
Program MyTyres; 
  Uses Crt; 
  Type Mas = Array [1..100] of Real; 
  Var 
    Number, i, j     : Integer; { Number - количество шин    } 
    Diameter, Weight : Mas;     { массивы параметров шин     } 
    First, Second    : Integer; { номера отобранных шин      } 
    Flag             : Boolean; 
    D, W             : Real;    {D, W - допуски по параметрам} 
{-------------------------------------------------------} 
Procedure InputOutput; {описание процедуры ввода-вывода данных} 
 Begin 
  ClrScr; 
  Write('Количество шин : '); ReadLn(Number); 
  WriteLn('Параметры шин : '); 
  For i := 1 to Number do 
    begin 
      Write(i, '-ая шина: Диаметр - '); ReadLn(Diameter[i]); 
      Write('           Вес - ');  ReadLn(Weight[i]) 
    end; WriteLn;
  Write('Допуск по диаметру : '); ReadLn(D); 
  Write('Допуск по весу : ');     ReadLn(W); 
  WriteLn; WriteLn(' Пapаметры шин '); 
  WriteLn('N шины   Диаметр   Вес'); 
  For i := 1 to Number do 
    WriteLn(i:4, Diameter[i]:10:1, Weight[i]:10:1); 
  WriteLn 
End; { of InputOutput } 
{----------------------------------------------------------} 
Procedure YesNo(Var First, Second : Integer; Var Flag : Boolean); 
 Begin {описание процедуры поиска решения задачи} 
  i:=1;  Flag := FALSE; 
  While (i<=Number-1) and not Flag do {цикл по первой шине из пары} 
    begin 
      j := i+1; 
      While (j<=Number) and not Flag do {цикл по второй шине из пары} 

        If (Abs(Diameter[i]-Diameter[j]) <= D) 
            and (Abs(Weight[i]-Weight[j]) <= W) 
          then begin Flag:=TRUE; First:=i; Second:=j end 
          else j := j+1; 
      i:=i+1 
    end; 
End; {of YesNo } 
{----------------------------------------------------------} 
BEGIN 
  InputOutput; {Вызов процедуры ввода-вывода исходных данных} 
  YesNo(First, Second, Flag);{Вызов процедуры поиска решения задачи} 

  WriteLn('О т в е т :'); 
  If Flag then WriteLn('По параметрам подходят друг другу ', 
                       First, '-ая и ', Second, '-ая шины.') 
          else WriteLn('Шин, подходящих друг другу, в партии нет.'); 
  ReadLn 
END.
 
QBasic
CLS : INPUT "Количество шин : " , Number
DIM Diam, Weight(Number) 
PRINT "Параметры шин :"
FOR i = 1 TO Number
  PRINT i; "-ая шина: " ; : INPUT "Диаметр - " , Diam(i)
  PRINT TAB(14);
  INPUT " Вес - ", Weight(i)
NEXT i : PRINT 
INPUT "Допуск по диаметру : " , D
INPUT "Допуск по весу : " , W 
PRINT : PRINT TAB(11); "Пapаметры шин"
PRINT "N шины Диаметр Вес"
FOR i = 1 TO Number
  PRINT TAB(3) ; i , Diam(i) , Weight(i)
NEXT i : PRINT 
i = 1 : Flag = 0
WHILE (i <= Number-1) AND (Flag = 0)
  j = i + 1
  WHILE (j <= Number) AND (Flag = 0)
    IF (ABS(Diam(i)-Diam(j))<=D) AND (ABS(Weight(i)-Weight(j))<=W) THEN
         Flag = 1 : First = i : Second = j
       ELSE j = j + 1
    END IF
  WEND
  i = i + 1
WEND 
PRINT : PRINT "О т в е т :"
IF Flag = 1 THEN
      PRINT "По параметрам подходят друг другу ";
      PRINT First; "-ая и "; Second; "-ая шины."
  ELSE PRINT "Шин, подходящих друг другу, нет."
END IF
END


Задачи для самостоятельного решения

5.1. [Pascal | Basic] В заданной целочисленной матрице A(N,M) вывести на печать индексы первого положительного элемента, кратного заданному числу K. Если таких элементов в матрице нет, то вывести соответствующий текст.
Элементы матриц просматривать слева направо и сверху вниз.

5.2. [Pascal | Basic] В заданной целочисленной матрице A(N,M) заменить первый отрицательный элемент максимальным элементом матрицы. Если отрицательных элементов нет, то вывести соответствующий текст.
Элементы матриц просматривать слева направо и сверху вниз.

5.3. [Pascal | Basic] Из заданной матрицы A(N,N) удалить строку, в которой находится первый отрицательный элемент. Элементы матриц просматривать слева направо и сверху вниз.

5.4. [Pascal | Basic] В заданной матрице A(N,N) найти индексы первого элемента, превосходящего среднее арифметическое всех элементов. Элементы матриц просматривать слева направо и сверху вниз.

5.5. [Pascal | Basic] Из заданной матрицы A(N,N) удалить строку и столбец, в которых находится первый элемент, равный нулю. Полученную матрицу уплотнить. Элементы матриц просматривать слева направо и сверху вниз.

5.6. [Pascal | Basic] Если в заданной матрице A(N,N) есть хотя бы один элемент, больший ста, то элементы обеих диагоналей заменить нулями.

5.7. [Pascal | Basic] Дана целочисленная матрица А(N,N). Найти номер первой из её строк, которые начинаются с К положительных чисел подряд.

5.8. [Pascal | Basic] Элементы заданной матрицы A(N,N) переписывать построчно в одномерный массив до тех пор, пока не встретится нулевой элемент.

5.9. [Pascal | Basic] Заданное натуральное число M представить в виде суммы  квадратов двух неравных натуральных чисел. В случае, если это невозможно, вывести соответствующее сообщение.

5.10. [Pascal | Basic] Дана целочисленная матрица А(N,N). Просматривая её элементы в заданном порядке, найти первый чётный элемент и поменять его местами с диагональным элементом той строки, в которой он находится. Порядок просмотра:
  а) сверху вниз и справа налево;
  б) снизу вверх и слева направо;
  в) справа налево и снизу вверх.

5.11. [Pascal | Basic] Проверить, удовлетворяет ли заданная матрица A(N,N) следующему условию: для всех i >1 и для всех j >1 верно неравенство

ai j >= ai–1, j + ai, j–1 .

5.12. [Pascal | Basic] В заданном множестве точек на плоскости найти пару  точек, удалённых друг от друга на расстояние, большее заданного D.

5.13. [Pascal | Basic] Для заданной матрицы A(N,N) найти хотя бы одно k,   такое, что k-ая строка матрицы совпадает с k-м столбцом.

5.14. [Pascal | Basic] Даны три целочисленных массива A(N), B(M) и C(L).   Найти хотя бы одно число, встречающееся во всех трех массивах. Если   таких чисел нет, выдать соответствующее сообщение.

5.15. [Pascal | Basic] Выбрать три различные точки из заданного множества точек на плоскости так, чтобы внутри треугольника с вершинами в выбранных точках лежала ровно одна точка.

5.16. [Pascal | Basic] В школе имеется три параллельных десятых класса. Даны списки десятиклассников, содержащие фамилию и имя каждого ученика. Выяснить:
  а) в каких классах имеются однофамильцы;
  б) в каких классах имеются тезки;
  в) имеются ли в параллельных десятых классах однофамильцы;
  г) в каких классах имеются ученики, у которых совпадают и имя и фамилия;
  д) есть ли в десятых классах однофамильцы первого космонавта.

5.17. [Pascal | Basic] В детском саду есть N мячей. Имеются сведения о диаметре и цвете каждого мяча. Выяснить:
  а) есть ли среди мячей такой, что он не пройдет в квадратное окошко площадью 900 см2.;
  б) есть ли мячи одинакового цвета или диаметра;
  в) есть ли среди красных мячей такой, что его диаметр превосходит средний диаметр всех мячей.

5.18*. [Pascal | Basic] В заданном множестве точек на плоскости найти три точки, которые могут служить вершинами остроугольного треугольника.

5.19*. [Pascal | Basic] В заданном множестве точек на плоскости найти четыре точки, которые могут служить вершинами квадрата.

5.20*. [Pascal | Basic] В заданном множестве точек на плоскости найти четыре точки, которые могут служить вершинами ромба.

5.21*. [Pascal | Basic] В заданном множестве точек на плоскости найти четыре точки, которые могут служить вершинами выпуклого четырёхугольника.