Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Паскаль (прогр) 2008июль.doc
Скачиваний:
1
Добавлен:
17.11.2018
Размер:
900.61 Кб
Скачать

4. Логические функции

Функция одного аргумента НЕ (NOT) истинна тогда, когда ложен ее аргумент (значение функции обратно аргументу). Поведение функции полностью описывает таблица. Например, следующие два оператора идентичны

if x<10 then y=5 if not (x>=10) then y=5

Функций двух аргументов. Функция И (AND) истинна когда истинны все ее аргументы. Функция ИЛИ (OR) истинна, если истинен хотя бы один из аргументов. Если нет скобок, функции вычисляются в следующей последовательности: НЕ, И, ИЛИ. Значениям Истина и Ложь в Паскале соответствуют значения True и False.

аргумент

НЕ

1-й арг.

2-й арг.

И

ИЛИ

x:=0; {ровно одно число <0?}

if a<0 then x:=x+1;

if b<0 then x:=x+1;

if c<0 then x:=x+1;

if x=1 then write('верно') else write('неверно');

ложь

истина

ложь

ложь

ложь

ложь

истина

ложь

ложь

истина

ложь

истина

истина

ложь

ложь

истина

истина

истина

истина

истина

Логические операции имеют приоритет перед операциями отношения, поэтому, если таких условий несколько, последние берутся в скобки. Для иллюстрации снова рассмотрим пример 3-2. Решение будет очень компактным (вспомогательные операторы опущены):

readln(a,b,c);

if (a+b>=c) and (b>a) then writeln('верно') else writeln('неверно');

Пример. Для чисел А, В, С выяснить, правда ли что первое число самое большое, а последнее – самое маленькое.

if (a>b) and (a>c) and (c<a) and (c<b) then writeln('верно') else writeln('неверно');

Еще. Верно ли, что среди чисел есть отрицательные.

if (a<0) or (b<0) or (c<0) then writeln('верно') else writeln('неверно');

Еще. Верно ли, что среди чисел ровно одно меньше нуля.

if (a<0)and(b>0)and(c>0) or (a>0)and(b<0)and(c>0) or (a>0)and(b>0)and(c<0)

then writeln('верно') else writeln('неверно');

В этом решении перебираются все возможные, интересующие нас, комбинации переменных. Иногда проще (см. выше) воспользоваться косвенным способом, например, увеличивать вспомогательную переменную X, каждый раз, когда встречается число меньше нуля. Если в конце окажется, что X=1 значит, имеется ровно одно число меньшее нуля.

Пример. Написать программу, которая для любого года G определяет високосный он или нет (ответ Да/Нет). Признаком високосного года является кратность года числу 4 за исключением тех лет, которые делятся на 100 и не делятся на 400. Кратность чисел можно определять с помощью операции MOD.

if (g mod 4=0) and not((g mod 100=0)and(g mod 400<>0)) then writeln('Да') else writeln('Нет');

Задания для самостоятельного решения

4.1. Имеются числа a, b, c. Выяснить, правда ли, что они расположены в порядке возрастания (ответ Да/Нет).

4.2. Выяснить, правда ли, что среди a, b, c имеется точно один 0 (ответ Да/Нет).

4.3. Выяснить, правда ли, что среди a, b, c имеется хотя бы одно отрицательное и одно положительное.

4.4. Выяснить, правда ли что среди чисел a, b, c имеются одинаковые.

4.5. Найти наибольшее из a, b, c. Здесь удобно использовать три оператора IF, каждый из которых проверяет на максимум одно из чисел. Если данное число оказалось наибольшим, следует его напечатать и сразу прекратить вычисления.

4.6. Имеются числа a, b, c. Вывести их в порядке возрастания.

4.7. На плоскости прямоугольник (рис. 4.1а). Напишите программу, которая для точки с произвольными координатами X и Y определяет факт ее попадания внутрь прямоугольника. Ответ – Да/Нет. Вычислить площадь прямоугольника S.

4.8. Для той же фигуры определить факт ее попадания точки в область  или  или вне прямоугольника. Ответ должен быть дан в виде цифр 1, 2 или фразы «Вне прямоугольника».

4.9. На плоскости проведена прямая (рис. 4.1б). Определить в какую из областей , , ,  попала наша точка.

4.10. На плоскости две прямых (рис. 4.1в). Определить, попала ли точка внутрь заштрихованной области (Да/Нет).

