Учебник по программированию.

Первые шаги. Язык программирования PascalABC.

Предыдущий параграф Назад в содержание Следующий параграф


§5. Условия. Логические выражения. Оператор выбора Case.

Условия.

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

If условие then …………… else …………;

Если перевести на русский будет так:

Если условие тогда …………… в противном случае …………;

После слова then находится то, что необходимо выполнить в случае, если условие верное. После слова else находится то, что необходимо выполнить, если условие не выполняется.


Пример:


  if x>0 then x:=x+1 else x:=x-1;


В данном примере если х больше нуля, то переменная х будет увеличена на единицу, если меньше нуля или равна нулю, то будет уменьшена на единицу.

Может получиться так, что в одну строчку данная конструкция не войдёт. Тогда можно её расписать в несколько строчек:


  if x>0

   then

    writeln('x - число положительное.')

   else

    writeln('x - число отрицательное или равно нулю.');


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

Двигаемся дальше. Если после слов then или else необходимо выполнить несколько операторов, то их нужно заключить словами begin и end:

 

  if x>0

   then

    begin

     x:=x+1;

     writeln('x - число положительное.')

    end;

   else

    begin

     x:=x-1;

     writeln('x - число отрицательное или равно нулю.');

    end;


Обратите внимание, что в первом случае перед соловом end точка с запятой не стоит, а стоит только после слова end. Во втором случае точка с запятой стоит и перед словом end и после. В обоих случаях всё верно. Дело в том, что точка с запятой отделяет одну операцию от другой. Слово end не является операцией, поэтому не имеет значения, где вы поставите точку до или после, или в обоих местах. На практике рекомендую не жалеть точек с запятой лучше лишний раз поставить, чем потом искать ошибку, когда программа в несколько сотен строк не будет компилироваться.

Данную конструкцию можно использовать и без слова else:


  if x>0 then x:=x+1;

 

В данном случае если условие верно, то выражение будет выполнено, если нет, то не будет.


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

Далее более подробно поговорим об условии. Слово «условие» было использовано для более простого понимания. На самом деле условие это логическое выражение. Ещё такие выражения называются булевыми.

Название “булевые” произошло от имени математика Джорджа Буля, разработавшего в XIX веке булевую логику и алгебру логики.

Результатом логического выражения может быть только два значения верно (true, правда) или неверно (false, ложь). Результат логического выражения можно присвоить логической переменной. В Pascal логическая переменная имеет тип Boolean. Пример:


var L:boolean;

begin

  L:=5>1;

  Writeln(L);

end.

____________________

True


Логическое выражение сравнивает какие-либо значения между собой. Для сравнения существуют следующие знаки:

<    меньше;

> ­   больше;

<=  меньше или равно;

>=  больше или равно;

<>  не равно;

=    равно.

Далее приведена таблица использования каждого символа и результаты выражений:


Знак

Выражение

Результат

<

3<5

True

>

3>5

False

<=

3<=3

True

3<=5

True

3<=2

False

>=

3>=2

True

3>=3

True

3>=5

False

<>

3<>3

False

3<>4

True

=

3=3

True

3=3

True


Слева или справа от знака может находиться переменная, константа, арифметическое выражение или строка. Например:


(2+3)<=(x*4)


Обратите внимание, что арифметические выражения слева и справа обрамлены круглыми скобками. Это потому, что данные символы имеют приоритет при вычислении. Т.е. если бы они не использовались:


2+3 <= x*4


То во время работы программы вначале начнут сравниваться 3 и х. А затем программа попытается результат этого сравнения помножить на 4. Так как нельзя логическое значение помножать или складывать, то возникнет ошибка. Можете попробовать и убедиться сами.

Двигаемся дальше. В логических выражениях кроме символов используются логические операции not (не), or (или), and (и).

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

Слева и справа от логических операций And и Or должны находиться переменные типа Boolean или логические выражения. Логические выражения необходимо заключать в круглые скобки, т.к. логическая операция обладает большим приоритетом перед знаками. Если мы напишем выражение без скобок, то вначале будет выполняться логическая операция и компилятор может выдать ошибку т.к. слева и справа от неё могут оказаться переменные не логического типа. Например:


