Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
У_П_Инф1.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.88 Mб
Скачать

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

Реализация действий в программе в соответствии с некоторым условием предполагает использование объектов еще одного стандартного типа данных - логического типа. Логический или булевский тип (по имени создателя формальной логики ирландского математика 19 века Д. Буля) описывается служебным словом boolean и характеризуется двумя значениями - false (ложь) и true (истина). Указанные значения получаются в результате применения операций отношения (сравнения). В языке имеются также стандартные логические операции, которые позволяют вместе с операциями отношения строить сложные логические выражения. Логические операции представлены ниже в таблице в порядке убывания их приоритета: отрицание (НЕ - not), конъюнкция (И - and), дизъюнкция (ИЛИ - or) и исключающее ИЛИ - xor. При составлении сложных логических выражений с участием логических операций следует использовать круглые скобки: (x>=0) and (y<=0). Turbo Pascal 7.0 для совместимости с другими языками и с Windows использует также логические типы Bytebool, Wordbool, Longbool, под значения которых отводятся соответственно 1, 2 и 4 байта памяти.

Таблица истинности операций Not, And, Or и Xor

X

Y

not X

X and Y

X or Y

X xor Y

False

false

true

false

false

false

False

true

true

false

true

true

True

false

false

false

true

true

True

true

false

true

true

false

Логические операции можно применять также к объектам целого типа. В этом случае операции носят поразрядный характер. Например, применение логических операций «И» и «ИЛИ» к одному и тому же числу 33 дает следующие результаты: 33 and 1 = 1, 33 or 1 = 33.

К поразрядным операциям с целыми числами относятся также сдвиговые операции Shl и Shr: <Число> shl k и <Число> Shr k . Операции производят арифметический сдвиг двоичных разрядов числа соответственно на k разрядов влево и вправо, что равносильно умножению и делению числа на . Например, 72 shr 3 = 72 div = 9, 7 shl 3 = 7 = 56.

С помощью стандартной функции Odd(n) можно установить нечетность числа n. Если n - нечетное число, то функция возвращает значение true.

Значения булевского типа нельзя вводить с клавиатуры, используя для этого операторы стандартных процедур ввода read и readln, но они могут быть выведены на экран процедурами write или writeln.

В состав логических выражений могут входить объекты еще одного стандартного типа данных - символьного. Этот тип описывается служебным словом Char. Ниже приведен пример описания переменных символьного и булевского типов.

var c1,cs : char; q, p : boolean;

Простой тип char включает в себя полный набор символов американского стандартного кода для обмена информацией - American Standard Code for Information Interchange (ASCII). В таблице под определенными номерами расположены 256 символов. Каждый из них представлен в двоичном коде в памяти компьютера и занимает 1 байт. Первые 128 из общего набора символов - это собственно ASCII. Остальные символы расширяют таблицу кодировки символами национальных алфавитов, символами псевдографики (блоковая графика) и некоторыми другими знаками представления информации. Символы с кодом от 0 до 31 - это управляющие символы, не имеющие привычного начертания при письме. Такие символы, впрочем как и все остальные, могут быть представлены в программе по их коду, который записывают в десятичной или шестнадцатеричной формах после символа #, например: #1, #100 или #$64 и т.п. Остальные символы записывают в апострофах: f, _, - сам апостроф ().

Функция Chr(номер символа) преобразует код в соответствующий символ. Обратное преобразование осуществляет функция Ord(символ). Эта функция преобразует также значение порядкового типа в значение целого типа LongInt, например Ord(false) = 0. Для переменных порядкового типа применимы также функции Pred(k) и Succ(k), возвращающие соответственно предыдущее и последующее значения переменной, например: pred(true)  false, succ(-4)  -3, pred(chr(#$65)  d. Для символьного типа применима функция Upcase(символ), которая возвращает прописную латинскую букву, если символом была строчная латинская буква, а иначе - аргумент.

Особо следует сказать о вводе значений символьного типа с клавиатуры. При этом каждый символ становится значимым, в том числе и пробел. Даже нажатие клавиши ENTER соответствует вводу двух символов: #13 - возврат каретки и #10 - перевод строки. Поэтому, во избежание ошибок ввода, следует использовать посимвольный ввод данных с помощью процедуры readln(c).

Д ля реализации необходимых действий в зависимости от выполнения некоторого условия используют блок выбора (альтернативы), которому в языке соответствует оператор условного перехода IF:

IF <логическое выражение>

ДА Условие НЕТ THEN <Оператор 1>

ELSE <Оператор 2>;

Условие в операторе записывается в виде логического выражения. Если последнее принимает значение true, то выполняется оператор 1, в противном случае - оператор 2. В качестве операторов могут быть использованы любые операторы языка, в том числе и другой оператор IF. Если необходимо выполнение нескольких действий в ветви, то используют составной оператор - группу операторов, заключенных в операторные скобки beginend. Оператор IF предполагает возможность использования краткой его формы:

I F <Условие> THEN <Оператор>; y y = x

Пример 1. Установить принадлежность точки

(x,y) области на плоскости XY между прямой

y=x и параболой . 0 x

program tochka;

var x, y : real;

begin

writeln(‘Введите через пробел координаты x и y точки’) ; readln(x,y);

if (y<=x) and (y>=x*x)

then writeln(‘Точка принадлежит указанной области’)

else writeln(‘Точка вне области’)

end.

Для организации в программе вариативных действий используют блок варианта и реализующий его оператор CASE - OF - END:

Селектор варианта

Список

значений 1 Сп. знач. 2 Сп. знач. i Иначе

Вариант Вариант Вариант Вариант действий

действий 1 действий 2 действий i для значений вне

списков

Case <переменная-селектор > of

z1_1, z1_2, …, z1_n : <Оператор 1>;

z2_1, z2_2, …, z2_k : <Оператор 2>;

. . .

zi_1, zi_2, … , zi_m : <Оператор i>

[ else <оператор> ] end;

Переменная, используемая в операторе в качестве селектора, может быть любого порядкового типа. В соответствии с принимаемым ею до оператора CASE значением (z1_1 … zi_m) выполняется один из операторов (1 … i). Если селектор принимает значение, не указанное ни в одном из списков, то выполняется оператор, следующий за служебным словом ELSE. Последняя часть конструкции может отсутствовать, в этом случае никаких альтернативных действий не производится.

Пример 2. Смоделировать работу калькулятора для четырех действий.

program calc;

var o1,o2,rez : real; {Операнды и результат выполнения операции}

d : char; {Выполняемое арифметическое действие}

begin

writeln(‘Введите через пробел два операнда’); readln(o1,o2);

writeln(‘Введите выполняемое действие’); readln(d);

case d of

‘+’ : begin rez:= o1+o2; writeln(‘Сумма = ’,rez) end;

‘-’ : begin rez:= o1-o2; writeln(‘Разность = ’,rez) end;

‘*’ : begin rez:= o1*o2; writeln(‘Произведение = ’,rez) end;

‘/’ : begin rez:= o1/o2; writeln(‘Частное = ’,rez) end

else writeln(‘Введен неверный символ операции’) end;

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]