Базовые разветвляющиеся структуры и их программирование.



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

В VC++определен логический тип данных bool (от фамилии английского математика George Boole, одного из основателей математической логики).Переменные логического типа используются для хранения логического значения и могут принимать одно из двух значений: true (истина) или false (ложь). Внутренняя форма представления значения false - 0 (нуль), а любое другое значение интерпретируется как true . При преобразовании к целому типу true имеет значение 1. Рассмотрим пример фрагмента программного кода:

 

... bool b=false; // переменной b будет присвоено нулевое значение int x=-1,y=1; b=(x<=y); // т.к. -1<1, то b=true(а на самом деле компилятор          // поместит в область памяти переменной b единицу b=5;//т.к. выражение справа от знака = в операторе присваивания // не равно нулю (что соответствует true), то b=true // (а в переменную b компилятор все равно занесет единицу) int n=b+1;//при использовании логических переменных в     //выражениях, компилятор вместо true подставляет 1, // а вместо false - 0. Поэтому n=1+1=2 ...

 

 

Операции отношения (сравнения):

                                                                       

Операции отношения Значение
< Меньше, чем
> Больше, чем
<= Меньше или равно
>= Больше или равно
== Равно
!= Не равно

 

Операции отношения предназначены для сравнения двух величин, то есть для проверки их на отношения «равенство», «больше», «меньше» и т. д. Результатом сравнения служит логическое значение, которая может иметь истинное или ложное значение. Ложное значение представляется нулем, истинное – единицей или любым другим числом, отличным от нуля. Первые четыре операции отношения имеют более высокий приоритет, чем две последних, поэтому в таблице они разделены жирной чертой.

Сложное логическое выражение состоит из простых логических выражений, переменных и констант, связанных логическими операциями. Перечень логических операций VС++ и их таблицы истинности приведены ниже (слайды 6-7).

 

Логические операции:

       

Логическая операция Результат
! (НЕТ, отрицание) Преобразует значение true в false и наоборотfalse в true
&& (И,конъюнкция) Результат операции true, если оба операнда имеют значение true
|| (ИЛИ,дизъюнкция) Результат операции true, если хотя бы один из операндов имеет значение true

                    

Таблица истинности:

                                               

Значения
операндов

! x

 

 

X && y

 

X || y

 

X Y
T T F T T
T F F F T
F T T F T
F F T F F

 

Операции && (логического И) и || (логического ИЛИ) предназначены для выполнения действий над булевыми переменными; результатом этих операций служит также булева переменная. Операция ! (логического НЕ) меняет значение своего операнда на противоположное: истину на ложь, и наоборот.

При вычислении логических выражений логические операции имеют следующий приоритет (по убыванию): НЕ, И , ИЛИ.

Примеры логических выражений с логическими операциями (слайд 8):

 

x > 0 && y > 0     a == 0 && ( x > y || Z > y )          !( a == 0 && b = = 0)

Приоритеты операций C++

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

 

Тип операций Операции Приоритет
Унарные !, ++, --, +, - Высший
Арифметические Мультипликативные *, / ,% Аддитивные +, -  
Отношения Неравенства <,>,<=,>= Равенства ==, !=  
Логические И  && ИЛИ  ||  
Тернарная (условная) ?:  
Присваивания =, +=, -=, *=, / =, %= Низший  

 

 

Операторы языка VС++ для программирования разветвлений.

 

Разветвляющиеся алгоритмические структуры в языках программирования реализуются операторами условного перехода.

В VС++для реализации разветвляющихся алгоритмических структур используются два типа операторов условного перехода: 

· if, который применяется для разветвления процесса вычислений на два направления  

· switch (переключатель), предназначенный для разветвления процесса вычислений на несколько направлений (выбора из множества альтернатив).

· тернарная условная операция.

 

 Условный оператор if имеет следующие форматы:

if (ЛогическоеВыражение) оператор1; else оператор2;

if (ЛогическоеВыражение) оператор;

if (ЛогическоеВыражение) блок1; else блок2;

if (ЛогическоеВыражение) блок;

 

Порядок выполнения оператора следующий: сначала вычисляется логическое выражение, которое, как уже было сказано, может иметь арифметический беззнаковый тип.  Если значение выражения не равно нулю (имеет значение true ), то выполняется первый оператор (оператор1), иначе – второй (оператор2). После этого управление передается на оператор, следующий за условным. Конструкция else является необязательной и может от­сутствовать. Если в какой-то ветви требуется выполнить несколько операторов, их необходимо заключить в блок (фигурные скобки { }), иначе компилятор не сможет понять, где заканчивается ветвление.

 

if (a<0) b=1; if (a++) b++; if (a<b && (a>d ||a==0))b++; else {b*=a; a=0;}

 

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

 

