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




Схема вложенных циклов типа пока:
 
 нц пока  <условие 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(Number), 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 | C | Basic]   В заданной целочисленной матрице A(N, M) выведите на печать индексы первого положительного элемента, кратного заданному числу K. Если таких элементов в матрице нет, то выведите соответствующий текст. Элементы матриц просматривайте слева направо и сверху вниз.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5.22. [Pascal | C | Basic]  Дана целочисленная квадратная матрица A(N, N). Проверьте, являются ли все числа, расположенные выше главной и побочной диагоналей:
   а) различными;
   б) одинаковыми.

5.23. [Pascal | C | Basic]   Дана целочисленная квадратная матрица A(N, N). Определите, имеется ли среди элементов, расположенных ниже ее главной и побочной диагоналей хотя бы одно составное двузначное число.

5.24. [Pascal | C | Basic]   На плоскости даны две точки А(1, 1) и В(8, 1), а также N точек со своими координатами. Определитe, есть ли среди этих N точек хотя бы одна пара точек, которые являлись бы вершинами трапеции с большим основанием АВ.

5.25*. [Pascal | C | Basic]   Дана квадpатная таблица А(N, N), элементами котоpой являются нули и единицы. Установите наличие в ней квадpата, строны которого состоят из М единиц (M<=N) и параллельны строкам или столбцам таблицы. Если такой квадpат найдется, то нужно вывести кооpдинаты его веpхнего левого угла.

5.26*. [Pascal | C | Basic]   Известно, что в пачке банкнот есть одна фальшивая банкнота и ее подлинник, серии и номера которых совпадают. Найдите эти банкноты в пачке, замените их двумя резервными банкнотами с известными сериями и номерами, и затем перенумеруйте всю пачку, расположив банкноты в соответствии с алфавитным порядком их серий, а банкноты с одинаковыми сериями — по возрастанию номеров.

5.27*. [Pascal | C | Basic]   Имеется список учеников класса (все фамилии различны). Каждый ученик представил список одноклассников, у которых он был в гостях. Определите:
   а) есть ли в классе ученик, который побывал в гостях у всех одноклассников, кроме одного;
   б) есть ли в классе хотя бы одна пара учеников, которые не были в гостях друг у друга.