Читайте также: |
|
IF b > c Then
Begin
max:= a;
IF b > c then min:= c
else min:= b; end
Else begin max:= c; min:= b; end;
end {ELSE}
При вложениях условных операторов самое главное – не запутаться в вариантах условий (при чтении условных операторов большую помощь может оказать ступенчатая запись операторов, как показано в примере выше). Следует помнить, что всегда действует правило: альтернатива ELSE считается принадлежащей условному ближайшему оператору IF, не имеющему ветви ELSE. Например, если встретится такая запись:
IF a > b THEN
IF a > c Then max:= a
ELSE max:= b;
то, поскольку компилятор не смотрит на вложенную структуру и действует по своим внутренним правилам, то ELSE будет отнесено не к первому условному оператору, а ко второму. Для того чтобы ELSE было отнесено к первому условному оператору, второй условный оператор необходимо заключить в операторные скобки:
IF a > b THEN begin
IF a > c Then max:= a
End
ELSE max:= b;
Символ "; " не ставится перед служебным словом Else. Как видно из примера Delphi понимает знаки арифметических действий: плюс +, минус –, умножить *, разделить /. При записи математических выражений действует обычное правило очередности выполнения вычислений. Первыми производятся вычисления в скобках, умножение (деление) выполняются раньше сложения (вычитания).
В условном операторе, как мы видели выше, используются логические выражения. По каким же правилам строятся эти выражения в Delphi? Это прежде всего операции сравнения вида a > b или c <= d. Запишем все операции сравнения используемые в Delphi.
> – больше; < – меньше;
<> – не равно, тождественен математическому знаку ¹;
<= – меньше или равно, тождественен математическому знаку £;
>= – больше или равно, тождественен математическому знаку ³..
Примеры: a <> b; count >=10; c+d < 8+k;
Кроме этого существуют операции, применимые к логическим переменным, это
not – логическое НЕ
and – логическое И
or – логическое ИЛИ
xor – исключительное ИЛИ.
Как могут использоваться эти операции, показано в примерах ниже. Заметьте, что если мы имеем дело с несколькими операциями сравнения, то их необходимо заключать в скобки, иначе получим сообщение об ошибке.
IF (a > b) or (a > c) THEN …; {Если а больше b или а больше с, то …}
IF (count > 4) and (count <10) THEN …; {Если Count больше 4 и Count меньше 10}
Результат логических операций с логическими переменными | |||||
Операнд1 | Операнд2 | not | and | Or | xor |
True | – | False | – | – | – |
False | – | True | – | – | – |
False | False | – | False | False | False |
False | True | – | False | True | True |
True | False | – | False | True | True |
True | True | – | True | True | False |
Посмотрите на запись следующего участка программы. Комментарии говорят о том, что происходит с переменными логического типа.
Var bool1, bool2, bool3: Boolean; Begin Bool1:= False;
Bool2:= not Bool1; {переменная Bool1 получает значение True}
Bool3:= Bool1 OR Bool2; {переменная Bool3 получает значение True}
Bool3:= Bool1 AND Bool2; {переменная Bool3 получает значение False } end;
Операторы повторений
Счетный оператор цикла FOR.
Счетный оператор цикла позволяет выполнять участок программы заданное число раз. Структура оператора такова:
FOR <переменная-счетчик>:= <нач. знач.> TO <кон. знач.> DO <оператор>;
Слова FOR, TO, DO являются зарезервированными (для, до, выполнить). Переменная-счетчик – это переменная цикла, которая изменяется от начального до конечного значений. Она должна быть описана как переменная перечислимого (обычного целого) типа в разделе описания переменных. Оператор – это любой оператор языка Pascal. Следует отметить, что выполняется один единственный оператор, поэтому если Вам необходимо выполнить внутри цикла не один, а несколько операторов, то их нужно заключить в операторные скобки (begin … end;). Оператор, стоящий внутри цикла еще называют телом цикла.
Что же происходит при выполнении этого оператора? При первом выполнении цикла переменной-счетчику присваивается начальное значение, затем производится выполнение оператора, после чего проверяется, не стала ли переменная-счетчик больше конечного значения. Если получается положительный ответ, то выполнение цикла прекращается, если же нет, то переменная-счетчик увеличивается на единицу и все повторяется. Следует отметить, что тело цикла обязательно выполнится хотя бы один раз.
Примечание: поскольку переменная-счетчик может быть любого целого типа или любого перечислимого типа, то следует следить за тем, чтобы начальное и конечное значения не выходили за пределы указанного типа.
Давайте посмотри, как будет выглядеть приведенный выше пример с использованием счетного оператора цикла:
Var j: integer;rez: LongInt;
Procedure Sum; Begin rez:= 0; n=100;
FOR j:= 5 To n Do Inc(j); rez:= rez+j;
mmOut.Lines.Add:=’Сумма чисел от 5 до 100 равна ’+IntToStr(rez); End;
Как видите, код значительно уменьшился в объеме и стал более удобен для чтения.
В приведенном примере с каждым шагом цикла переменная-счетчик увеличивается на единицу, но иногда необходимо, чтобы счетчик уменьшался с каждым шагом цикла. для этого вместо служебного слова To используется служебное слово DownTo. Предыдущий пример можно модифицировать так, чтобы он вычислял сумму любых чисел, как положительных, так и отрицательных. При n<0 в том виде как записано выше тело цикла выполнится только один раз. потому что 1>0. Предположим, что значение n передается извне, тогда наш пример можно записать так:
Var j: integer; rez: extended;
Procedure Sum;
Begin rez:= 0; IF n>0 THEN
FOR j:= 5 To 100 Do Inc(j); rez:= rez+j
ELSE FOR j:= 5 DownTo 100 Do
Inc(j); rez:= rez+j;
mmOut.Lines.Add:=’Сумма чисел от 5 до 100 равна ’+IntToStr(rez); End;
Счетные циклы очень быстрые и генерируют компактный исполняемый код, но всем им присущ один традиционный недостаток, – параметр должен принадлежать перечислимому типу, а шаг не может быть изменен. Для организации циклов с произвольным шагом применяются другие операторы циклов. Счетный оператор цикла допускает любую глубину «вложенности», т.е. он может содержать внутри себя любое количество счетных операторов цикла, которые также могут иметь вложенные циклы.
Итак, счетный оператор цикла имеет параметр цикла – переменную счетчик. Мы задаем границы изменения счетчика, определяя, таким образом, число повторений. Другие два оператора цикла не имеют собственных параметров, а связаны только с проверкой какого-либо условия. Рассмотрим их.
Оператор цикла с предусловием – WHILE.
While <условие> DO <оператор>
While и Do – зарезервированные слова (пока [выполняется условие] делать…); условие – это логическое выражение; оператор – пустой, простой или составной оператор, называемый телом цикла. Условие может быть как логическим выражением, так и переменной логического типа.
Если при исполнении программы встречается этот оператор, то компьютер проверяет условие данного оператора, если оно имеет значение True, то выполняется тело цикла и управление передается вновь на проверку условия. Если же условие имеет значение False, то программа переходит к выполнению действий, следующих за телом цикла.
При написании циклов с предусловием следует помнить о двух вещах. Во-первых, чтобы цикл имел шанс когда-нибудь завершиться, содержимое тела цикла должно обязательно влиять на условие цикла. Во-вторых, условие должно состоять из корректных выражений, определенных еще до первого выполнения тела цикла. Поясним сказанное на примере вычисления факториала числа N.
Var Factr, N, j: LongInt;
Begin
{предшествующая вычислению часть программы, где задается N}
Factr:= 1; j:= 1;
While j<=N Do
Begin
Factr:= Factr*j; j:= j+1; end;
mmOut.Lines.Add:= ‘Факториал числа ’+IntToStr(N)+’ равен ’+IntToStr(Factr);
End;
Обратите внимание на то, что в начале блока вычисления факториала переменным Factr и j присваивается значение 1. Это сделано для того, чтобы цикл мог завершить свою работу, а также для того, чтобы мы могли получить верное значение факториала. Посмотрим, что бы было, если бы не было этой строки. В самом начале, когда переменная только описана, но еще не используется, она может иметь любое значение, что связано с особенностями размещения переменной в памяти компьютера. В результате оно может быть больше или намного меньше N. Если же одна из переменных либо Factr, либо j в самом начале будет иметь значение 0, то (поскольку при вычислении происходит умножение) факториал в конечном итоге окажется равным нулю. Далее, обратите внимание на то, что увеличение переменной в теле цикла j на единицу происходит после вычисления факториала. Если бы это было не так, то мы бы получили факториал 11!.
Поскольку оператору с предусловием все равно, что происходит в его теле, то он, как и счетный оператор цикла, может содержать в себе другие (вложенные) операторы цикла с предусловием. Отметим, что если при первом выполнении этого оператора условие будет иметь значение False, то тело цикла ни разу не будет выполнено. Это отличает его от счетного оператора и оператора с постусловием, чьи тела обязательно выполняются хотя бы один раз.
Оператор цикла Repeat … Until с постусловием.
Рассмотренный выше оператор цикла с предусловием решает выполнять свое тело или нет до первой итерации. Если это не соответствует логике алгоритма, то можно использовать цикл с постусловием, т.е. решающий делать или нет очередную итерацию лишь после завершения предыдущей. Это имеет принципиальное значение лишь на первом шаге, а далее циклы ведут себя идентично. Цикл с постусловием всегда будет выполнен хотя бы один раз. Рассмотрим структуру этого оператора:
Repeat <оператор1>; <оператор2>; <оператор3>;
……………. <операторN>; Until <условие>;
Repeat и Until – служебные слова (повторять [до тех пор] … пока [не будет выполнено условие]); условие – это либо логическое выражение, либо переменная логического типа, но работает здесь оно совсем не так, как в операторе с предусловием While. Если в цикле While подразумевается алгоритм «выполнять пока истинно условие», то оператор Repeat...Until соответствует логике «выполнять пока условие не станет истиной».
Для наглядности приведем примеры «вечных» циклов, то есть таких циклов, которые никогда не завершатся естественным способом:
While True Do begin
………………… end;
Repeat ………………… Until False;
В связи с тем, что циклы могут иметь такие условия, которые не позволят им завершиться, а также с тем, что иногда требуется, досрочное завершение выполнения тела цикла в Delphi существуют следующие процедуры:
Break – реализует немедленный выход из цикла; действие данной процедуры заключается в передаче управления оператору, стоящему сразу за концом циклического оператора;
Continue – обеспечивает досрочное завершение очередного прохода цикла; эквивалент передачи управления в самый конец циклического оператора.
Введение этих операторов практически сводит к нулю необходимость оператора безусловного перехода GoTo.
Оператор выбора CASE
Допустим, нам необходимо проверить достаточно большое количество условий накладываемых на одну переменную, имеющую перечислимый тип. Можно конечно использовать большое количество условных операторов, но это не всегда удобно и, к тому же, загромождает программу. Для подобных случаев в Delphi предусмотрен оператор выбора. Это еще одно средство ветвления программы, но если условный оператор разбивает процесс на две ветви, то оператор выбора может разбить процесс на несколько ветвей, количество которых ограничено только количеством допустимых значений перечислимого типа.
Дата добавления: 2015-01-30; просмотров: 23 | Поможем написать вашу работу | Нарушение авторских прав |