Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual_C_console.pdf
Скачиваний:
34
Добавлен:
16.05.2015
Размер:
954.14 Кб
Скачать

32

Для переключения вывода в другой системе счисления применяется манипулятор setbase, который действует на весь последующий вывод, пока не будет указана другая система счисления. Например,

cout << setbase (16);

Для того чтобы вернуться к выводу в десятичной системе счисления достаточно снова написать этот манипулятор, но вместо 16 вставить 10.

Для одноразового переключения можно просто записать перед выводом переменной слово hex, например, для вывода значения переменной x в шестнадцатеричной системе счисления:

cout << hex << x;

Далее будут рассмотрены и другие формы ввода/вывода, здесь же следует отметить функцию _getch(), которая позволяет вводить информацию по одному символу (набираемому на клавиатуре) за одно обращение к функции (без нажатия на клавишу белого пробела). Эта функция может применяться для останова окна для вывода на экран (для переключения с экрана для вывода результата на экран редактирования кода программы требуется нажать на любую клавишу).

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

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

Обычно логические величины появляются при проверке логических отношений. Хотя и не исключены другие способы формирования логических величин, например, замыкание и размыкание контактов.

К логическим величинам могут применяться логические операции, образуя логические выражения, используемые в операторах управ-

33

ления программой (операторах условного перехода, операторах цикла и т.д.).

В языке С++ определены следующие операции логических отношений:

> строго больше; < строго меньше;

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

==сравнение на равенство;

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

x < 0.5

a + 1 >= b/2 - 1 c != 'S'

рt == NULL

Врезультате проверки логических отношений формируются значения истинности и ложности.

Вязыке С++ принято считать, что любое целое число, отличное от нуля, представляет собой состояние "истинно", а нулевое значение соответствует понятию "ложно". Обычно, для упрощения, считается, что понятию истинности соответствует значение 1, а значение 0 отображает состояние "ложно".

Вязыке С++ существует тип данных bool и можно объявлять переменные этого типа, которые могут принимать значения true (истинно) и false (ложно) однако, при выводе этих значений на экран полу-

34

чаются те же значения 1 и 0. Например, при реализации приведенных ниже операторов:

bool b = true;

cout<<"Значение true равно "<< b <<", а false = " <<false<<endl;

на экран будет выведено:

Значение true равно 1, а false = 0

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

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

 

Название

Обозначение

Отрицание

 

 

NOT (Не)

!

Логическое сложение

 

OR (ИЛИ)

||

Логическое умножение

 

AND (И)

&&

Исключительное ИЛИ

 

XOR

^

Поразрядное

Логическое

сло-

OR (ИЛИ)

|

жение

 

 

 

 

Поразрядное

Логическое

ум-

AND (И)

&

ножение

 

 

 

 

Результаты выполнения логических операций наиболее наглядно можно представить в виде таблиц истинности. В этих таблицах A и B операнды, а R - результат выполнения операции. Следует отметить, что название логических операций соответствует их смыслу в разговорном языке (как русском, так и английском).

 

|| (OR)

 

 

&& (AND)

 

 

^ (XOR)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

A

B

 

R

 

A

B

R

 

A

 

B

 

R

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

0

 

0

 

0

0

0

 

0

 

0

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

1

 

1

 

0

1

0

 

0

 

1

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

0

 

1

 

1

0

0

 

1

 

0

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

1

 

1

 

1

1

1

 

1

 

1

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Как видно из таблицы истинности для операции ИЛИ (||), результат является истинным, если истинным является хотя бы один из опе-

35

рандов. Логическое сложение отличается от арифметического тем, что при сложении двух единиц (значений «истинно») результат равен 1, а не 2. Это и не удивительно, поскольку для логических величин нет третьего состояния. Впрочем, и значение 2 не выпадает из общего принципа, поскольку любое число, кроме 0, также соответствует состоянию «истинно».

Обычно логические операции позволяют создать фильтры для отбора данных по какому-либо критерию. Логическая операция ИЛИ позволяет выбрать один или несколько элементов из списка. Например, если выполняется набор группы студентов специальности АСУ, желающих поехать в туристическую поездку, то подходящими кандидатами являются ИЛИ студенты группы 2АСУ1, ИЛИ студенты группы 2АСУ2. Таким образом, в группу могут попасть как студенты любой из групп, так и из обеих групп вместе.

Результат операции логического умножения И (&&) является «истинным», если истинными являются все участвующие в операции операнды. Эта операция практически не отличается от арифметического умножения, и позволяет выбрать элементы с полным совпадением ключевых признаков. Например, для проверки попадания величины в заданный диапазон значений требуется, чтобы значение величины было больше минимального значения И меньше минимального значения.

Результат операции исключительного ИЛИ (^) является «истинным», если истинным является только один участвующий в операции операнд. Эта операция в разговорном языке соответствует конструкции ИЛИ ИЛИ («или вы ликвидируете задолженность, или будете отчислены из института»). При построении фильтров эта операция обеспечивает выбор альтернативы.

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

36

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

Для операции поразрядного логического умножения записывают один символ "&". Пусть объявлены и инициализированы две переменные a и b, как показано ниже. В примечаниях приведены двоичные коды инициализированных переменных a, mask и результата b. Операция поразрядного умножения & выполняется отдельно с каждой парой соответствующих друг другу двоичных разрядов