x>0 And y<>0


Здесь вначале будет вычисляться операция And, а слева и справа от неё находятся константа 0 и переменная у, они не логического типа. Соответственно при компиляции появится ошибка, и программа не будет скомпилирована. Необходимо написать следующим образом:


(x>0) And (y<>0)


То же самое относится и к операции Not. Единственная разница то, что логическое выражение или переменная находятся с права от этой операции.

Логическая операция And выдаёт результат True если слева и справа от него значения равны True в остальных случаях False:

True And True = True (правда и правда = правда);

False And False = False (ложь и ложь = ложь);

True And False = False (правда и ложь = ложь).

Например: нам необходимо переменную x увеличить на единицу, но только в случае, если x больше нуля и y не равно нулю. Не используя логические операции, это можно реализовать следующим образом:


If x>0 then

begin

  If y<>0 then x:=x+1;

end


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

Используя логическую операцию And (и), это же самое реализуется следующим образом:


If (x>0) And (y<>0) then x:=x+1;


Как видно мы уложились в одну строчку. То есть логические операции уменьшают количество кода и тем самым улучшают читаемость программы.

Логическая операция Or (или) выдаёт True если хотя бы одно значение (с лева или с права) равно True.

True Or True = True (правда или правда = правда);

False Or False = False (ложь или ложь = ложь);

True Or False = True (правда или ложь = правда).

Например: нам необходимо переменную x увеличить на единицу в случаях, если x больше нуля или y не равно нулю. Т.е. нам без разницы, соблюдаются эти два условия одновременно или нет. Мы увеличим х на единицу в любом из двух случаев, если х будет больше нуля или если у будет не равно нулю. В коде это будет выглядеть следующим образом:


If (x>0) Or (y<>0) then x:=x+1;


Логическая операция отрицания Not (не) ставиться перед логическим значением или выражением и меняет его значение на противоположное (инвертирует):

Not True = False (не правда = ложь);

Not False = True (не ложь = правда).

На первый взгляд кажется, что такую операцию нигде не применишь. На самом деле, на практике она часто используется. Например, некая функция возвращает логическое значение, и нам необходимо выполнить какое-либо действие, если это логическое значение будет равно False. Например, при отпускании кнопки нам необходимо выключить лампочку. Тогда без помощи операции Not код будет выглядеть следующим образом:


If Knopka

  then

    ....;

  else

    Vikl;


Здесь функция Knopka проверяет нажата ли кнопка и возвращает True если кнопка нажата и False если кнопка не нажата. Вместо точек мы должны вставить какой-то пустой оператор, который ничего не будет выполнять. Процедура Vikl производит выключение лампочки. При использовании операции Not, код будет выглядеть несколько проще:


If Not Knopka then Vikl;


Как видно код уместился в одну строчку. Если кнопка не нажата, то функция Knopka выдаст значение False. С помощью операции Not мы меняем это значение на противоположное (инвертируем), и получаем значение True. И тогда запустится процедура Vikl.

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

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

Далее приведу пример использования программы с условием. Задача: необходимо определить принадлежит ли точка А с координатами (5;15) области, которая описывается следующими условиями:

,

.

Что бы было понятно, откуда взялись эти условия, приведу рисунок, на котором заштрихованная область как раз и описывается данными условиями:

Так же обратите внимание, что отрезки, начерченные толстой линией, принадлежат области, тонкой не пренадлежат.

Решение:


Program Oblast;

Var x,y:integer;

    l:boolean;

Begin

  x:=5;

  y:=15;

  l:=((x>4)and(x<=10))and((y>0)and(y<=3*x+4));

  If l

   then

    write('Точка А принадлежит данной области.')

   else

    write('Точка А не принадлежит данной области.');

end.

_____________________________________________________

Точка А принадлежит данной области.



Оператор выбора Case.

Рассмотрим следующую задачу: необходимо вывести на экран введённое пользователем число в словесной форме. Попробуем решить данную задачу теми методами, которые мы уже знаем:


Var Ch:Byte;

Begin

  Writeln('Введите число');

  Read(Ch);

  Write('Вы ввели число ');

  If Ch=1 then Write('один');

  If Ch=2 then Write('два');

  If Ch=3 then Write('три');

  If Ch=4 then Write('четыре');

  If Ch=5 then Write('пять');

  Write('.');

