Главная страница
Финансы
Экономика
Математика
Начальные классы
Биология
Информатика
Дошкольное образование
Медицина
Сельское хозяйство
Ветеринария
Воспитательная работа
История
Вычислительная техника
Логика
Этика
Философия
Религия
Физика
Русский язык и литература
Социология
Политология
Языкознание
Языки
Юриспруденция
Право
Другое
Иностранные языки
образование
Доп
Технология
Строительство
Физкультура
Энергетика
Промышленность
Автоматика
Электротехника
Классному руководителю
Связь
Химия
География
Логопедия
Геология
Искусство
Культура
ИЗО, МХК
Экология
Школьному психологу
Обществознание
Директору, завучу
Казахский язык и лит
ОБЖ
Социальному педагогу
Языки народов РФ
Музыка
Механика
Украинский язык
Астрономия
Психология

Лекциям по курсу Информатика


Скачать 3.84 Mb.
НазваниеЛекциям по курсу Информатика
Анкорlekcii_shiryaevoy.pdf
Дата11.07.2018
Размер3.84 Mb.
Формат файлаpdf
Имя файлаlekcii_shiryaevoy.pdf
ТипЛекция
#19640
страница4 из 9
1   2   3   4   5   6   7   8   9
Какое условие указывать первым во вложенном операторе?
Все зависит от входных данных — в нашем случае это нора. Но норы бывают разными
Рис. 8.5. Нора: модель 2 87

Вернемся к плохому решению
Ищем зайца (три условных оператора)
1
if зверь = заяц then
Writeln(’Даем морковку’);
2
if зверь = мышь then
Writeln(’Даем сыр’);
3
if зверь = лиса then
Writeln(’Даем мясо’);
Проследим за работой трех условных операторов.
Рис. 8.6. Одна нора. В норе живет только один зверь!
Ищем зайца (I условный оператор)
1
if зверь = заяц then
Writeln(’Даем морковку’);
Рис. 8.7. Ищем зайца! Нашли
88

Ищем зайца (три условных оператора)
1
if зверь = заяц then
Writeln(’Даем морковку’);
2
if зверь = мышь then
Writeln(’Даем сыр’);
3
if зверь = лиса then
Writeln(’Даем мясо’);
Ищем зайца (II условный оператор)
2
if зверь = мышь then
Writeln(’Даем сыр’);
=
?
Рис. 8.8. Зайца нашли, но остановиться не можем!
89

Ищем зайца (три условных оператора)
1
if зверь = заяц then
Writeln(’Даем морковку’);
2
if зверь = мышь then
Writeln(’Даем сыр’);
3
if зверь = лиса then
Writeln(’Даем мясо’);
Ищем зайца (III условный оператор)
3
if зверь = лиса then
Writeln(’Даем мясо’);
=
?
Рис. 8.9. Зайца нашли, но мы упорные!
90

При вложенности операторов if компилятор «считает», что каждому else соответствует ближайшее предшествующее if.
IF-THEN-ELSE in IF-THEN
if x = 1 then if y > x then Writeln(’x=1, y>x’)
else Writeln(’x=1, y<=x’);
IF-THEN in IF-THEN-ELSE
if x = 1 then begin if y > x then Writeln(’x=1, y>x’)
end else Writeln(’x<>1’);
IF-THEN-ELSE in IF-THEN-ELSE
if x = 1 then if y > x then
Writeln(’x=1, y>x’)
else Writeln(’x=1, y<=x’)
else Writeln(’x<>1’);
91