long a, mask, b;

a = 0xDC; // Двоичный код 11011100 mask = 0x17; // Двоичный код 00010111

c = a & mask; // Двоичный код 00010100 0x14

cout << "Поразрядное a & mask = " << hex << c << endl;

После выполнения этой операции будет выведено:

Поразрядное a & mask = 14

Как видно из примера единицы в результате выполнения операции появилась там, где были единицы в соответствующих друг другу двоичных разрядах исходных чисел. Таким образом, если одно из чисел рассматривать как маску (в примере это переменная mask), то с помощью поразрядной операции & можно просмотреть, какие двоичные разряды находятся «под маской». Операцию поразрядного логического умножения называют также «проверкой по маске». В частности, если в маске содержится только одна единица, то с ее помощью можно просмотреть состояние конкретного разряда в исходном числе. Например, если для mask установить значение 0x08, то будет выведено 8 (двоичный код 1000), а если установить значение 0x02, то будет выведено 0 (во втором разряде справа 0).

Для поразрядного выполнения операции логического сложения записывают только один символ "|". Проинициализируем, как показано ниже переменные a и b.

37

long a, b, c;

a = 0xC0; // Двоичный код 11000000 b = 0x10; // Двоичный код 00010000

c = a | b; // Двоичный код 11010000 0xD0

cout << "Поразрядное a | b = " << hex << c << endl;

После выполнения этой операции будет выведено:

Поразрядное a | b = d0

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

cout << setiosflags (ios_base::scientific | ios_base::uppercase)…

Это пример занесения в 32-х разрядную переменную, задающую флаги ввода/вывода, единиц, указывающих на вывод в научной форме записи с представлением заглавной буквы ‘E’.

Операция XOR является особенной. Если в ней участвуют два операнда, то она выполняется поразрядно для каждой из соответствующей друг другу пары двоичных разрядов операндов (эта операция обозначается символом '^'). Но она может выполняться и с одним операндом (одноместная операция, которая задается символом '~'). В последнем случае выполняется поразрядная операция отрицания, которая позволяет "инвертировать" двоичный код элемента данных, заменяя нули в двоичных разрядах единицами, а единицы нулями, т.е. сформировать обратный двоичный код числа.

В некоторых задачах возникает потребность иметь переменную, которая при каждом обращении к ней изменяет свое состояние: если она имела состояние «истинно», то должна получить состояние «ложно» (иными словами она должна переключаться между состояниями 1 и 0). Примером такой задачи является переключение при

38

вводе информации, например, при работе в редакторе Word, с режима «Вставки» на режим «Замены» и обратно. Эту операцию можно реализовать с помощью поразрядной операции Исключительного ИЛИ (XOR). Фрагмент программы имеет вид:

int t = 0;

. . .

t ^= 1; // Это сокращенная форма записи оператора t = t ^ 1;

В визуальном программировании свойства объектов, обычно, задаются в виде числа типа DWORD (long). Отдельные двоичные разряды в этом числе несут ответственность за конкретные свойства. Запомнить соответствие между свойствами и двоичными разрядами сложно. Поэтому разряды обозначены константами перечисляемого типа данных. Для работы с такими константами требуется выполнение трех операций:

Установить в единицу отдельный бит в двоичном представлении числа.

Проверить значение отдельного бита в двоичном представлении числа

Сбросить в нуль значение отдельного бита в двоичном представлении числа.

Для установки значения единицы применяется поразрядная логическая операция ИЛИ. Ниже приведена установка разрядов в параметре dwStyle при вызове функции создания окна (Create):

WS_CHILD | WS_VISIBLE

(Параметры обозначают, что окно дочернее и видимое).

Шестнадцатеричный код параметра WS_VISIBLE равен 0x10000000, а у параметра WS_CHILD значение 0x40000000. После выполнения указанной поразрядной операции ИЛИ будет получен результат 0x50000000. Если рассмотреть операцию 5 = 1 + 4 только со старшим полубайтом в двоичной системе счисления, то действительно 0101 = 0001 + 0100. Двоичные единицы стоят на своих местах.

39

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

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

long a, mask, c;

mask = 0x08; // Двоичный код 00001000

//Инвертированная маска 11110111

//Поразрядная операция И с инвертированной маской a = 0xDC; // Двоичный код 11011100 (исходный) c = a & ~mask; // Двоичный код 11010100 0xD4

cout << "Нуль в 4-ом разряде справа a & ~ mask = " << c << endl;

После выполнения этой операции будет выведено:

Нуль в 4-ом разряде справа a & ~ mask = d4

Кроме перечисленных возможно также выполнение операций сдвига содержимого для целочисленных переменных. Для обозначения этих операций используются знаки >>n или <<n, где n указывает: на сколько разрядов (двоичных) следует выполнить сдвиг. Например:

char t, s; int x, y;

. . .

t = s >> 4; x = y << 1;

В этом примере переменной t присваивается значение переменной s после сдвига значения последней на 4 двоичных разряда вправо, а переменной x сдвинутое на один разряд влево содержимое переменной y.

Операция сдвига влево на каждый разряд сдвига увеличивает сдвигаемое значение в 2 раза (умножает на 2) и заполняет освобож-

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