Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Операция логическое НЕ: not




Операция not реализует отрицание, или инвертирование следующего за ним выражения сравнения. Таким образом, если выражение имеет значение true, то not выражение имеет значение false и, наоборот.

Как правило, отношение можно выразить в более понятном виде, не прибегая к этому оператору:

if not х > 5 // выражение if (x <= 5) понятней

Однако операция not может быть удобной при работе с функциями, которые возвращают значение true или false, либо значения, которые могут интерпретироваться таким образом.

В программе, приведенной в листинге 5.7, эта методика (выполнение операции not по отношению к возвращаемому значению функции) используется для отображения соответствия введенных значений типу int. Определяемая пользователем функция is_int(), которая будет описана далее, возвращает значение true, если ее аргумент находится в диапазоне значений, допустимых для типа int. Затем программа использует выражение while not is_int(num) для отсечения значений, не соответствующих этому диапазону.


Листинг 5.7

//реализация операции отрицания

program Project1;

 

{$APPTYPE CONSOLE}

Uses

SysUtils;

Var

num: Double;

val: Integer;

 

function is_in(x: Double): Boolean;

Begin

if (x >= Low(Integer)) and (x <= High(Integer)) then

Result:= True

Else

Result:= False;

end;

 

Begin

Write('Enter an integer value: ');

Readln(num);

while not is_in(num) do //продолжается, пока значение типа num

begin //не становится допустимым для типа Integer

Write('Out of range-please try again: ');

Readln(num);

end;

val:= Round(num);

Writeln('You entered the integer: ', val);

 

Readln;

end.

Результат:

Enter an integer value: 3000000000

Out of range-please try again: -3000000000

Out of range-please try again: 100

You entered the integer: 100

Примечание к программе

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

В логической функции is_in() используются функции Low и High, для определения соответствия ее аргумента допустимому диапазону. В случае соответствия программа возвращает значение true; в противном случае – false.

Программа использует цикл while для отклонения недопустимых вводимых значений до тех пор, пока пользователь не ведет правильное значение.

Оператор множественного выбора case

Оператор case позволяет провести анализ значения некоторого выражения и в зависимости от его значения выполнять те или иные действия. В общем случае формат записи оператора case следующий:

case <выражение> of

<список значений 1>: <оператор 1>;

<список значений п>: <оператор п>;

Else

<оператор>

end;

В этой конструкции выражение должно иметь порядковый тип. Поэтому, например, нельзя использовать выражения, возвращающие действительные числа или строки.

Списки значений могут содержать одно или несколько разделенных запятыми возможных значений константных выражений. После списка ставится двоеточие «:», а затем пишется оператор, который должен выполняться, если выражение приняло одно из перечисленных в списке значений. После выполнения этого оператора работа структуры case завершается, и управление передается следующему за этой конструкцией оператору.

Если значение выражения не соответствует ни одному из перечисленных во всех списках, то выполняется оператор, следующий после ключевого слова else. Впрочем, раздел else не обязательно должен включаться в структуру case. В этом случае, если в списках не нашлось соответствующего значения выражения, то ни один оператор не будет выполнен.

Приведенный ниже пример анализирует переменную Key типа Char, содержащую символ, введенный пользователем в ответ на некоторый вопрос. При положительном ответе вызывается процедура FYes, при отрицательном — FNo, при иных ответах отображается сообщение об ошибке.

case Key of

'у', 'У': FYes;

'n', 'N': FNo;

Else

ShowMessage('Ошибочный ответ');

end;

Приведем другой пример, использующий, в частности, ограниченные типы в списках и целую переменную I:

case I of

1..5: Caption:= 'Low';

6..9: Caption:= 'High';

0,10..99: Caption:= 'Out of range';

Else

Caption:= '';

end;

Использование оператора case для реализации простого меню показано в листинге 5.8. Для отображения набора вариантов в программе применяется функция showmenu(). Затем оператор case выбирает действие, исходя из ответа пользователя.

Листинг 5.8

//использование оператора case

program Project1;

 

{$APPTYPE CONSOLE}

 

Var

choice: Integer;

 

procedure showmenu;

Begin

Writeln('Please enter 1, 2, 3, 4, or 5:');

Writeln('1) alarm 2) report');

Writeln('3) alibi 4) comfort');

Writeln('5) quit');

end;

 

procedure report;

Begin

Writeln('It''s been an excelent week for business.');

Writeln('Sales are up 120%. Expenses are down 35%.');

end;

 

procedure comfort;

Begin

Writeln('comfort');

end;

 

Begin

showmenu;

Readln(choice);

while choice <> 5 do

Begin

case choice of

1: Writeln(#7);

2: report;

3: Writeln('The boss was in all day.');

4: comfort;

Else

Writeln('That''s not a choice.');

end;

showmenu;

Readln(choice);

end;

Writeln('Bye!');

 

Readln;

end.

Выполнение цикла while прерывается, когда пользователь вводит 5. Ввод чисел от 1 до 4 приводит к выбору соответствующего варианта из списка case, а ввод 6 — к переходу к операторам, определенным по умолчанию оператором else.

Процедуры Break и Continue

Процедуры Break

Вызов процедуры Break внутри цикла while, for или repeatuntil организует немедленный выход программы из цикла. Подобный метод полезен в тех случаях, когда во время выполнения цикла возникло некоторое обстоятельство, требующее немедленного завершения его выполнения. В приведенном ниже примере выполнение цикла прекращается после выполнения пяти итераций:

Var

i: Integer;

Begin

for i:= 1 to 1000 do

Begin

MessageBeep(0); //подача звукового сигнала

if i = 5 then Break;

end;

end;

Процедура Continue

Вызов процедуры Continue в некотором цикле приводит к опусканию оставшейся части блока кода цикла и переходу к началу следующей итерации. В частности, в приведенном ниже примере при первой итерации второй оператор вывода строки выполнен не будет:

Var

i: Integer;

Begin

for i:= 1 to 3 do

Begin

Writeln(i, '. Before continue');

if i = 1 then Continue;

Writeln(i, '. After continue');

end;

end.

Применение обоих операторов показано в листинге 5.9. Пользователь вводит строку текста. Цикл отображает на экране каждый символ; если встречается точка, то используется оператор break для завершения цикла. Этот пример демонстрирует, как можно использовать оператор break для завершения цикла изнутри, если некоторое условие становится истинным. Затем программа подсчитывает количество пробелов, но не остальных символов. Оператор continue используется для пропуска связанной с подсчетом части цикла, когда символ не является пробелом.

Листинг 5.9

//использование операторов continue и break

program Project1;

 

{$APPTYPE CONSOLE}

 

Var

spaces: Integer = 0;

i: Integer;

line: string;

Begin

Writeln('Enter a line of text: ');

Readln(line);

for i:= 1 to Length(line) do

Begin

Write(line[i]); //отображение символа

if line[i] = '.' then

Break; //выход, если точка

if line[i] <> ' ' then //пропуск остальной части

Continue;

Inc(spaces);

end;

Writeln(#10, spaces, ' spaces');

Writeln('Done');

 

Readln;

end.

Результат:

Enter a line of text:

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...