- •Н. А. Аленский основы программирования
- •§ 1. Структура простой программы. Ввод, вывод
- •1.1. Пример первой программы
- •1.2. Директива препроцессора #include
- •1.3. Структура программы
- •1.4. Комментарии
- •1.5. Ключевые слова и идентификаторы
- •1.6. Простой ввод, вывод
- •§ 2. Оператор if
- •2.1. Полная форма
- •2.2. Сокращённая форма
- •2.3. Особенности оператора
- •Задачи и упражнения
- •§ 3. Выражения
- •3.1. Константы
- •Непосредственно записать в выражении;
- •3.2. Операции и их приоритет
- •3.3. Операции отношения и логические операции
- •3.4. Особенности операции присваивания
- •3.5. Тернарная операция (?)
- •Задачи и упражнения
- •§ 4. Оператор выбора switch
- •Задачи и упражнения
- •§ 5. Операторы цикла
- •5.1. Оператор while c предусловием
- •Правила использования и особенности оператора while
- •5.2. Оператор цикла do … while c постусловием
- •5.3. Оператор for
- •5.4. Операторы continue и break
- •Задачи и упражнения
- •§ 6. Введение в одномерные массивы
- •6.1. Что такое массив. Объявление одномерного массива
- •6.2. Способы определения массивов
- •6.3. Вывод одномерного массива. Функции printf и сprintf
- •6.4. Некоторые типы простых задач при работе с массивами
- •Задачи и упражнения
- •§ 1. Функции без результатов. Передача параметров по значению
- •1.1. Примеры. Правила оформления и вызова функций
- •Void line2(int Len, y, char ch) // ошибка,
- •1.2. Формальные и фактические параметры
- •1.3. Передача параметров по значению
- •§ 2. Функции типа void с несколькими результатами
- •2.1. Пример
- •2.2. Что такое ссылочный тип
- •2.3. Возврат значений из функции с помощью ссылочного типа
- •Задачи и упражнения
- •§ 3. Функции с одним результатом. Оператор return
- •Задачи и упражнения
- •§ 4. Одномерные массивы в функциях. Сортировка массива
- •Задачи и упражнения.
- •§ 5. Область действия имён. Локальные и глобальные имена
- •§ 6. Дополнительные возможности функций
- •Встраиваемые функции (inlineфункции)
- •6.2. Параметры по умолчанию
- •6.3. Перегрузка функций
- •§ 1. Примеры
- •§ 2. Класс. Поля и методы класса
- •§ 3. Создание объектов. Конструктор
- •Задачи и упражнения.
- •Глава 4 простые типы данных § 1. Целый тип
- •1.1. Битовые операции
- •1.2. Использование битовых операций
- •1.3. Упаковка и распаковка информации
- •Задачи и упражнения.
- •§ 2. Логический тип
- •§ 3. Символьный тип
- •Глава 5 матрицы (двухмерные массивы) § 1. Объявление, способы определения
- •§ 2. Вывод матриц
- •§ 3. Типы алгоритмов на обработку матриц
- •3.1. Построчная обработка
- •3.2. Обработка матрицы по столбцам
- •3.3. Обработка всей матрицы
- •3.4. Обработка части матрицы
- •3.5. Преобразование матрицы
- •Упражнения.
- •3.6. Построение матриц
- •§ 4. Передача матрицы в качестве параметра функции
- •Задачи и упражнения.
- •Б. Обработка матрицы по столбцам.
- •Даны две матрицы a и b одинаковой размерности. Построить матрицу с, каждый элемент которой определяется по правилу:
- •Список рекомендуемой литературы
- •Сборники задач по программированию
- •Оглавление
- •Задачи и упражнения …….……………………………………...12
- •3.1. Константы ………………………………………………...…14
§ 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 ) и операции сравнения (> , < , >=, <=, = =, !=). Например, присваивание B3 = y>x*x && fabs(x)<2 можно записать следующим образом:
B1= y>x*x; B2= fabs(x)<2; B3=B1 && B2.
При сравнении логических величин учитывается, что результаты следующих сравнений истинны: true>false; true = = true; false = = false. Например, пусть B1=x>0; B2=y>0. Выражение B1>B2 истинно тогда и только тогда, когда x>0 && y<=0 истинно, т. е. когда B1==true, а B2==false. Выражение B1 = = B2 истинно тогда и только тогда, когда x>0 && y>0 || x<=0 && y<=0, т. е. когда B1==true и B2==true или обе переменные принимают значение false. Выражение !(B1<B2) равносильно
x>0 && y<=0|| x>0 && y>0 || x<=0 && y<=0.
Существует связь между логическими операциями и оператором if.
Например, присваивание B3=B1 && B2 с помощью if без логических операций можно записать так: if (B1) B3 = B2; else B3 = false.
B3=!B1 || B2 равносильно
if (B2) B3=true;
else if (B1) B3 = false;
else B3 = true.
Мы уже знаем, что целый тип совместим с булевским типом. Любое ненулевое число играет роль true, а нуль равносилен false. Поэтому если int flag, то оператор if (flag) cout<<”Yes”; else cout<<”No”; равносилен следующему:
if (flag!=0) cout<<”Yes”; else cout<<”No”. Этим можно объяснить отсутствие такого типа в старом языке C.
Следует различать логические операции и битовые.
Если логические операции используются для целых чисел, что на практике встречается не часто, то любое ненулевое число играет роль true, а нуль равносилен false. Например, в результате выполнения операторов
int b1=10<0xA, b2=0x10, b3; b3=b1 || b2 && 10; cout<<b3;
получим единицу. Почему? Так как 10 и 0xA — одно и то же число в разных системах счисления, то результат сравнения ложный и b1=0. Значением переменной b2 является ненулевое число 16 в шестнадцатеричной системе счисления, и это соответствует истине. Поэтому b2 && 10 даст в результате истину, и b3 как результат логической операции или будет также истинным, несмотря на то, что b1 = 0. Таким образом, будет выведена единица.
Если объявить bool b1=10<0xA, b2=0x10, b3; то результат будет тот же самый, т. е. будет выведена единица (а не true).
Наоборот, битовые операции можно использовать для логических значений, что на практике также используется редко. Например, рассмотрим следующий фрагмент:
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.