Пример 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