- •Часть 2
- •18 Сентября 2012 г., протокол № 1
- •Предисловие
- •Глава 6 простые типы данных § 1. Целый тип
- •1.1. Битовые операции
- •Использование битовых операций
- •1.3. Упаковка и распаковка информации
- •§ 2. Логический тип
- •§ 3. Символьный тип
- •§ 4. Вещественный тип
- •§ 5. Преобразование типов
- •Преобразование типов в выражениях
- •Преобразование типов при присваивании
- •Г л а в а 7 введение в указатели
- •§ 1. Понятие указателя. Операции разыменования и разадресации
- •§ 2. Инициализация и присваивание указателей
- •§ 3. Распределение динамической памяти
- •Операция new
- •Операция delete
- •§ 4. Параметры-указатели. Функция ввода scanf
- •Упражнения, тесты
- •Г л а в а 8 одномерные массивы, указатели и функции
- •§ 1. Связь указателей и одномерных массивов. Передача массива в качестве параметра функции
- •§ 2. Сортировка одномерных массивов
- •§ 3. Сортировка массива по параметру числа
- •§ 4. Сортировка массива выбором.
- •§ 5. Сортировка массива вставками
- •§ 6. Динамические одномерные массивы
- •6.1. Порядок работы с динамическим массивом
- •6.2. Работа с динамическим массивом в классе. Деструктор
- •§ 7. Введение в строки
- •Глава 9 мАтрицы
- •§ 1. Объявление, способы определения матриц
- •§ 2. Вывод матриц
- •§ 3. Типы алгоритмов
- •3.1. Построчная обработка
- •Обработка матрицы по столбцам
- •3.3. Обработка всей матрицы
- •3.4. Обработка части матрицы
- •Преобразование матрицы
- •Построение матриц
- •§ 4. Матрицы, указатели и функции
- •Упражнения и тесты
- •Обработка матрицы по столбцам.
- •Список реКоМендуемой литературы
- •Сборники задач по программированию
- •Оглавление
- •Методы программирования:
- •Лекции, примеры, тесты
- •Пособие для студентов механико-математического факультета
- •В двух частях
- •Часть 2
§ 2. Логический тип
В классическом “старом” языке С такого типа не было. Вместо него использовался целый тип. Логический или булевый тип появился в языке С++. Переменные такого типа объявляются, например, следующим, образом: bool B1, B2, B3, B4. Переменная данного типа может принимать одно из двух значений — true или false, которые являются логическими константами. Кроме этих переменных дальше в тексте будем использовать вещественные переменные x и y, определяющие координаты точки на плоскости в декартовой системе координат.
Логические переменные можно использовать:
в операторах присваивания, например,
B1=x>0; B1=true; B2=y>0 && x<0;
B1=B2 || x*x+y*y<=4;
в операторе if, например, if (B1), что равносильно if (B1= = true) …;
в операторах while и do … while,
например, while (B1) { …}, что равносильно while(B1= = true) {…};
в заголовке оператора for. Чаще всего булевский тип используется во второй части заголовка. Например, for (x=1; B1; x+=0.5) {…}; что равносильно for (x=1; B1==true; x+=0.5) {…}; Теоретически переменные булевского типа могут быть в первой и в третьей частях заголовка этого оператора.
Для логических переменных и констант определены логические операции &&, || , ! и операции сравнения > , < , >=, <=, = =, != (см. 3.3 гл. 1). Например, присваивание B3 = y>x*x && fabs(x)<2 можно записать так:
B1= y>x*x; B2= fabs(x)<2; B3=B1 && B2;
При сравнении логических величин учитывается, что результаты следующих сравнений истинны: true>false; true = = true; false = = false.
Пример 13. Пусть B1=x>0; B2=y>0;
a) Выражение B1>B2 истинно тогда и только тогда, когда x>0 && y<=0 истинно, т. е. когда B1==true, а B2==false.
b) Выражение B1== B2 истинно тогда и только тогда, когда x>0 && y>0 || x<=0 && y<=0, т. е. когда B1==true и B2==true или обе переменные принимают значение false.
c) Выражение !(B1<B2) равносильно
x>0 && y<=0|| x>0 && y>0 || x<=0 && y<=0.
Существует связь между логическими операциями и оператором if.
Пример 14. Присваивание B3=B1 && B2 с помощью if без логических операций равносильно if (B1) B3 = B2; else B3 = false;
Пример 15. Дан вложенный if
if (B2) B3=true;
else if (B1) B3 = false;
else B3 = true;
Это можно записать короче: B3=!B1 || B2;
Мы уже знаем, что целый тип совместим с булевским типом. Любое ненулевое число играет роль true, а нуль равносилен false. Поэтому если int flag, то оператор if (flag) cout<<”Yes”; else cout<<”No”; равносилен следующему:
if (flag!=0) cout<<”Yes”; else cout<<”No”.
Надо различать логические и битовые операции.
Если логические операции используются для целых чисел, то любое ненулевое число играет роль true, а нуль равносилен false.
Пример 16. В результате выполнения операторов
int b1=10<0xA, b2=0x10, b3; b3=b1 || b2 && 10; cout<<b3;
выведем единицу. Почему? Так как 10 и 0xA — одно и то же число в разных системах счисления, то результат сравнения ложный и b1=0. Значением переменной b2 является ненулевое число 16 в шестнадцатеричной системе счисления, а это соответствует истине. Поэтому b2 && 10 даст в результате истину, и b3 также будет истинным.
Если объявить bool b1=10<0xA, b2=0x10, b3; то результат будет тот же самый, т. е. будет выведена единица (а не true).
Наоборот, битовые операции можно использовать для логических значений, что на практике используется редко.
Пример 17. Рассмотрим похожий на предыдущий пример с битовыми операциями: bool b1=10<0xA, b2=0x10, b3; b3=b1 | b2 & 10; cout<<b3;
В результате операции b2 & 10 получим 0, потому что битовая операция применяется к каждой паре битов, т. е. 12 & 10102=0. Значением b1 является false, т. е. 0. Поэтому в результате будет выведен 0. Необходимо обратить внимание, что значением переменной b2 будет 1, а не 100002 . По этой же причине, если bool b2=10, то в результате получим 0.
Но если int b1=10<0xA, b2=10, b3; то получим 10, так как 10&10=10, b1=0, 0 | 10 =10.