4.11. На плоскости (рис. 4.1г) линии Y1=X2 и Y2=1–X/2. Определить, в какую из областей попала точка. Ответ – число 1, 2, 3 или 4. Если точка находится вне этих областей, ответом будет фраза “Вне областей”. Сейчас определим только принадлежность точки к области 2. Для Y можно сказать, что он лежит под прямой Y<1-X/2 и над параболой Y>X2. Отсюда можно записать оператор IF (X<0)and(Y<1–X/2)and(Y>X*X) then write('Область 2'). Завершите решение для остальных областей.

4.12. Положим, автомобиль берется на прокат на несколько часов с возвратом в эти же сутки (например, лимузин для регистрации брака) в момент H1, Min1 (часы, минуты) и возвращается в H2, Min2. Вычислить сколько времени использовался автомобиль T (в часах), а также, сколько должен заплатить клиент за это при часовом тарифе 100$.

4.13. Пусть автомобиль берется на любое число суток с датой G1, M1, H1, Min1 (год, месяц, день, часы, минуты), а возвращается в G2, M2, H2, Min2. Вычислить время проката в часах. Длительность всех месяцев считать равной 30 дням.

4.14. Те же условия, но длительность каждого месяца брать фактической (пока без учета возможной високосности года). Считать также, что событие происходит в нашем десятилетии (2006-2010гг).

4.15. То же, но с учетом високосности.

О

CASE выражение OF

константа1: оператор1;

константа2: оператор2;

. . .

ELSE операторN;

END;

ператор выбора (селектор).
При необходимости сделать выбор из многих альтернатив конструкция с вложением if становится очень громоздкой. В этом случае полезным оказывается оператор CASE. Здесь выражение может быть целого или символьного типа. Если его значение равно одной из констант, выполняется соответствующий оператор. Если ни одна из констант не подходит, выполняется оператор, следующий после слова else (если есть). Любая из констант может быть диапазоном (через две точки) и/или множеством констант (через запятую). Любой оператор может быть блоком begin и содержать свои операторы case и if.

Пример 4-1. Создадим программу, которая умеет конвертировать в рубли любую из трех валют – доллар, фунт, евро. Нам понадобятся следующие переменные: конвертируемая сумма в валюте – sv, курсы каждой из валют – kursD, kursF, kursE; символ, указывающий на вид валюты – valuta (одна из букв d, f, e); и полученная сумма в рублях – sr. В программе не указаны конкретные курсы валют – вместо них стоит многоточие. Подставьте их сами. Программа умеет реагировать на ошибочно введенный символ валюты сообщением “валюта неизвестна”.

program P4_1; {конвертирование}

var sv,sv,kursD, kursF, kursE:real;

valuta:char;

begin

kursD:=... ; kursF:=... ; kursE:=... ;

readln(sv,valuta);

case valuta of

'd': sr:=sv*kursD;

'f': sr:=sv*kursF;

'e': sr:=sv*kursE;

else begin writeln('валюта неизвестна');

exit; end;

end

writeln('В рублях=', sr:8:2)

end.

program P4_2; {возраст}

var t:integer; p:char;

begin

t:=... ; p:='ж';

case t of

0..17: write('детство');

20..30:write('молодость');

31..54:write('зрелость');

else if (p='ж') or (t>=60)

then write('пенсия')

else write('зрелость')

end

end.

program P4_3; {символы}

var s:char;

begin

write('введите символ '); readln(s);

case s of

'A'..'Z','a'..'z': write('латинский');

'А'..'Я','а'..'п','р'..'я','Ё','ё': write('русский');

'0'..'9': write('цифры');

'+','-','/','*': write('знаки операций');

',','.',';': write('знаки препинания');

else write('вспомогательные знаки')

end

end.

Пример 4-2. Пусть требуется по числу прожитых лет T отнести человека к какой-то возрастной группе. Здесь приходится использовать диапазон констант и внутреннее IF. Решение очевидно, но нуждается в одном пояснении. Поскольку женщины и мужчины уходят на пенсию в разное время (55 и 60 лет), кроме возраста нужно учитывать и пол P.

Пример 4-3. Положим, введен какой-то знак в переменную S и его нужно отнести к соответствующей группе. Следует сказать, что латинские символы в символьной таблице ПК находятся не вместе. Подряд идут буквы с A по Z, затем идут не буквы, затем буквы с a по z. В виду этого пришлось указать два диапазона констант ('A'..'Z','a'..'z'). Символы русского алфавита состоят из еще большего числа диапазонов (см. раздел ‘Символьные данные’).

Задание 4.16. Используя оператор CASE, написать программу, в которой вводятся два числа-операнда X и Y и знак операции Z (+,–,/,*). Вычислить результат S в зависимости от знака. Предусмотреть реакции на возможный неверный знак операции, а также на ввод Y=0 при попытке выполнить деление ('Деление на ноль не возможно')