Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_2лабработа_401.doc
Скачиваний:
14
Добавлен:
14.11.2019
Размер:
280.06 Кб
Скачать

Тема 2. Программирование разветвляющихся процессов

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

5.1. Методические указания

В решении задач, подчас, необходимо вести действия с учётом некоторых условий. Процесс, который в зависимости от определённых условий обеспечивает выбор одного из заранее предусмотренных путей решения задачи, называется разветвляющимся. Алгоритм, реализующий такой вычислительный процесс, называется алгоритмом с разветвляющейся структурой. Каждое отдельное направление вычислений называется ветвью. Выбор той или иной ветви происходит в процессе выполнения алгоритма по результатам проверки некоторого логического условия, зависящего от исходных данных или промежуточных результатов. В общем случае выполнение разветвляющегося алгоритма можно разбить на ряд этапов (рис. 5.1).

Рис. 5.1

1 этап – выполнение операторов, общих для всех ветвей программы (блок 1);

2 этап – принятие решений (логический блок 2), проверяется некоторое логическое условие и в зависимости от его значения False (Ложь) или True (Истина) осуществляется выбор одной из ветвей программы;

3 этап – реализация одного из выбранных путей решения задачи (блок 3 или 4), которые в свою очередь могут содержать ветвления (сложный разветвляющийся процесс);

4 этап – независимо от пути решения задачи осуществляется возвращение к общему линейному участку 2 (блок 5).

С учётом названных особенностей алгоритм вычисления действительных корней уравнения ax2 + bx + c = 0 имеет вид (рис. 5.2).

Переходы от одного блока к другому называются условными, если они осуществляются только при выполнении некоторого условия. В рассмотренном алгоритме – это переходы от блока 3 к блокам 4 и 6. После выполнения всех действий в любой из ветвей осуществляется переход к блоку 7. Этот переход называется безусловным. Для реализации различных переходов в программе используются специальные операторы передачи управления: оператор безусловного перехода Goto, условный оператор If и оператор отбора Case.

Рис. 5.2

5.2. Условный оператор If и составной оператор Begin … End

Условный оператор позволяет выбрать и выполнить один из двух входящих в него операторов в зависимости от значения логического выражения. Его синтаксическая запись:

If <логическое выражение> Then <оператор 1>

[Else <оператор 2>];

в которой IfThenElse – зарезервированные слова языка, означающие соответственно ЕСЛИ…ТО…ИНАЧЕ, квадратные скобки означают, что часть Else <оператор 2> может отсутствовать. Условный оператор может быть записан в одну строку, однако рекомендуется придерживаться требований структурированной записи программы.

Если логическое выражение принимает значение ИСТИНА (True), то выполняется оператор 1, если же оно принимает значение ЛОЖЬ (False), то выполняется оператор 2. В любом случае далее выполняется оператор, стоящий в программе за условием.

Например, оператор, вычисляющий Y = |X|, будет иметь следующий вид:

If X>=0

Then Y:=X

Else Y:= -X;

Условный оператор может не иметь конструкции Else, тогда он называется сокращённым условным оператором. Если логическое выражение принимает значение ЛОЖЬ (False), сразу выполняется оператор, следующий за условием.

Например, оператор

If X<0 Then X:= -X;

обеспечивает инвертирование значения переменной Х, если оно отрицательно, и оставляет его без изменения в противном случае.

Рассмотрим подробнее составные части условного оператора.

Логическим выражением (булевым) называется выражение, имеющее значение типа Boolean, т.е. True или False.

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

В языке PASCAL допустимы следующие операции отношения:

<, <=, =, >, >=, <>.

Отношение принимает значение True, если оно справедливо для входящих в него операндов и False в противном случае. Например, 10>7 имеет значение истина, а 5<=0 – ложь.

Переменные, которые в программе принимают значение логического выражения, должны быть описаны в разделе описания переменных как имеющие тип Boolean. Например, переменные А и В, описанные как

Var

A, B: Boolean;

считаются в программе логическими (т.е. принимают значения True и False).

Над множеством логических переменных определены следующие логические операции:

And – логическое умножение (И);

Or – логическое сложение (ИЛИ);

Xor – логическое ИЛИ-НЕ (исключающее ИЛИ);

Not – логическое отрицание (НЕ).

Их действия показаны в таблице 1:

Таблица 1. Таблица истинности

A

B

NOT A

