Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Объединение операторов

К.т.н., доц. Троицкий Д.И.

 

 

Рассмотрено на заседании кафедры АСС

1 сентября 2007, протокол №7

Зав. кафедрой АСС д.т.н., проф.

_______________ Иноземцев А.Н.

 

 


Содержание

Задачи с ветвлениями. 4

2. Логический тип данных. 4

3. Организация ветвлений. 5

4. Объединение операторов. 7

5. Сложные условия. 8

6. Множественное ветвление. 10


Задачи с ветвлениями

 

Сложные проблемы всегда имеют простые,

легкие для понимания неправильные решения.

Из законов Мэрфи

 

Программа с ветвлениями состоит из нескольких "кусков". То, какой из этих "кусков" будет выполняться, зависит от результата проверки условия. Условие сравнивает между собой две величины (на равенство, неравенство, больше, меньше и т.д.). Например, при решении квадратного уравнения нужно проверять, не оказался ли дискриминант отрицательным.

Условие всегда дает два и только два варианта ответа: да (условие выполняется) или нет (условие не выполняется). Примеры условий приведены в Табл. 1. Сравнивать между собой можно не только числа, но и буквы, и строки символов. Большей считается буква, стоящая ближе к началу алфавита.

Табл. 1

Параметры Условие Результат
a=10 b=20 a<b да
a=-5 b=-10 a>b да
a=10 b=10.01 a=b нет
a='a' b='z' a>b да
a='abc' b='cde' a=b нет

 

Условие "не равно" записывается как "<>", "больше или равно" – ">=", меньше или равно – "<=".

Логический тип данных

 

Всякий провод, нарезанный на куски, окажется слишком коротким.

Из законов Мэрфи

Итак, в результате проверки условия можно получить ответ "да" или "нет". Чтобы этот ответ можно было записать в переменную, в Delphi предусмотрен особый тип данных – логический. Переменные логического типа могут принимать только два значения: TRUE (да, истина) и FALSE (нет, ложь. Вспомните русское слово "фальшь"). Логический тип данных в программе назван BOOLEAN в честь английского математика XIX века Дж. Буля (J. Bool), разработавшего основы алгебры логики. Логические переменные нельзя ввести с клавиатуры, но можно вывести на экран. Рассмотрим следующий пример программы:

 

VAR l:BOOLEAN; a,b:WORD;

 

BEGIN

a:=10;

b:=20;

l:=a>=b

END;

Так как 10 не больше или равно 20, переменная l примет значение FALSE (ложь).

Разумеется, переменные логического типа нельзя смешивать с переменными других типов. Например, в приведенном примере присваивание типа a:=a+l будет полной бессмыслицей (как можно сложить число и слово FALSE?) и вызовет ошибку при компиляции.

 

Организация ветвлений

 

Нельзя заранее правильно определить, какую сторону бутерброда мазать маслом.

Из законов Мэрфи.

 

Имея условие или переменную логического типа, можно заставить программу выполнять разные последовательности операторов в зависимости от результата вычисления условия. Например, напишем программу, которая запрашивает с клавиатуры два числа и сообщает, какое из них больше – первое или второе.

Ветвление в программе организуется двумя операторами: IF (как говорится в программистском фольклоре, узник замка Иф был программистом J) и CASE. Сначала рассмотрим главный оператор ветвления – IF. Его общий вид таков:

Полная форма Сокращенная форма
IF условие THEN оператор1 ELSE оператор2; IF условие THEN оператор1;  

 

Если (а IF по-английски и означает "если") условие истинно, то выполняется оператор1. Если же оно ложно, то либо выполняется оператор2, либо, при сокращенной форме – оператор, следующий за IF.

Наша программа будет выглядеть так (для краткости опустим оператор TRY..EXCEPT):

VAR a,b:REAL;

 

BEGIN

ClrScr;

a:=FloatToStr(LabeledEdit1.Text);

b:=FloatToStr(LabeledEdit1.Text);

IF a>b THEN

Label1.Caption:='Первое число больше второго'

ELSE
Label1.Caption:='Второе число больше первого'

END;

 

Обратите внимание на запись с отступами: операторы, стоящие внутри IF, смещаются вправо. Delphi этого не требует, ему все равно, а вот человеку разбираться в записи с отступами гораздо легче. Еще один важный момент – точка с запятой ставится только после второго оператора. Ни перед, ни после ELSE точки с запятой быть не может!

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


IF a>b THEN

Label1.Caption:='Первое число больше второго';