end.


Как вы заметите данный способ достаточно неудобный и утомительный. В языке Pascal для реализации данной задачи существует оператор выбора Case. Эта же задача, реализованная с помощью оператора Case, будет выглядеть следующим образом:


Var Ch:Byte;

Begin

  Writeln('Введите число');

  Read(Ch);

  Write('Вы ввели число ');

  Case Ch of

    1:Write('один');

    2:Write('два');

    3:Write('три');

    4:Write('четыре');

    5:Write('пять');

   end;

  Write('.');

end.

___________________________

Введите число

3

Вы ввели число три.


Между словами Case и of должна находиться переменная. После слова of находятся значения, которые может принимать эта переменная. После этого значения ставиться двоеточие и оператор, который необходимо выполнить, если переменная имеет данное значение. Если необходимо выполнить несколько операторов, то их необходимо выделить словами begin и end. В конце данной конструкции должно находиться слово end.

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

Как видно такой способ намного нагляднее и удобнее. Так же у данного способа есть ещё одно преимущество. Если необходимо выполнить какое-либо действие в случае, если значение переменной не совпадает ни с одним из предложенных, то можно дописать слово else, после которого нужный код. Пример:


Var Ch:Byte;

Begin

  Writeln('Введите число');

  Read(Ch);

  Write('Вы ввели число ');

  Case Ch of

    1:Write('один');

    2:Write('два');

    3:Write('три');

    4:Write('четыре');

    5:Write('пять');

    else Write('больше пяти');

   end;

  Write('.');

end.

____________________________________

Введите число

7

Вы ввели число больше пяти.


Бывает, что необходимо выполнить одно действие, если переменная принимает несколько значений. И другое действие, если переменная принимает несколько других значений. В таком случае пишется ряд этих значений через запятую, затем после двоеточия то, что необходимо выполнить. Примером может быть такая задача: пользователь вводит номер месяца, а компьютер выводит к какому времени года принадлежит этот месяц. Решение:


Program Kalendar;

Var m:byte;

begin

Writeln('Введите номер месяца.');

Read(m);

Case m of

   1,2,12:Writeln('Зимний месяц.');

   3,4,5:Writeln('Весенний месяц.');

   6,7,8:Writeln('Летний месяц.');

   9,10,11:Writeln('Осенний месяц.');

   else Writeln('Вы ввели не правильный номер месяца.')

end

end.

_______________________________________________________

Введите номер месяца.

4

Весенний месяц.


В данном параграфе мы познакомились с условиями и научились принимать решения во время исполнения программы. Так же познакомились с оператором выбора Case.


Задачи:

1. С клавиатуры вводится три числа. Необходимо найти сумму только положительных чисел.

2. Пользователь вводит с клавиатуры целое число от одного до трёх. Необходимо вывести на экран сообщение о том, какое число было введено. В сообщении число выводится буквами, а не цифрами.

3. Пользователь водит число от одного до семи. Необходимо вывести день недели, который соответствует данному числу.

4. Пользователь вводит два числа. Необходимо вывести их в порядке возрастания.

5. Составить программу, в которой необходимо ввести код из трёх цифр, а затем программа выводит правильно ли он введён. Верный код 247.

6. Дана плоскость с осями Х и У. На плоскости нарисован квадрат ABCD. Необходимо определить где находится точка Е в нутрии квадрата, снаружи или на его контуре. Координаты точки должны вводиться с клавиатуры. Координаты крайних точек квадрата следующие: A(4;3), B(6;3), C(6;0), D(4;0).

7. Пользователь вводит с клавиатуры число. Программа должна выводить на экран день недели определённого месяца, определённого года, соответствующий данному числу.


Решение:

1.


Program P_1;

var a,b,c,s:real;

begin

s:=0;

Writeln('Введите 3 числа.');

read(a,b,c);

If a>0 then s:=s+a;

if b>0 then s:=s+b;

if c>0 then s:=s+c;

writeln('Сумма положительных чисел равна: ',s,'.');

end.

_______________________________________________________

Введите 3 числа.

3

-4

