Пример 5.4.
Из партии шин отобрать две шины, диаметры
которых отличаются не более, чем на D см, а
вес — не более, чем на W грамм.
Система тестов
N
теста
Проверяемый
случай
Данные
Результат
N
шины
Диаметр
Вес
Допуски
Otvet
диам.
вес
1
Есть такие шины
1234
10310099101
9810010199
1
1
"2-я и 3-я шины"
2
Нет таких шин
123
10098100
10010098
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.