7.9
Решение задач
Пример 9.1. Найти [x] (целая часть действительного числа x).
Решение. Целая часть [x] (x ∈ R) — наибольшее целое, не превосходящее x:
3.14 -3.14 3.64 -3.64
[x]
3
-4 3
-4
Trunc
3
-3 3
-3
Round
3
-3 4
-4
[x]
var x : Real;
n : Integer;
begin
... (* Ввод x *)
n := Trunc(x);
if n > x then n := n - 1;
WriteLn(’[x]=’, n);
end.
Пример 9.2. Проверить, не приведет ли сложение двух натуральных чисел к переполнению. В программе использовать только переменные целого типа.
Неверный алгоритм var i1, i2
: Integer;
begin i1 := High(Integer)-1;
Writeln(’i1 = ’, i1);
i2 := 2;
Writeln(’i2 = ’, i2);
Write(’Overflow = ’);
if i1 + i2 > MaxInt then Writeln(’Yes’) else
Writeln(’No’);
end.
Результат работы неверной программы в Delphi:
i1 = 2147483646
i2 = 2
Overflow = No
Замена условия i1 + i2 > MaxInt на i1 > MaxInt - i2
даст верный результат (
проверьте!
).
92

Проверить, не приведет ли умножение двух заданных натуральных чисел к переполнению.
Пример 9.3 (вычисление значения по формуле). Даны числа a, b ∈ Z. Найти y =
max(a, b)
a − b
+

a + b.
(9.3)
Решение. Определяем значения переменных a и b, при которых возможна ава- рийная остановка программы:
— знаменатель:
a − b = 0 или a = b;