if (a<b && (a>d ||a==0))     b++; else {     b*=a;     a=0; }

 

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

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

 

 

if (a<b) {if (a<c) m = a; else m = c;} else {if (b<c) m = b; else m = c;} В этом примере оператор вычисляет наименьшее значение из трех переменных. Фигурные скобки в данном случае не обязательны.

 

Остановимся на распространенных ошибках при записи условных операторов:

· Нередко  в выражениях вместо проверки на равенство (==) ошибочно записывают простое присваивание(=), например

if ( a =1) b =0;

Синтаксической ошибки нет, так как операция присваивания формирует результат, который и оценивается на равенство/неравенство нулю. Здесь присваивание нуля переменной b будет выполнено независимо от значения переменной a.

· Второй распространенной ошибкой является неверная запись проверки на принадлежность диапазону. Например, чтобы проверить условие 0< x <1, нельзя записать его в условном операторе непосредственно, т.к. будет выполнено сначала сравнение 0< x, а его результат (true  или false, преобразованное в int), будет сравниваться с 1. Правильный способ записи:

if (0< x && x <1)…

 

Оператор переключательswitch позволяет осуществить разветвление по любому фиксированному числу ветвей. Он имеет следующий формат (слайд 16):

 

switch (выражение)

{

c ase константное выражение_1:

     блок_операторов_1;

break ;

c ase константное выражение_2:

     блок_операторов_2;

break ;

c ase константное выражение_n:

     блок_операторов_n;

break ;

default :

     операторы по умолчанию;

}

 

Выполнение оператора начинается с вычисления выражения – оно в конечном итоге сводится к целому типу. Точки, куда затем передается управление, помечены ключевым словом c ase, каждой такой метке сопоставлена константа для сравнения со значением, вычисленным в скобках. Таким образом, управление передается первому оператору из списка c ase, в котором значение константного выражения совпало с вычисленным. Обычное использование инструкции c ase предполагает, что выполняется только данная ветвь программы, поэтому эта ветвь должна каким-то образом завершиться. Для завершения выполняемой ветви используется: или инструкция break , которая передает управление на первый оператор, следующий за switch, или инструкция return, которая возвращает управление вызвавшей функции. При отсутствии инструкций break или return последовательно выполняется следующая ветвь переключателя. Иногда программист намеренно передает управление из одной ветви в следующую, например,

 

case 'A': case 'a': оператор; // сюда компилятор передаст управление, если     // значение выражения совпало с кодом 'A' или 'a'

 

Если выход явно неуказан ни в какой ветви, то последовательно выполняются все ветви переключателя.

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

 

Пример использования переключателя для множественного ветвления – программа вывода названия дня недели по его номеру (1 – понедельник, 2 – вторник и т.д.)

 

Второй пример переключателя реализует простейший калькулятор. Здесь происходит сравнение значений символьных переменной и констант:

 


 

Базовые разветвляющиеся структуры и их программирование.

 

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

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

стандартное разветвление (слайд 21);

усеченное разветвление (слайд 22);

вложенное разветвление (слайд 23);

 

разветвление с множественным выбором (слайд 24)

 

 

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

Стандартное разветвление программируется условным оператором if следующего формата (слайд 21):

if (L) оператор _a; else оператор_b;

или, если в какой-либо ветви разветвления требуется  выполнить несколько операторов, то, как уже упоминалось, эти операторы необходимо заключить в фигурные скобки (блок):


 

if ( L ) { операторы блока a , заканчивающиеся точкой с запятой } else { операторы блока b, заканчивающиеся точкой с запятой }

Усеченное разветвление тоже программируется оператором if , толькобез ветви else:

if (L) оператор_a;//если блок a содержит единственный оператор

или

If ( L )

{

    операторы блока a , заканчивающиеся точкой с запятой

}

 

Обратите внимание, что усеченное разветвление удобно программировать, если пуста ветвь Нет. Это всегда может быть обеспечено изменением условия L на противоположное.

 

Вложенное разветвление программируется условным оператором if с использованием фигурных скобок и вложенных операторов if:

 

if (L 1 )

{

операторы блока a ;

}

Else if ( L 2 )

{

       операторы блока b ;

}

Else

{

       операторы блока с;

}

 

Обратите внимание, что вложенное разветвление удобно программировать, если вложение находится в ветви Нет. Это всегда может быть обеспечено изменением условия L1 на противоположное.

Разветвление с множественным выбором программируется оператором-переключателем  switch:

 

switch(Выбор)

{

    case тест_1:

              [блок_операторов_Выбор 1]

break ;

    [case тест_2:

              [блок_операторов_ Выбор 2]]

        break ;

    [default:

                  [блок_операторов_Иначе]]

}

 

 


Дата добавления: 2020-11-27; просмотров: 149; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!