Направление подготовки: 15.03.04 Автоматизация технологических процессов и производств
Профиль подготовки: Автоматизация технологических процессов и производств в машиностроении
Формы обучения:очная
Тула 2015 г.
Методические указания к лабораторным работам составлены доц. А.В. Анцевыми обсуждены на заседании кафедры «Технология машиностроения»политехнического института
протокол №1 от "28" августа 2015 г.
Зав. кафедрой________________А.А. Маликов
Методические указания к лабораторным работам пересмотрены и утверждены на заседании кафедры «Технология машиностроения»политехнического института
протокол №___ от "___"____________ 20___ г.
Зав. кафедрой________________А.А. Маликов
Содержание
1. Цели и задачи работы.... 4
2. Теоретические сведения: ветвления... 4
2.1 Логический тип данных.. 4
2.2 Организация ветвлений.. 5
2.3 Объединение операторов.. 7
2.4 Сложные условия.. 8
2.5 Множественное ветвление.. 10
3. Объекты исследования, оборудование, материалы и наглядные пособия11
4. Задание на работу... 12
5. Порядок выполнения работы.... 12
6. Содержание отчета... 12
7. Список использованных источников... 12
Цели и задачи работы
Данная ЛР выполняется с целью освоения практических навыков работы с логическими значениями и организации ветвлений в программах.
Теоретические сведения: ветвления
Сложные проблемы всегда имеют простые,
легкие для понимания неправильные решения.
Из законов Мэрфи
Программа с ветвлениями состоит из нескольких "кусков". То, какой из этих "кусков" будет выполняться, зависит от результата проверки условия. Условие сравнивает между собой две величины (на равенство, неравенство, больше, меньше и т.д.). Например, при решении квадратного уравнения нужно проверять, не оказался ли дискриминант отрицательным.
Условие всегда дает два и только два варианта ответа: да (условие выполняется) или нет (условие не выполняется). Примеры условий приведены в Табл. 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:='Стороны должны быть больше нуля';