8

Сумма положительных чисел равна: 11.


2.


Program P_2;

var x:byte;

begin

Writeln('Введите целое число от 1 до 3.');

read(x);

If x=1 then write('Вы ввели один.');

If x=2 then write('Вы ввели два.');

If x=3 then write('Вы ввели три.');

end.

___________________________________________

Введите целое число от 1 до 3.

2

Вы ввели два.



3.

Program P_3;

var x:byte;

begin

Writeln('Введите целое число от 1 до 7.');

read(x);

If x=1 then write('Понедельник.');

If x=2 then write('Вторник.');

If x=3 then write('Среда.');

If x=4 then write('Четверг.');

If x=5 then write('Пятница.');

If x=6 then write('Суббота.');

If x=7 then write('Воскресенье.');

end.

____________________________________________

Введите целое число от 1 до 7.

4

Четверг.


4.


Program P_4;

var x,y:real;

begin

Writeln('Введите два разных числа.');

read(x,y);

If x>y

   then

     write(y,'  ',x)

   else

     write(x,'  ',y);

end.

_______________________________________________

Введите два разных числа.

4

2

2  4


5.

Program P_5;

var k1,k2,k3:byte;

begin

Writeln('Введите код из трёх цифр.');

read(k1,k2,k3);

If (k1=2)and(k2=4)and(k3=7)

   then

     write('Код введён верно.')

   else

     write('Код введён не верно.');

end.

________________________________________

Введите код из трёх цифр.

2

4

7

Код введён верно.


6.

Program P_6;

var x,y:real;

begin

Writeln('Введите координаты точки.');

read(x,y);

If (x<4)and(x>6)and(y<0)and(y>3)

   then

    write('Точка находится вне квадрата.')

   else

     If ((x=4)and(y>0)and(y<3)) or

        ((x=6)and(y>0)and(y<3)) or

        ((x>4)and(x<6)and(y=3)) or

        ((x>4)and(x<6)and(y=0)) 

      then

        write('Точка находится на контуре квадрата.')

      else

        write('Точка находится внутри квадрата.');

end.

_________________________________________________________

Введите координаты точки.

4

2

Точка находится на контуре квадрата.


Пояснение. Если проанализировать задачу можно обнаружить, что здесь всего три случая  точка находится вне квадрата, точка находится на контуре квадрата и точка находится внутри квадрата. Других случаев быть не может. Разобьём задачу на два этапа.

Первый этап определяем находится точка вне квадрата или нет. Для этого необходимо создать логическое выражение. Будем рассуждать следующим образом: точка находится вне квадрата тогда, когда х меньше 4 и больше 6, а так же у меньше 0 и больше 3. Получаем следующее логическое выражение: (x<4) and (x>6) and (y<0) and (y>3). Если точка находится вне квадрата, то выводим соответствующее сообщение и на этом всё заканчивается, если нет, то приступаем ко второму этапу.

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

(x=4)and(y>0)and(y<3).

Для всего контура получаем:

((x=4)and(y>0)and(y<3)) or ((x=6)and(y>0)and(y<3)) or ((x>4)and(x<6)and(y=3)) or  ((x>4)and(x<6)and(y=0)).

Если мы уже во втором этапе и точка не принадлежит контуру, то однозначно точка находится в квадрате.


7.

Program P_7;

Var m:byte;

begin

Writeln('Введите число.');

Readln(m);

Case m of

   6,13,20,27:Writeln(m,' мая 2013 года - это понедельник.');

   7,14,21,28:Writeln(m,' мая 2013 года - это вторник.');

   1,8,15,22,29:Writeln(m,' мая 2013 года - это среда');

   2,9,16,23,30:Writeln(m,' мая 2013 года - это четверг.');

   3,10,17,24,31:Writeln(m,' мая 2013 года - это пятница.');

   4,11,18,25:Writeln(m,' мая 2013 года - это суббота.');

   5,12,19,26:Writeln(m,' мая 2013 года - это воскресенье.');

   else Writeln('Вы ввели не правильное число.')

end

end.

_________________________________________________________________

Введите число.

21

21 мая 2013 года - это вторник.




Предыдущий параграф Назад в содержание Следующий параграф