Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 11 ВТ и П.doc
Скачиваний:
3
Добавлен:
22.07.2019
Размер:
324.1 Кб
Скачать

3.Алгоритмы с разветвляющейся структурой. Оператор выбора if.

Логический тип данных. Логические выражения и логические операции.

Практически в любой программе программист сталкивается с определённым выбором, какие действия сделать на следующем этапе. Этот выбор зависит от определённого стечения обстоятельств – логического условия, в отношении которого можно однозначно сказать, было ли это стечение обстоятельств или нет: истинно или ложно наше логическое условие. Например, нам нужно узнать, какое из чисел больше и с тем, которое больше, выполнить определённые операции. В этом случае мы сравниваем одно число с другим и в зависимости от результата сравнения выполняем дальше те или иные действия.

В качестве другого примера можно рассмотреть вопрос о том, правильно ли ввёл пользователь входные данные. Допустим, что введённое число должно быть строго положительным, а пользователь ввёл отрицательное число. Пусть это введённое число будет записываться в переменную х. В этом случае мы должны проверить, будет ли x>0. Если х>0, мы можем продолжать вычисления с этим введённым числом, ну а если x<0 или x=0, то нужно обратить на это внимание пользователя, выведя сообщение о том, что исходные данные введены неправильно, и попросить ввести верные исходные данные заново. Вот как будет выглядеть фрагмент такой программы:

Varx: integer;

Writeln(‘Введите первое число. Это число должно быть положительным’);

Readln(x);

Ifx<=0 thenwriteln(‘Вы ввели отрицательное или равное 0 число. Введите, пожалуйста, строго положительное число’);

Readln(x);

Как видим, для описания оператора ветвления мы используем структуру:

If логическое условие then операция;

Часто бывает необходимо выполнить некоторые действия и в том случае, если логическое условие будет неверным, то есть ложным. Например, пользователь вводит год своего рождения. Если этот год больше 1980, то мы записываем его в переменную a, а если меньше 1980 г., то в переменную b, но при этом незадействованным переменным нужно присвоить значение 0.

Ниже приведён фрагмент такой программы:

Var a,b,c: integer;

Writeln(‘Введите год вашего рождения’);

Readln(c);

If c>1980 then

Begin

a:=c;

b:=0;

end

else

begin

b:=c;

a:=0;

end;

Как видим, в этом случае мы используем оператор else:

If логическое условие then оператор 1

Else оператор 2

Кроме того, в фрагменте выше операторы 1 и 2 представляют из себя последовательность действий, содержащую более одной операции. В таком случае необходимо использовать операторные скобки begin … end, которые как раз и обозначают нашу последовательность действий.

Получается, что оператор ifв этом случае становится таким:

If логическое условие then

Begin

Оператор 1;

Оператор 2;

Оператор n;

End

Else

Begin

Оператор 1;

Оператор 2;

Оператор n;

End;

Обратите внимание, что перед словом else“;” не ставится!

Иногда бывает необходимо проверить что-то несколько раз подряд. Например, нам нужно узнать, больше ли введённый год рождения 1980 года и если он больше, то попросить пользователя ввести ещё и месяц своего дня рождения, и если этот месяц относится ко второй половине год (месяцы с 7 по 12), то вручить пользователю приз. Ну а если год рождения меньше 1934, то пользователь получит утешительный приз. В этом случае нам нужно использовать вложенные логические операторы:

Var

a: word; //год рождения

b: 0..12; //месяц рождения (задан интервальным типом данных)

Writeln(‘Введите год своего рождения’);

Readln(a);

If a>1980 then

Begin

Writeln(‘Введите месяц рождения’);

Readln(b)

Ifb>=7 thenwriteln(‘Вы получаете приз!’)

Elsewriteln(‘Вам чуть-чуть не хватило до победы’);

End

Else

ifa<1934 thenwriteln(‘Вы получаете утешительный приз’)

else

writeln(‘Сегодня приз получит другой’);

Здесь мы описали более сложное выражение, чем в предыдущих примерах, так как у нас условие имеет не 2 варианта, а уже 4:

год рождения пользователя меньше 1980 года и больше или равен 1934 году (не получает приз)

больше 1980 года и месяц рождения относится ко второй половине года (получает приз)

больше 1980 года и месяц рождения относится к первой половине года (не получает приз)

год рождения меньше 1980 и меньше 1934 года (получает утешительный приз)

В качестве примера можно рассмотреть программу, которая запрашивает у пользователя 2 числа и возводит в квадрат те из чисел, которые являются положительными:

program Example1;

{$APPTYPE CONSOLE}

{Программа возводит введённые пользователем числа в степень в том случае, если они оказываются неотрицательными}

uses

SysUtils;

Var a,b: real;

begin

Writeln('Vvedite pervoe chislo');

Readln(a);

If a>=0 then a:=a*a;

writeln(a);

Writeln('Vvedite vtoroe chislo');

Readln(b);

If b>=0 then b:=b*b;

writeln(b);

Readln;

end.

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

В языке TurboPascalесть специальный тип данных, который может принимать всего 2 значения – истину или ложь (trueили false). Переменные такого типа описываются следующим образом:

Var

a: boolean;

b: Boolean;

Переменным этого типа можно присваивать логические выражения, например,

a:=(x=10);

Если в программе xокажется равным 10, то значение переменной aстанет истиной (true), а иначе окажется ложью (false).

Значения переменных логического типа можно выводить на экран монитора, их можно сравнивать между собой, например, ifa>b. При этом значение trueсчитается больше значения false.

Поскольку логический тип данных Boolean относится к порядковым типам данных, то к логическому типу данных применимы знакомые нам функции:

Ord(a); //ord(false)=0, ord(true)=1;

Pred(a); //pred(true)=false;

Succ(a); //succ(false)=true;

Odd(x); //odd(3)=true, odd(2)=false;

Как пример применения логического типа данных можно рассмотреть следующий фрагменты программы:

Var

t: boolean;

a,b: integer;

Begin

t:=a>b

