REPEAT-UNTIL

И снова Паскаль. На сей раз мы будем изучать новый цикл, так называемый цикл REPEAT-UNTIL.

Этот цикл является заключительным, он единственный оставшийся из трех имеющихся в Паскале - два мы уже прошли (FOR и WHILE). Хочу также обратить ваше внимание, что в этом выпуске мы снова вернемся к типам. Дело в том, что в цикле REPEAT-UNTIL очень часто используется неизвестный вам пока тип данных, так называемый логический, или булевский, или BOOLEAN. Так вот, этот тип очень удобен в использовании циклов REPEAT-UNTIL, да и вообще в программировании. Он довольно прост, но одновременно не все его понимают. Это ничего: если вы не поймете его сегодня, то обязательно разберетесь по ходу его использования. Как говориться, нет ничего лучше практики. Ну что, начнем?

Тип BOOLEAN

Перед изучением нового типа данных я как всегда хочу смоделировать ситуацию, где будет удобно использовать данный тип. По моему, это лучше, чем голая теория. Так все же понятней, когда улавливаешь момент, при котором использование какой-то возможности особо удачно. Это позволяет ощутить саму суть - зачем же это придумали, где используется?

Итак, давайте представим, что мы пишем программу, в которой нам необходимо прочитать десять чисел, после чего выполнить следующие действия:

1. Если среди введенных чисел был нуль, то напечатать "нули существуют".

2. Если среди введенных чисел нулей не было, то так и пишем: "нету у нас нулей!".

Задача поставлена. Думаем, как же будем ее решать. Заранее не сказано, что введенные числа нужно где-нибудь оставлять. Понимаете, о чем я? То есть ни одно из введенных чисел далее нам не потребуется, главное знать, был ли среди них нуль. Алгоритмов для решения такой задачи превеликое множество. Один из удачных вариантов (точнее, более простых) это использование массива, но таковые мы еще не проходили. Отпадает. Другой вариант - непосредственная проверка введенного числа, то есть после ввода проверять - число это нуль? Если да, выведем подтверждение. Но и это не очень гибкое решение задачи.

Можно зделать иначе - проверять число на ноль, и если оно таковое, изменять какую-нибудь специально заведенную переменную. Например, Is_zero: Byte. Если у нас ноль, то пишем: Is_zero := 1;

А после ввода проверяем, если в Is_zero = 1, то нули были. Вам понятен ход моих мыслей? Мы используем как бы подтверждение наличия нулей. Вот пример для наглядного отображения:

Program N1;
var
Is_zero, I: Byte;
A: Integer;
begin
Is_zero := 0;
For I := 1 to 10 do
begin
Write('Введите число N',I,': ');
Readln(A);
if A = 0 then Is_zero := 1;
end;
if Is_zero = 1 then
Write('В введенной последовательности есть нули!');
else
Write('В введенной последовательности нулей ни фига нет!');
Readln;
end.

Надеюсь, программа понятна? В частности, использование переменной Is_zero? Вот мы и подошли к новому типу переменных, а именно к логическому типу - BOOLEAN. Что же это такое?

Тип BOOLEAN - это логический тип. Переменная такого типа довольно специфична, она может иметь всего два значения:

TRUE - истина;

FALSE - ложь;

Именно эти значения и проверяются в программе. Переменные такого типа крайне удобны в нашем примере. Модифицируем?

Program N2;
var
I: Byte;
A: Integer;
Is_zero: Boolean;
begin
For I := 1 to 10 do
begin
Write('Введите число N',I,': ');
Readln(A);
if A = 0 then Is_zero := true;
end;
if Is_zero then
Write('В введенной последовательности есть нули!');
else
Write('В введенной последовательности нулей ни фига нет!');
Readln;
end.

Видите, что мы сделали? Если перевести работу переменной BOOLEAN на русский язык, получиться примерно следующая фраза:

Если правда то, что нули были, то напиши об этом;

А вот если неправда, то так и напиши, что не было нулей...

То есть работа BOOLEAN это просто определение истинности условия или его ложности. Вот собственно и все. Кстати, обратите внимание на проверку:

if Is_zero then.....

Вы видите, что я не пишу If Is_zero = true? BOOLEAN - переменная логическая, поэтому и не требует в проверках указания своего значения. Она просто проверяется на истину. Как бы по умолчанию, IF ищет подлинность условия.

Понятно, нет? Если нет, то уверяю вас, дальше разберетесь. Пока про BOOLEAN сказать больше нечего, нужно пробовать использовать его и смотреть на результаты работы. Переходим к циклу.


Цикл REPEAT-UNTIL

Этот цикл весьма и весьма часто используется в программировании. Он довольно удобен для организации больших структур данных, оформления целых блоков программы. Отличительная особенность цикла - это проверка подлинности выполнения не в начале, как у других циклов, а в конце. Проверка может быть на что угодно:

  • На подлинность булевской переменной;

  • На наличие какого-нибудь условия, например была введена буква "q", означающая выход из программы;

  • На значение какой-нибудь переменной (а не больше ли она пяти?)

  • и т.д...

Оформляется цикл тоже довольно просто.

Для того, чтобы озаглавить цикл REPEAT-UNTIL (кстати, по английски repeat - повторять, а until - пока, до того как) необходимо в любом месте программы вставить служебное слово REPEAT. Именно одно слово, не как во всех других циклах. Завершается цикл служебным словом UNTIL с последующей проверкой какого-нибудь условия. Пример? Пожалуйста:

Program N3;
var
S: String;
Exit: Boolean;
begin
REPEAT
Write('Введите строку (end - выход): ');
Readln(S);
if S = 'end' then Exit := true;
UNTIL Exit;
Write('Конец программы...');
Readln;
end.

В этом примере проверка происходит на подлинность булевской переменной, которая устанавливается если введена строка 'end'.

Здесь хочу сделать дополнительные комментарии к циклу.

Во-первых, обратите внимание, что после слова REPEAT не ставится точка с запятой, наподобие слова BEGIN. Дело в том, что REPEAT озаглавливает целый блок, поэтому знак ";" и отсутсвует.

Во-вторых, обратите внимание, что операторы внутри конструкции REPEAT-UNTIL не выделяются дополнительными begin-end. Хотя операторов и несколько, этого не происходит.

Ну а теперь еще пример, на этот раз проверяем числовую переменную:

Program N4;
var
A: Integer;
begin
REPEAT
Write('Введите число (0 - выход): ');
Readln(A);
UNTIL A=0;
Write('Конец программы...');
Readln;
end.

Из программы видно, что она будет повторяться пока не будет введен нуль. Теперь, когда вы более-менее познакомились с этим циклом, думаю, вы согласитесь, что он очень удобен и прост. Вы уже довольно хорошо знакомы с понятием циклов и я считаю, что дополнительных комментариев к сегодняшнему вопросу не требуется. Очень рекомендую написать как можно больше программ, использующих этот цикл; попробуйте заменить в старых вариантах циклы FOR и WHILE на REPEAT-UNTIL.

Теперь мы полностью завершили циклы и можем двигаться дальше. На пути у нас еще много интересной информации, которую нам предстоит шаг за шагом освоить. Перед тем, как вы сможете написать более-менее серьезную программу, необходимо еще изучить много приемов и теории...



Опубликовал admin
16 Ноя, Воскресенье 2003г.



Программирование для чайников.