A AND B

A OR B

A XOR B

False

False

True

False

False

False

False

True

True

False

True

True

True

False

False

False

True

True

True

True

False

True

True

False

По сравнению с операторами отношения логические операции имеют меньший приоритет.

В процессе вычислений соблюдается следующая очерёдность в выполнении этих операций:

  1. Выражения, заключённые в скобки;

  2. Логическое отрицание Not;

  3. Логическое умножение And;

  4. Логическое сложение Or, Xor.

Операции, имеющие одинаковый приоритет, вычисляются слева направо.

Например, логическое выражение

1 6 4 2 5 3

(-9>=5) Or Not (11<30) And (0<=7)

имеет значение False. Цифрами сверху показан порядок выполнения операций.

Операции Not, And, Or, Xor можно использовать для побитовых операций с целыми числами, для которых они имеют следующий смысл.

Not – унарная операция инверсии всех битов целого числа:

a = 1011, Not A = 0100.

And – побитовая логическая операция И двух целых чисел:

b = 0110, A And B = 0010.

Or – побитовая логическая операция ИЛИ двух целых чисел:

A Or B = 1111.

Xor – побитовая логическая операция ИСКЛЮЧАЮЩЕЕ ИЛИ двух целых чисел:

A Xor B = 1101.

Также к этой группе относят операции Shl и Shr.

Shl – операция I Shl J сдвигает содержимое I на J битов влево. Освободившиеся биты заполняются нулями:

A Shl 2 = 1100.

Shr – операция I Shr J сдвигает содержимое I на J битов вправо. Освободившиеся биты заполняются нулями:

B Shr 1 = 0011.

В этих операциях I и J – выражения любого целого типа.

Полный условный оператор в общем случае в своей записи после Then и Else может использовать любой оператор языка PASCAL. Однако часто возникает необходимость вставить в какую-либо ветвь не один, а группу операторов. В этом случае пользуются так называемым составным оператором.

Составной оператор – это заключённая между зарезервированными словами Begin и End последовательность операторов, отделённых друг от друга символом ‘;’ (точкой с запятой):

Begin

Оператор 1;

Оператор 2;

Оператор N;

End;

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

Приведём программу: вычисление действительных корней квадратного уравнения ax2 + bx + c = 0, в соответствии с алгоритмом рис. 2.

Program SQEQ;

Var

A, B, C, D, X1, X2: Real;

Begin

WriteLn (‘Введите А, В, С’);

ReadLn (A);

ReadLn (B);

ReadLn (C);

D:=Sqr (B) 4 * A * C;

If D<0 then

WriteLn (‘Действительных корней нет’)

Else Begin

X1:=(B + Sqrt (D)) / (2 * A);

X2:=(B Sqrt (D)) / (2 * A);

WriteLn (‘Действительный корень Х1= ’, X1:3:1);

WriteLn (‘Действительный корень Х2= ’, X2:3:1);

End;

WriteLn (‘Дискриминант D= ’, D:3:1)

End.

Результаты выполнения программы

Введите A, B, C

2 5 2

Действительный корень X1 = - 0.5

Действительный корень X2 = - 2.0

Дискриминант D = 9.0

Структура выбора может входить составной частью в одну из ветвей другой структуры выбора. В этом случае имеет место сложное ветвление. Например, даны две переменные a и b. Если a = b, то вывести на печать значения этих переменных без изменения. Если a < b, значения переменных уменьшить в 3 раза. Если a > b, то значения переменных увеличить на 6. Алгоритм и программа имеют следующий вид:

Рис. 5.3

Program AANOB;

Var

A, B: Real;

Begin

WriteLn (‘Введите A, B’);

Read (A, B);

If A<>B Then

If A<B Then Begin

A := A / 3;

B := B / 3;

End

Else Begin

A := A + 6;

B := B + 6;

End;

WriteLn (‘A=’, A:2:1, ‘B=’, B:2:1)

End.

Результаты выполнения программы

Введите A, B

4 2

A = 10.0 B = 8.0

В ветви Then внешнего разветвления содержится ещё один оператор. Конструкция Else во внешнем ветвлении отсутствует. Ветвь Else относится к ближайшему If, не имеющему Else. Структурированный вид программы предполагает написание соответствующих IfThenElse друг под другом. Операторы, ограниченные операторными скобками Begin End, записывают также друг под другом и следуют относительно Begin и End.