Label1.Caption:='Второе число больше первого'

 

Второй оператор присваивания := никак не связан с IF и будет выполняться всегда. В итоге в любом случае программа будет выводить текст 'Второе число больше первого'. Сокращенную форму используют тогда, когда при невыполнении условия ничего делать не надо.

 

Объединение операторов

 

Доступность операции - еще не показатель того, что ее надо делать.

Из законов Мэрфи

 

Формат записи оператора IF позволяет поместить внутрь его лишь один оператор, выполняющийся, когда условие истинно, и один – когда оно ложно. Часто же нужно выполнить не один, а много операторов. Например, при решении квадратного уравнения после проверки неотрицательности дискриминанта нужно вычислить действительные корни уравнения, что требует как минимум двух операторов присваивания. Следующая запись невернаи вызовет ошибку при компиляции:


d:=SQR(b)-4*a*c;

IF d>=0 THEN

x1:=-b+SQRT(d)/(2*a);

x2:=-b-SQRT(d)/(2*a)

ELSE

Label1.Caption:='Корни комплексные';

 

Как же быть? Очень просто – нужно превратить несколько операторов в один. Для этого их объединяют при помощи уже известных нам операторных скобок BEGIN и END. Запись вида

 

BEGIN

оператор 1;

оператор 2;

оператор n

END;

 

рассматривается как один оператор. Не путайте BEGIN и END, являющимися операторными скобками, с BEGIN и END, отмечающими начало и конец всей программы. Таким образом, правильная запись такова:

 

d:=SQR(b)-4*a*c;

IF d>=0 THEN

BEGIN

x1:=-b+SQRT(d)/(2*a);

x2:=-b-SQRT(d)/(2*a)

END

ELSE

Label1.Caption:='Корни комплексные';

 

Обратите внимание, что оператор Label1.Caption:='Корни комплексные' в операторные скобки не заключен. Причина очевидна: это один-единственный оператор, его не с чем объединять. Запись вида

 

IF a>b THEN

BEGIN

c:=a+10

END;

 

хотя и не вызовет ошибки, но является избыточной и свидетельствует о низкой квалификации программиста. Скобки BEGIN … END здесь совершенно лишние.

 

Сложные условия

 

Сложность программы растет до тех пор, пока не превысит способности программиста.

Из законов Мэрфи

 

Во многих случаях нужно одновременно проверять несколько условий. Например, перед расчетом площади треугольника по длинам сторон все три длины стороны a,b,c обязаны быть положительными числами, т.е. должно выполняться условие "a>0 и b>0 и c>0". Для записи сложных условий в Delphi предусмотрен набор логических операций над условиями (Табл. 2). Обязательное требование – сами условия при этом записываются в скобках!

Поясним действие логических операций. Операция AND ("и") возвращает значение "истина" только в том случае, если оба условия, которые она соединяет, истинны. Если хотя бы одно из условий не выполняется, AND вернет "ложь". Операция OR ("или") не столь строга – она возвращает значение истина, если либо одно, либо другое, либо оба разу соединяемых условия истинны. Родственная операция XOR (исключающее "или") очень похожа на OR с той разницей, что она исключает случай, когда оба условия выполняются (или одно, или другое6 но не оба сразу). Наконец, операция NOT (отрицание) применяется не к двум, а к одному условию и просто "переворачивает" его: (a=b) есть то же самое, что NOT(a<>b).

Табл. 2

Операция a b Результат Операция a b Результат
(a) AND (b) TRUE TRUE TRUE NOT(a) TRUE - FALSE
TRUE FALSE FALSE FALSE - TRUE
FALSE TRUE FALSE - -  
FALSE FALSE FALSE - -  
(a) OR (b)   TRUE TRUE TRUE (a) XOR (b) TRUE TRUE FALSE
TRUE FALSE TRUE TRUE FALSE TRUE
FALSE TRUE TRUE FALSE TRUE TRUE
FALSE FALSE FALSE FALSE FALSE FALSE

 

Вот как может выглядеть запись проверки всех трех введенных сторон треугольника на положительность:

 

IF (a>0) AND (b>0) AND (c>0) THEN

BEGIN

… вычисления

END

ELSE

Label1.Caption:='Стороны должны быть больше нуля';

 

Тот же пример можно записать и по-другому:

 

IF (a<=0) OR (b<=0) OR (c<=0) THEN

BEGIN

Label1.Caption:='Стороны должны быть больше нуля';

Exit // выход из процедуры

END;

… вычисления

END; // конец процедуры

 

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.