If a<>b then if t then writeln(‘Наибольшее= ',a)

else writeln(‘Наибольшее=’,b)

В этом фрагменте программы сначала высчитывается значение логической переменной типа boolean – t:=a>b. При этом, если a>b, то значение t будет равным trueи оператор ift выполнится, если a=b или a<b, то значение переменной t станет равным false.

Если значения a и b не равны, то программа выведет наибольшее из этих двух значений.

Логические выражения и логические операции.

Чаще всего логический тип данных используется пи расчёте значения логического выражения. В таком выражении принимают участие логические операнды – логические высказывания. Логическое высказывание – это повествовательное предложение, в котором что-то утверждается. В отношении такого утверждения всегда можно однозначно сказать, истинно оно или ложно. Например, утверждение «Москва – столица России» истинно, а утверждение «Все солдаты РФ храбрые» однозначно ложное.

С такими высказываниями применяют операции:

Операция «ИЛИ». Эта операция Логическое высказывание 1 ИЛИ Логическое высказывание 2 даст значение Истина в том случае, если хотя бы одно из логических высказываний будет истинным.

Возможные значения этой операции можно увидеть в таблице:

a

b

a and b

false

false

false

false

true

False

true

false

false

true

true

true

Как видите, логическую операцию «ИЛИ» в программе Turbo Pascal представляют как or.

Пример использования операции «ИЛИ»:

Нужно определить, равен ли х пяти: х=5,

либо больше ли х числа 96? Если это так и хотя бы в одном случае значение х удовлетворяет нашим условиям, то произвести над х какие-то операции.

В программе это выражение запишется так:

If (x=5) or (x>96) then набор операций

Заметьте, что оба логических условия обязательно необходимо заключать в скобки, иначе оператор orбудет работать непосредственно с наиболее близкими к нему значениями и будет выполняться 5 orx, что не будет иметь смысла.

Операция «И». Эта операция Логическое высказывание 1 И Логическое высказывание 2 даст значение Истина в том случае, если оба из логических высказываний будут истинны.

Возможные значения этой операции можно увидеть в таблице:

a

b

a and b

false

false

false

false

true

true

true

false

true

true

true

true

Логическую операцию «И» в программе Turbo Pascal представляют как and.

Пример использования операции and:

Нужно определить, принадлежит ли x диапазону [-27;-15] или [896;12507].

В программе это будет указано так:

If ((x>=-27) and (x<=15)) or ((x>=896) and (x<=12507)) then набор операций

Здесь указывается 2 диапазона и между ними ставится оператор or. Получается, что всё выражение вычисляет, принадлежит ли х одному из диапазонов. А сами диапазоны задаются с помощью логического оператора and:

(x>=-27) and (x<=15)

и

(x>=896) and (x<=12507)

Операция «НЕ». Эта операция применяется к одному операнду и меняет его значение на противоположное:

НЕ(Логическое высказывание) даст значение Истина в том случае, если само логическое высказывание будет иметь ложное значение, и даст Ложь, если высказывание будет истинным.

Возможные значения этой операции можно увидеть в таблице:

a Not(a)

false true

true false

Логическую операцию «НЕ» в программе Turbo Pascal представляют как not.

Чаще всего операцию not применяют как вспомогательную. Например, нам нужно, чтобы xне принадлежал указанному диапазону из предыдущего примера.

Тогда условие запишется так:

t:=((x>=-27) and (x<=15)) or((x>=896) and (x<=12507)) //t—логическая переменная, которая примет определённое значение (false или true) в зависимости от значения х.

If not(t) then набор операций

Операция «ИЛИ-НЕ». Эта операция Логическое высказывание 1 ИЛИ-НЕ Логическое высказывание 2 даст значение Истина в том случае, если логические высказывания будут разными по значениям и даст Ложь, если будут равны друг другу.

Возможные значения этой операции можно увидеть в таблице:

a

b

a and b

false

false

false

false

true

False

true

false

false

true

true

false

Логическую операцию «ИЛИ-НЕ» в программе Turbo Pascal представляют как XOR.

Как видим, операция XOR отличается от операции AND только в 4-й строчке таблицы, когда оба логических значения равняются true.

Пример использования операции XOR:

Мама попросила дочь в магазине купить ряженку фирмы «Вологодские кружева» или любые сырочки, но и ряженку и сырочки вместе покупать не нужно. Программа показывает, будет ли мама довольна покупкой своей дочери:

Var

t1: boolean; //покупка ряженки (если купила, t1=true)

t2: boolean; //фирма ряженки (если фирма ряженки «Вологодские кружева», t2=true)

t3:boolean; //покупка сырочков (если купила, t3=true)

If ((t1 and t2) XOR (t3)) then writeln(‘Мама довольна’)

elsewriteln(‘Мама не довольна’)

Теперь давайте потренируемся выполнять логические условия по заданиям.

Записать выражения на языке TurboPascal, которые возвращают значение истина в результате своего выполнения:

0<x<1: (x>0) and (x<1)

x=max(x,y,z): (x>y) and (x>z)

x <>(не равно) max(x,y,z): (x<=y) or (x<=z)

xне принадлежит диапазону [0;1]: (x<0) or (x>1)

Каждое из чисел x,y,z положительное: (x>0) and (y>0) and (z>0)

Хотя бы одно из чисел x,y,z положительное: (x>0) or (y>0) or (z>0)

Ни одно число не является положительным: (x<=0) and (y<=0) and (z<=0)

Только одно из чисел положительное: (x>0) XOR (y>0) XOR (z>0)

Из чисел x,y,z только 2 числа равны между собой: (x=y) XOR (y=z) XOR (x=z)

Число p делится нацело на число q: (pmodq=0) and (q<>0)

Самостоятельное задание.

Задача 1.

В программе вводятся 3 числа – x, y и z.

Записать программу, вычисляющую выражение

min(x,y,z)*x3/(z+y)

в зависимости от условия задачи. Если условие задачи выполняется, программа выводит результат вычислений, если условие не выполняется, то программа выводит на экран сообщение «Условие не выполняется».