0:
a + b
0 или a
−b.
1 способ. Будем проверять оба условия сразу и вычислять требуемое выраже- ние только в случае, если они оба выполняются.
Алгоритм 1
Если либо a = b, либо a < -b, то
Выдать сообщение "ошибка вычисления"
иначе (т.е. если a <> b и a >= -b)
1. Вычислить максимум.
2. Посчитать значение выражения по формуле;
Программа 1 1
program Ex3_8a;
2
var a, b, Max : Integer;
3
y
: Real;
4
begin
5
Write(’Введите целые a, b
[> ’);
ReadLn(a, b);
6
if
(a = b) or (a <- b) then
WriteLn(’Ошибка’)
7
else
8
begin
9
if a > b then
Max := a else
Max := b;
10
y := Max / (a - b) + Sqrt(a + b);
11
WriteLn(’y = ’, y:6:3);
12
end;
13
end.
93

2 способ. Будем определять причину ошибочных вычислений и сообщать об этом пользователю. В этом случае условия проверяются по порядку, но все равно требуемое выражение вычисляется только в случае, если оба условия выполняются.
Алгоритм 2
Если a = b, то
Выдать сообщение "Ошибка: x=0 в y/x";
иначе (т.е. если a <> b)
если a < -b, то
Выдать сообщение "Ошибка: x<0 в sqrt(x)";
иначе (т.е. если a <> b и a >= -b)
1. Вычислить максимум.
2. Посчитать значение выражения по формуле;
Программа 2 1
program Ex3_8b;
2
var a, b, Max : Integer;
3
y
: Real;
4
begin
5
Write(’Введите целые a, b
[> ’);
ReadLn(a, b);
6
if a = b then
WriteLn(’Ошибка: x=0 в y/x’)
7
else
8
if a <- b then
WriteLn(’Ошибка: x<0 в sqrt(x)’)
9
else
10
begin
11
if a > b then
Max := a else
Max := b;
12
y := Max / (a - b) + Sqrt(a + b);
13
WriteLn(’y = ’, y:6:3);
14
end;
15
end.
94

Тестирование обеих программ проведем для одних и тех же наборов данных.
Запишем ожидаемые результаты:
№ 1. a = b = 3. Ошибка вычисления:
y =
max(a, b)
a − b
+

a + b =
max(. . . )
3 − 3
+ . . .
№ 2. a = 3, b = −4. Ошибка вычисления:
y = · · · +

3 − 4
№ 3. a = 3, b = −3. Ответ: y = 0,5.
№ 4. a = 4, b = 5. Ответ: y = −2.
Набор a
b
Результат работы Результат работы данных программы 1
программы 2
№ 1 3
3
Ошибка
Ошибка: x=0 в y/x
№ 2 3
−4
Ошибка
Ошибка: x<0 в sqrt(x)
№ 3 3
−3
y =
0.500
y =
0.500
№ 4 4
5
y = -2.000
y = -2.000 95

7.10
Оператор выбора
7.10.1
Синтаксис оператора выбора case Переключатель of
C1 : оператор1;
C2 : begin оператор2;
оператор3;...;
end;
C3, C4 : оператор4;
else операторN;
end;
Переключатель — выражение порядкового типа, его значение отыскивается сре- ди констант C1, C2,. . .
Операторы ветви else служат для «защиты» оператора case от недопустимых значений. Cокращенная форма оператора не содержит ветви else.
БНФ-нотация:
<оператор варианта> ::= case <выражение> of
<элемент списка вариантов>
{; <элемент списка вариантов>} end
<элемент списка вариантов> ::= <список меток варианта> :
<оператор> | <пусто>
<список меток варианта> ::= <метка варианта>
{, <метка варианта> }
<метка варианта> ::= <константа>
Построить синтаксическую диаграмму для оператора варианта.
96

Пример 10.1. Основными цветами моделей RGB и CMYK являются
R
G
B
C
M
Y
K
Red Green Blue Cyan Magenta Yellow BlacK
Решение. Пусть C: char;
RGB or CMYK
1
Readln(C);
2
case C of
3
’r’,’g’,’b’:
Writeln(’RGB’);
4
’c’,’m’,’y’,’k’:
Writeln(’CMYK’);
5
else
6
Writeln(’Illegal symbol’);
7
end;
97

Пример 10.2. Даны x ∈ R, n ∈ Z. Вычислить значение y по схеме:
если n = 0 :
y = x;
если n = 1 :
если x = 0, то y = 1/x, иначе y = 0;
если n = 2, 3 : y = x
2
;
если n = 4 :
y = sin x.
(10.4)
Оператор выбора
1
case N of
2 0:
y := x;
3 1:
if x <> 0
then
4
y := 1 / x
5
else y := 0;
6 2, 3:
y := x * x;
7 4:
y := sin(x);
8
end;
Громоздкая конструкция
1
if N = 0 then y := x
2
else
3
if N = 1 then
4
if x <> 0
then y := 1 / x
5
else y := 0 6
else
7
if (N = 2) or (N = 3) then y := x * x
8
else
9
if N = 4 then y := sin(x);
98

7.11
Раздел меток и оператор перехода
7.11.1
Раздел меток
Любой оператор программы можно выделить, поставив перед ним через двое- точие метку (тем самым появляется возможность ссылаться на эту метку в опе- раторе перехода). Однако такая метка, прежде чем ее использовать, должна быть определена в разделе (описания) меток :
<раздел меток> ::= <пусто> | label <метка> {, <метка>};
В современном Паскале (в классическом только целое без знака)
<метка> ::= <идентификатор> | <целое без знака>
Целые числа из диапазона: 0..9999.
Повторение метки внутри одного блока недопустимо. Каждая метка должна быть описана в разделе описаний того блока, в котором она используется.
7.11.2
Помеченный оператор
<помеченный оператор> ::= <метка>: <непомеченный оператор>
<непомеченный оператор> ::= <простой оператор> |
<сложный оператор>
<простой оператор> ::= <оператор присваивания> |
<оператор процедуры> |
<оператор перехода> |
<пустой оператор>
<сложный оператор> ::= <составной оператор> |
<выбирающий оператор> |
<оператор цикла> |
<оператор присоединения>
99

7.11.3
Оператор перехода
Оператор перехода — это простой оператор, указывающий, что дальнейшая работа должна продолжаться с другого места текста программы, а именно с ме- ста, где находится метка. Оператор имеет вид:
<оператор перехода> ::= goto <метка>
Внимание:
действие перехода внутрь сложного оператора извне не определя- ется. Транслятор такие ошибки обнаруживает не всегда.
Назначение оператора перехода — нарушить естественный порядок выполне- ния операторов, передавая управление оператору, помеченному указанной мет- кой.
Оператор перехода не принадлежит набору логических (управляющих)
структур, поэтому может нарушать структурную целостность и нагляд- ность алгоритмов.
Ограничения, связанные с использованием меток:
1. Область действия метки — это процедура, внутри которой она определяется,
поэтому переход внутрь процедуры невозможен.
2. Каждая метка должна быть задана в описании меток в заголовке той про- цедуры, где этой меткой маркируется некоторый оператор.
100

7.11.4
Примеры использования оператора перехода (08.10.2010)
Метки и оператор перехода label 4, 5, 6, DFD;
begin goto 6;
4: Writeln(’Label 4’);
5: Writeln(’Label 5’);
6: Writeln(’Label 56’);
DFD: Writeln(’Label DFD’);
end.
Результат:
Label 56
Label DFD
Неправильное использование оператора перехода (метка внутри блока):
Ошибка: метка внутри сложного оператора program DemoLabel;
label 3;
var i1, i : Integer;
begin goto 3;
for i := 1 to 5 do begin i1 := 2 * i;
3: i1 := 3 * i;
Writeln(i, ’ ’, i1);
end;
Writeln(i1);
end.
Проверьте результат работы программы DemoLabel.
101

Неправильное использование оператора перехода (метка внутри блока, цикл бесконечный):
Ошибка: метка внутри сложного оператора label 3;
var i1, i : Integer;
begin for i := 1 to 5 do begin i1 := 2 * i;
3: i1 := 3 * i;
Writeln(i, ’ ’, i1);
end;
goto 3;
Writeln(i1);
end.
102

7.12
Безусловные процедуры
В Turbo Pascal существуют четыре безусловные процедуры
:
Break — позволяет досрочно закончить цикл (см. пример
8.8
на с.
162
);
Continue — позволяет начать новую итерацию цикла, не дожидаясь окончания предыдущей итерации;
Exit — позволяет завершить работу текущего программного блока (програм- му, процедуру) (см. примеры в разделе
7.12.1
на с.
104
);
Halt[(n)] — позволяет завершить программу с кодом завершения n (n ∈ Z)
(см. примеры в разделе
7.12.2
на с.
107
).
Данный код может быть проанализирован системой с помощью инструкции IF ERRORLEVEL
в командном файле DOS, или с помощью функции ExitCode модуля Dos. Значение n = 0 соответствует нормальному завершению работы программы. Вызов процедуры
Halt без параметра эквивалентен вызову Halt(0).
103

7.12.1
Примеры завершения работы текущего программного блока
Пример 12.1. Три раза выдавать запрос на ввод числа k. Печатать значение произведения 100k. Если k = 0, то осуществить выход из программы.
Демонстрация вызова процедуры Exit из программы
1
program DemoExit1;
2
var i, k : Integer;
3
begin
4
for i := 1 to 3 do
5
begin
6
Write(’[> ’); Readln(k);
7
if k = 0 then Exit;
8
Writeln(100*k);
9
end;
10
Write(’- end -’);
11
end.
Результат работы программы:
последовательно вводятся значения 6, 5, 8 (нор- мальное завершение программы).
[> 6 600
[> 4 400
[> 8 800
- end -
Результат работы программы:
последовательно вводятся значения 6, 0 (завер- шение программы по условию «k=0», см. строка 7 программы).
[> 6 600
[> 0
_
104

Пример 12.2. Решим предыдущую задачу с использованием подпрограммы.
Оформим операторы из строк 7 и 8
Операторы из предыдущей программы
7
if k = 0 then Exit;
8
Writeln(100*k);
в виде отдельной подпрограммы.
Демонстрация вызова процедуры Exit в подпрограмме
1
program DemoExit2;
2
procedure Demo(s: Integer);
3
begin
4
if s = 0 then Exit;
5
Writeln(s*100);
6
end;
7 8
var i, k : Integer;
9
begin
10
for i := 1 to 3 do
11
begin
12
Write(’[> ’); Readln(k);
13
Demo(k);
14
end;
15
Writeln(’- end -’);
16
end.
Результат работы программы:
Входные данные:
4, 7, 2 (нормальное завершение подпрограммы и программы).
[> 4 400
[> 7 700
[> 2 200
- end -
105

Входные данные:
4, 0, 7 (завершение подпрограммы по условию «k=0», нормаль- ное завершение программы).
[> 4 400
[> 0
[> 7 700
- end -
Входные данные:
0, 0, 0 («тройное» завершение подпрограммы по условию «k=0»,
нормальное завершение программы).
[> 0
[> 0
[> 0
- end -
106

7.12.2
Примеры завершения работы программы
Пример 12.3. Заменим в программе из примера
12.1
оператор процедуры Exit на Halt.
Демонстрация вызова процедуры Halt в программе
1
program DemoHalt1;
2 3
if k = 0 then Halt;
4
Результат работы программы:
[> 6 600
[> 0
_
Пример 12.4. Заменим в подпрограмме из примера
12.2
оператор процедуры
Exit на Halt.
Демонстрация вызова процедуры Halt в подпрограмме
1
program DemoHalt2;
2
procedure Demo(s: Integer);
3
begin
4
if s = 0 then Halt;
5
Writeln(s*100);
6
end;
7
Результат работы программы:
Входные данные:
4, 0 (завершение программы по условию «k=0»).
[> 4 400
[> 0
_
107

Глава 8
Организация циклических процессов
8.1
Циклы
Циклическим алгоритмом (циклом)
называется алгоритм, у которого выполнение последовательности инструкций осуществляется многократно с одними и теми же или модифицированными данными.
заголовок цикла и
тело цикла
Тело цикла
— последовательность инструкций, предназначенная для мно- гократного исполнения.
Однократное выполнение тела цикла называется итерацией.
Если в теле цикла S
0
имеется оператор цикла S
1
, то оператор цикла S
0
назы- вается объемлющим (внешним)
для оператора S
1
, а оператор S
1

вложен- ным (внутренним)
в цикл S
0
. Например,
S
0
<заголовок внешнего цикла>
<тело внешнего цикла = вложенный цикл>
S
1
Телом цикла может быть составной оператор.
108

Пример 1.1. Абракадабра — это любое непонятное слово или непонятный набор слов, бессмыслица.
Абракадабра
(лат. abracadabra) — магическое слово, которое еще с конца
II века предлагалось использовать для лечения малярии, сенной лихорадки и других болезней.
Кстати, название «сенная лихорадка» появилось в 1819 году с подачи англий- ского врача, связывающего симптомы этой болезни с сеном. Позже (1873 г.) бы- ло доказано, что причиной возникновения сенной лихорадки является пыльца растений (см. рис.
1.1
). Современное название «сенной лихорадки» поллиноз.
Рис. 1.1. Пыльца
Способ использования заклинания «abracadabra»: слово выписывалось столбиком на дощечке или бумаге 11 раз следующим образом:
A B R A C A D A B R A
A B R A C A D A B R
A B R A C A D A B
A B R A C A D A
A B R A C A D
A B R A C A
A B R A C
A B R A
A B R
A B
A
Постепенное укорачивание этого слова должно бы- ло уничтожать силу злого духа, и больной, надевая амулет, должен был постепенно выздоравливать.
109

Пример вложенности циклов
1
program Abracadabra;
2
var i,j,n : Integer;
3
s
: string;
4
begin
5
s := ’ABRACADABRA’;
6
n := Length(s);
7
for i := 1 to n do
8
begin
9
Write(’’:i-1);
// увеличивающиеся пробелы
10
for j := 1 to n-i+1 do
Write(s[j]:2);
11
Writeln;
12
end;
13
end.
Результат работы программы:
110

Заголовок цикла задает правила, определяющие сколько раз нужно вы- полнить тело цикла.
Выражение определяющее, будет в очередной раз выполняться итерация или цикл завершится, называется условием окончания цикла | условием продолжения в зависимости от того, как интерпретируется его истинность — как признак необходимости завершения или продолжения цикла.
Условие
Оператор
Условие
Оператор
Рис. 1.2. Блок-схемы циклов с условиями продолжения и окончания
Переменная, хранящая текущий номер итерации, называется счётчиком ите- раций цикла или просто счётчиком цикла
Существуют различные способы определения заголовка цикла. В заголовок лю- бого цикла входит переменная, управляющая циклом (
параметр цик- ла
). Значение этой переменной определяет, будет ли выполнено тело цикла.
Не следует путать понятия «счётчик цикла» и «параметр цикла».
Счётчик цикла может отсутствовать, а параметр цикла всегда присутствует в цикле (и в заголовке, и в теле).
Циклы с выходом из середины (Break, Continue) (см. пример
8.8
на с.
162
).
111

Два основных вида циклов.
1. Арифметические циклы (циклы с известным числом повторений).
Явно задается управляющая количеством повторений переменная, ее началь- ное и конечное значения и шаг изменения.
Пример. y
1
+ y
2
+ . . . + y n
=
n i=1
y i
2. Итеративные
1
циклы (циклы с неизвестным числом повторений). Часто они реализуют какой-либо процесс последовательных приближений. Заверша- ется он при условии, что некоторая величина становится (по модулю) доста- точно малой.
Пример. Итерационная формула Герона:
x i+1
=
1 2
x i
+
a x
i
,
i = 0, 1, 2, . . . ,
(1.1)
где a — фиксированное число (> 0), а x
0
— любое число (> 0).
Формула (
1.1
) задаёт убывающую (начиная со 2-го элемента) последователь- ность, которая при любом выборе x
0
быстро сходится к величине

a, то есть lim i→∞
x i
=

a.
i x i
0 0.5 1 4.250000000 2 2.595588235 3 2.068332362 4 2.001128762 5 2.000000318 6 2.000000000 7 2.000000000 8 2.000000000 0
2 4
6 8
1 2
3 4
i x
√4
— формула Герона
Точки x i
получены с помощью программы Maple.
Код на языке Maple
[> n := 7;
a := 4;
x[0] := 0.5;
[> for i from 0 to n do x[i+1] := 0.5 * (x[i] + a/x[i])
od;
1
Итерация — повторение, неоднократное применение какой-нибудь математической операции.
112

8.2
Операторы циклов
Операторы цикла указывают, что определенную совокупность операторов сле- дует выполнить последовательно несколько раз.
В зависимости от способа организации числа повторений различают три типа циклов:
<оператор цикла> ::= <цикл с предусловием> |
<цикл с постусловием> |
<цикл с параметром>
8.3
Оператор цикла с предусловием
Цикл с заданным условием продолжения работы (цикл с предусловием, while-do)
while выражение do оператор
Рис. 3.3. Цикл с предусловием (синтаксическая диаграмма)
<цикл с предусловием> ::= while <выражение> do <оператор>
Условие
Оператор
Рис. 3.4. Цикл с предусловием (блок-схема)
условие —
условие продолжения цикла
113

Осторожно! (бесконечный цикл)
while a > 0 do
;
a := a - 1;


¨
©
Оператор цикла с предусловием может ни разу не выполниться.
Такой цикл называют безытерационным.
Пример 3.1. Добавлять к числу R единицу в случае выполнения условия
R
0:
Возможен безытерационный цикл
R := -5;
(* тело цикла будет выполняться *)
{ R := 5; (* тело цикла ни разу не выполнится *) }
while R <= 0 do R := R + 1;
Write(’R = ’, R); ...
Оператор цикла R = R+1 будет выполняться пока выполняется условие R
0.
114

Пример 3.2. Даны вещественные числа a (a > 1) и b. Получить и вывести на экран все члены последовательности a i
, i = 1, 2, 3, . . . (т. е. a, a
2
, a
3
,. . . ),
меньшие числа b.
Цикл с предусловием
(* см. конспект *)
Пусть, например, a = 2, b = 11.
d проверка печать условия d < 11 результата
2
+
2 2 · 2 = 4
+
4 4 · 2 = 8
+
8 8 · 2 = 16

— трассировочная таблица.
Результат работы программы:
Введите числа: a (>1) и b [> 2 11 2.00 4.00 8.00
Переменная, управляющая циклом, проходит этапы инициализации, проверки и модификации.
1.
Инициализация.
Переменной, управляющей циклом, присваивается на- чальное значение, прежде чем управление будет передано оператору while.
d := a (a было введено с клавиатуры)
2.
Проверка.
Значение переменной, управляющей циклом, проверяется пе- ред каждой итерацией.
d < b.
3.
Модификация.
Во время каждой итерации значение переменной, управ- ляющей циклом модифицируется (d := d * a).
Без инициализации переменной d проверка условия цикла d < b была бы бес- смысленной. Без модификации значения переменной d выполнение тела цикла будет продолжаться бесконечно.
115

Пример 3.3. Проверим, что будет выдавать на экран программа из приме- ра
3.2
в случае следующих входных данных:
1) a = 5;
b = 5;
2) a = 3;
b = 2.
Постановка задачи (напоминание): даны вещественные числа a (> 1) и b. Получить и вы- вести на экран все члены последовательности a, a
2
, a
3
,. . . , меньшие числа b.
Решение. Ни одного члена последовательности a, a
2
, a
3
,. . . , меньшего числа b,
при входных данных 1) и 2) не существует. Т. е. условие цикла сразу ложно и тело цикла ни разу не выполнится.
Что выдаст программа из приме- ра
3.2
?
Ответ:
ничего
Добавим условный оператор проверяющий нужно ли проводить вычисление членов последовательности.
Цикл с предусловием (модификация)
(* см. конспект *)
Результаты работы программы: в случае первого набора входных данных:
Введите числа: a (>1) и b [> 5 5
Решения нет в случае второго набора входных данных:
Введите числа: a (>1) и b [> 3 2
Решения нет в случае «хорошего» набора входных данных:
Введите числа: a (>1) и b [> 2 9 2.00 4.00 8.00 116

8.4
Оператор цикла с постусловием
Цикл с заданным условием окончания работы (цикл с постусловием, repeat-until)
repeat выражение until оператор
;
Рис. 4.5. Цикл с постусловием (синтаксическая диаграмма)
<цикл с постусловием> ::= repeat <оператор>{; <оператор>}
until <выражение>
Условие
Оператор
Рис. 4.6. Цикл с постусловием (блок-схема)
условие — условие окончания цикла


¨
©
Оператор цикла с постусловием всегда выполняется хотя бы один раз.
117

Пример 4.1 (
постановка та же)
. Даны вещественные числа a (a > 1) и b.
Получить и вывести на экран все члены последовательности a i
, i = 1, 2, 3, . . . ,
меньшие числа b.
Цикл с постусловием
ReadLn(a, b);
d := a;
repeat
(* см. конспект *)
until d >= b;
Изменение значения d происходит до тех пор, пока оно не станет больше или равно значению b.
Тест (прежние значения): a = 2, b = 11.
печать d
проверка результата условия d >= 11 2
2 2 · 2 = 4

4 4 · 2 = 8

8 8 · 2 = 16
+
Результаты работы программы:
Введите числа: a (>1) и b [> 2 11 2.00 4.00 8.00 118

Если с самого начала d b, то все равно будет выведен один член последователь- ности (это будет a).
Тест 2: a = 5, b = 3.
печать d
проверка результата условия d >= 3 5
5 5 · 5 = 25
+
Такого ответа в данной постановке задачи быть не должно!
Результаты работы программы:
Введите числа: a (>1) и b [> 5 5 5.00
Исправление ситуации: перед выполнением цикла repeat-until делать про- верку условия a < b.
Корректировка программы
ReadLn(a, b);
if a < b then begin end else
WriteLn(’Решения нет’);
Результаты работы программы:
Введите числа: a (>1) и b [> 2 11 2.00 4.00 8.00
Введите числа: a (>1) и b [>
5 5
Решения нет
. Для замены оператора while оператором repeat, необходимо знать выра- жение, логически дополняющее условие цикла while. Например, выражения
Power >= 1000
и
Power < 1000
взаимно дополняют друг друга.
119

БЫЛО:
Операция сравнения
<
<=
>
>=
=
<>
Операция в дополняющем выражении
>=
>
<=
<
<>
=
Дополнение к
Boolean-выражению — not Boolean-выражение
8.5
Зацикливание
Зацикливание программы
— тело цикла выполняется ∞-ное число раз.
Избежать зацикливания можно только тщательным подбором начальных зна- чений и проверкой всех деталей программы, содержащей операторы цикла.
Пример 5.1. Дан оператор цикла while a < 1
do a := 2 * a;

1   2   3   4   5   6   7   8   9
написать администратору сайта