Цикл типа пока без прерывания
Язык
| Пример
| Пояснения
| Алгоритмический язык
| i:=1; S:=0
нц пока i<=N
S:=S+A[i]
i:=i+2
кц
| Вычисляется сумма
элементов массива
| Pascal
| i:=1; S:=0;
While i<=N do
begin S:=S+A[i];
i:=i+2;
end;
| A(N) с нечетными индексами.Число таких элементовзаранее известно. Шагпараметра цикла равен
Двум
| Для организации циклов типа пока можно также использовать:
• в языке Pascal оператор цикла с постусловием Repeat...until:
Repeat
тело цикла
until <условие
завершения>
| Повторять тело цикла до тех пор, пока не
выполнится условие завершения цикла.
|
Пример 4.1. Определить, является ли заданная последовательность чисел a1, a2,..., aN монотонно убывающей.
Система тестов
Номер теста
| Проверяемый
случай
| Данные
| Результат
| N
| Вектор А
| Otvet
|
| Является
|
| (3, 2, 1)
| 'Да'
|
| Не является
|
| (2, 3, 1)
| 'Нет'
|
Алгоритмический язык
алг Убывание (арг цел N, арг вещ таб A[1:N], рез лит Otvet)
нач цел i
i:=1; Otvet:="Да" Блок-схема
нц пока (i<=N–1) и (Otvet="Да") (фрагмент)
если A[i] < A[i+1]
то Otvet:= "Нет"
иначе i:=i+1
Все
Кц
Кон
Исполнение алгоритма
Обозначения проверяемых условий:
(i <= N-1) и (Otvet = "Да") => (1)
A[i] < A[i+1] => (2)
Номер теста
| i
| Otvet
| (1)
| (2)
|
|
3
| "Да"
| +
+
-
(кц)
| -
-
|
| 1
| "Да"
"Нет"
| +
-
(кц)
| +
|
Turbo Pascal
Program Decrease;
Uses Crt;
Var A: Array [1..10] of Real;
N, i: Integer;
Otvet: Boolean;
{--------------------------------------------}
Procedure InputOutput; {описание процедуры ввода-вывода данных}
Begin
ClrScr;
Write(’Количество элементов - ’); 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]: 5: 1);
WriteLn;
End; { of InputOutput }
{--------------------------------------------}
Procedure Processing(Var Otvet: Boolean);
Begin {описание процедуры проверки на убывание элементов}
Otvet:= TRUE; i:=1;
While (i<=N–1) and Otvet do
If (A[i]<A[i+1]) then Otvet:= FALSE
else i:= i+1;
End; { of Processing }
{--------------------------------------------}
Procedure Result(Otvet: Boolean); {описание процедуры вывода результата}
Begin
If Otvet then Write(’образует ’)
else Write(’не образует ’);
WriteLn(’монотонно убывающую последовательность.’);
ReadLn;
End;
{--------------------------------------------}
BEGIN
InputOutput; {вызов процедуры ввода-вывода}
Processing(Otvet); {вызов процедуры проверки на убывание}
Result(Otvet); {вызов процедуры вывода результата}
END.
Пример 4.2. Задано множество точек на плоскости. Oпределить, принадлежит ли хотя бы одна точка множества внутренней области круга с центром в точке (a, b) и радиусом R.
Система тестов
Номер теста
| Проверяемый
случай
| Данные
| Результат
| A
| B
| R
| Кол.
точек
| Координаты
точек
| Otvet
| 1
| Принадлежит
| 1
| 0
| 2
| 3
| X=(-1, 2, 3)
Y=(2, 1, 2)
| "Да"
| 2
| Не
принадлежит
| 1
| 0
| 2
| 2
| X=(-1, 3)
Y=(2, 2)
| "Нет"
| Алгоритмический язык
алг Точки (арг цел N, арг вещ таб X [1: N], Y [1: N], арг вещ a, b, R, рез лит Otvet)
нач цел i
i:=1; Otvet:="Нет"
нц пока (i<=N) и (Otvet="Нет") | условие продолжения цикла
если (X[i]-a)**2 + (Y[i]-b)**2 <R*R | условие прерывания цикла
то Otvet:= "Да"
иначе i:=i+1
все Блок-схема
кц
Кон
Исполнение алгоритма
Обозначения проверяемых условий:
(i <= N) и (Otvet = "Нет") => (1)
(X[i]-1)**2 + (Y[i]-b)**2 < R*R => (2)
Номер теста
| i
| Otvet
| (1)
| (2)
|
|
3
| "Нет"
"Да"
| +
+
-
(кц)
| -
+
|
|
3
| "Нет"
| +
+
-
(кц)
| -
-
| Turbo Pascal
Program SetOfPoints;
Uses Crt;
Type Mas = Array [1..20] of Real;
Var X, Y: Mas; {массивы координат точек }
i, NPoints: Integer; {NPoints – количество точек}
a, b, Radius: Real; {координаты центра и радиус}
Flag: Boolean;
{--------------------------------------------}
Procedure Input; {описание процедуры ввода данных}
Begin
ClrScr;
Write(’Введите координаты центра круга: ’); ReadLn(a, b);
Write(’Введите радиус круга: ’); ReadLn(Radius);
Write(’Введите количество точек: ’); ReadLn(NPoints);
For i:= 1 to NPoints do
begin
WriteLn(i: 4, ’-ая точка ’);
Write(’X = ’); ReadLn(X[i]);
Write(’Y = ’); ReadLn(Y[i]);
end; WriteLn;
End; {of Input}
{--------------------------------------------}
Procedure Inside(Var Flag: Boolean); {описание процедуры проверки }
Begin {принадлежности точек области}
Flag:= FALSE; i:= 1;
While (i<=NPoints) and not Flag do
If Sqr(X[i]–a)+Sqr(Y[i]–b) < Sqr(Radius) {Sqr – возведение в квадрат}
then Flag:= TRUE
else i:=i+1;
End; {of Inside}
{--------------------------------------------}
Procedure Output(Flag: Boolean); {описание процедуры }
Begin {вывода результатов }
Write(’О т в е т: в множестве точек ’);
If Flag then WriteLn(’cодержатся’)
else WriteLn(’не содержатся’);
WriteLn(’ точки, принадлежащие заданной области.’);
ReadLn;
End; {of Output}
{--------------------------------------------}
BEGIN
Input; {вызов процедуры ввода данных }
Inside(Flag); {вызов процедуры проверки принадлежности}
Output(Flag); {вызов процедуры вывода результатов }
END.
Не нашли, что искали? Воспользуйтесь поиском:
|