Объявление и инициализация переменных
Прежде чем использовать переменные, их нужно объявить, указав имя переменной и тип данных. Объявлять переменные можно в любом месте программы. Тип уже объявленной переменной изменить нельзя.
Например:
int x; // целочисленная переменная x
Знак = это оператор присваивания в C++.
Переменную крайне желательно сразу инициализировать – т.е. присвоить ей первоначальное значение.
Например, так:
int x;
x = 25;
Но лучше так:
int x = 25;
Нежелательно объявлять переменные одной строкой, т.к. это может привести к путанице. Особенно, если объявляются указатели.
См. men.jpg
Константы вместо "магических чисел"
Использование констант оправдано несколькими факторами. Во-первых, имя константы более информативно, чем число. Во-вторых, если требуется поменять это значение, то проще изменить значение одной константы, чем выискивать и изменять "магическое число" во всей программе.
Ограничения, налагаемые на целые числа
1. Округление до целых значений
Требуется вычислить среднее трех чисел: a , b и c . Среднее значение вычисляется по формуле:
(a + b + c)/3
Например, если a=1 ; b=2 и c=2 , то среднее будет равно или 1,666... Полученный результат приводится к целому значению, просто отбрасывая его дробную часть. При этом 1,666 утратит свой “дьявольский” остаток и превратится в 1 .
Даже если попытаться решить эту задачу иным способом:
a/3 + b/3 + c/3 = 0 + 0 + 0 = 0
2. Ограничения диапазона
Максимальным значением обычной целочисленной переменной является число 2 147 483 647, минимальным – - 2 147 483 647, т.е. общий диапазон (от до ) – около 4 млрд. чисел (зависит от компилятора). Число 2 млрд. может оказаться недостаточным.
C++ позволяет объявлять целые числа как беззнаковые. Целое число типа unsigned int может принимать значения от 0 до +4 294 967 295. Можно объявить переменную просто как unsigned , опустив объявление int , которое подразумевается неявно.
Целочисленное переполнение
Если целочисленной переменной задать максимальное значение, а потом прибавить к нему единицу, то значение сбрасывается на минимум. Если к максимальному прибавить 2, то значение будет равно минимум+1 и т.д.
Пример с типом unsigned :
Пример с типом int :
Вещественные (действительные) числа
Число с плавающей запятой (или число с плавающей точкой) — форма представления вещественных чисел, в которой число хранится в форме мантиссы и показателя степени .
Название "плавающая запятая" происходит от того, что запятая в позиционном представлении числа может быть помещена где угодно относительно цифр в строке. Представление числа в форме с плавающей запятой может рассматриваться как компьютерная реализация экспоненциальной записи чисел.
Основные типы вещественных чисел: double и float . У типа double бóльшая точность (кол-во знаков после запятой). Для вещественного типа не предусмотрен unsigned.
Число с плавающей запятой состоит из:
- Знака мантиссы (указывающего на отрицательность или положительность числа);
- Мантиссы (выражающей значение числа без учёта порядка);
- Порядка (выражающего степень основания числа, на которое умножается мантисса).
В вычислительных машинах показатель степени принято отделять от мантиссы буквой «E» (exponent). Например, число 1,528535047 ·10 − 25 в большинстве языков программирования высокого уровня записывается как 1.528535047 E - 25 .
Десятичные числа могут не иметь дробной части, оставаясь при этом вещественными (например, действительное число 5.0).
Примеры:
1 000 000 = =
0,000001 (одна миллионная) = =
0.00345 =
= =
Решение проблемы с отбрасыванием дробного числа:
Требуется вычислить среднее ( d ) трех вещественных чисел: a , b и c .
double d;
d = 1.0/3.0 + 2.0/3.0 + 2.0/3.0;
Это эквивалентно выражению
d = 0.333... + 0.666... + 0.666...;
Которое дает значение
d = 1.666...
1,(6) – “один и шесть в периоде”
Количество цифр «6» ограничено пределом переменной типа double.
Ограничения, налагаемые на числа с плавающей точкой
- Вещественные переменные не могут использоваться для перечисления. C++ требует использовать при перечислении только целые значения.
- Процессор компьютера выполняет операции с целыми числами гораздо быстрее, чем с действительными. Для сложения 1000 целых чисел процессору может потребоваться столько же времени, сколько для выполнения лишь 200 вычислений с плавающей точкой.
- Вещественные числа тоже страдают от ошибок округления. Если усреднить числа 1.0, 2.0, 2.0, то получится не математически точное 1,(6), а приблизительное значение 1.666667.
Переполнение вещественного типа осуществить невозможно:
Бинарными называются операторы, которые имеют два аргумента.
В выражении –x оператор – унарный.
В выражении x – y оператор – бинарный.
Приоритет
1
Оператор
+ (унарный)
1
Значение
– (унарный)
2
Реально ничего не изменяет
Возвращает противоположное по знаку, равное по модулю значение
++ (унарный)
2
Оператор инкремента, увеличивает значение аргумента на 1
– – (унарный)
3
3
Оператор декремента, уменьшает значение аргумента на 1
* (бинарный)
/ (бинарный)
Умножение
3
Деление
4
% (бинарный)
+ (бинарный)
Остаток от деления
4
Сложение
– (бинарный)
5
Вычитание
=, *=, %=, +=, –= (специальные)
Операторы присвоения
Команды инкремента и декремента выполняются быстрее, чем команды сложения и вычитания.
При выполнении инкремента инкрементируемой переменной присваивается новое значение. При выполнении вычитания без оператора присваивания значение переменной остается прежним. Например:
int i = 5;
int j = 5;
cout
Будет выведено
6
6
Но после этого
cout
Будет выведено
6
5.
% (бинарный)
Остаток от деления
Этот оператор означает получение остатка от деления . Например, 5 входит в 14 два раза, и остаток при этом составляет 4 . Т.е., остаток от деления 14 на 5 равно 4 .
14 % 5 равно
14 – (14 / 5) * 5
14 – 2 * 5
14 – 10
4
Для переменных вещественного типа оператор получения остатка от деления не предназначен, поскольку он целиком основан на использовании округления до целых (14 / 5 = 2).
145 % 10 =
5
int x = 2;
int x = 2;
int y = 5;
int y = 7;
int c = y % x;
int c = y % x;
c =
c =
1
1
double x = 5;
double y = 7;
double c = y % x;
c =
error
Операторы инкремента и декремента могут находиться либо перед аргументом ( префиксная форма ), либо после него ( постфиксная форма ).
Префиксная форма
Постфиксная форма
int x, y;
int a, b;
x = 5;
a = 5;
y = ++x;
b = a++;
x = 6
a = 6
y = 6
b = 5
Переменной y присваивается уже увеличенное префиксным оператором инкремента значение x , а переменной b передается еще не увеличенное постфиксным оператором значение a .
Символьный тип и строка символов
char – символьный тип. Значением переменных может быть символ алфавита, цифра, знак препинания или знак арифметической операции.
Пример:
char c = ‘a’;
string – строка символов, составляющая предложение.
Пример:
string s = “this is a string”;
Логические выражения
Название типа bool происходит от имени Буля, автора символьной логики. Булева переменная может иметь только одно из двух значений – true или false .
Например, выражение “ x == y ” может иметь значение true или false .
“ true”
– это строка
true
– это булева переменная
TRUE
– это может быть хоть чем (чем объявит программист)
b a Больше, меньше; истинно, когда значение a больше (меньше) значения b a = b a Больше или равно, меньше или равно; истинно, если истиной является или == (" width="640"
Логические операторы сравнения
Оператор
Значение
a == b
Равенство; истинно, когда значение a совпадает со значением b
a ! = b
Неравенство; противоположное равенству
a b
a
Больше, меньше; истинно, когда значение a больше (меньше) значения b
a = b
a
Больше или равно, меньше или равно; истинно, если истиной является или == (
, = , x == 10; x = 10; Оператор равенства Оператор присваивания Распространенная ошибка, которую компилятор не посчитает за ошибку и не укажет на нее. " width="640"
Операторы == , != , , = ,
x == 10;
x = 10;
Оператор равенства
Оператор присваивания
Распространенная ошибка, которую компилятор не посчитает за ошибку и не укажет на нее.
Составные логические операторы
Оператор
Значение
a && b
Возвращает true, если
И
a & b
аргументы и слева, и справа являются истиной (сокращенное вычисление)
И
a || b
a | b
ИЛИ
аргументы и слева, и справа являются истиной
или левый, или правый, или оба аргумента являются истиной (сокращенное вычисление)
ИЛИ
a ^ b
или левый, или правый, или оба аргумента являются истиной
ЛИБО
! a
либо a , либо b , но не обе одновременно равны true
НЕ
(сокращенное вычисление невозможно)
a принимает ложное значение
Сокращенные вычисления в C++
условие1 && условие2
Если условие1 ложно, то результат будет ложным независимо от истинности выражения условие2 .
условие1 || условие2
Если условие1 истинно, то результат будет истинными независимо от истинности выражения условие2 .
Для экономии времени C++ вычисляет первым условие1 , и, в случае, если оно ложно (для оператора && ) или истинно (для оператора || ), выражение условие2 не вычисляется и не анализируется.
Операторы && ( И ) и || ( ИЛИ ) обычно сочетаются с другими логическими операторами.
(x
// истинно, если y больше x и меньше z
(x
// истинно, если y больше x или меньше z
y) && !(x В выражении (x y) && (a y) . В случае если оно ложно (для оператора &&) или истинно (для оператора ||) , выражение (a " width="640"
Операторы сравнения достаточно взаимозаменяемы. Например:
x
x == y
эквивалентно
эквивалентно
(x
!(x y) && !(x
В выражении (x y) && (a y) . В случае если оно ложно (для оператора &&) или истинно (для оператора ||) , выражение (a
Хранение логических значений
Результат логической операции может быть присвоен переменной типа bool:
int n1 = 1;
int n2 = 2;
bool b;
b = (n1 == n2);
“ Сравни содержимое переменных n1 и n2 и сохрани результат сравнения в переменной b”.
По правилу приоритетов операций выражение
b = (n1 == n2); эквивалентно выражению b = n1 == n2;
Инструкция cout.setf(cout.boolalpha); обеспечивает вывод логического значения в виде строки “true” или “false”, а не в виде 1 или 0, как принято по умолчанию.
Объект std::cin забирает вводимую пользователем информацию из стандартного потока ввода, которым обычно является клавиатура. " width="640"
Объект cin
Объект std::cin забирает вводимую пользователем информацию из стандартного потока ввода, которым обычно является клавиатура.
Задача 1. Написать программу, которая запрашивает у пользователя два числовых значения и возвращает результат их сравнения. Пример работы программы:
Логические операции с вещественными переменными
float a = 10.0;
float b = a / 3;
a == (b * 3.0); // Равны ли эти значения?
Математически b =
но float b = 3.333333
значит a == (b * 3.0) – false
float a = 10.0;
float b = 100 % 30;
a == b; // Истинно ли это выражение?
Математически b = 10
но 100.0 : 30.0 = 3,333333 (или 3.33347 )
float b = 100.0 % 30.0 = ?
Более безопасное сравнение:
float a = 10;
float b = a / 3;
float c = b * 3.0;
(a – c)
Истинно в случае, если разница между a и c меньше 0,00001.
Задача 2. Написать программу, которая выводит на экран таблицу истинности логических операций.
Выражения смешанного типа
C++ позволяет использовать в одном выражении переменные разных типов. Например, можно складывать целые и вещественные переменные:
int x = 5;
double y = x + 1.0;
// в этом выражении перед выполнением операции сложения
// значение x преобразуется к типу double
Тип генерируемого в результате значения будет соответствовать более мощному типу операнда.
По тому же принципу выражение одного типа может быть присвоено переменной другого типа, например:
double y = 1.0;
int x;
x = y;
// в этом выражении целая часть y сохраняется в x
Если переменная в левой стороне равенства относится к типу менее мощному, чем переменная справа, то при таком присвоении можно потерять точность значений.
Преобразование типа большего размера в меньший называется понижающим приведением (demotion), а обратное преобразование – повышающим приведением (promotion).
Язык С++ позволяет определять имена новых типов данных с помощью ключевого слова typedef . На самом деле здесь не создается новый тип данных, а определяется новое имя существующему типу. Он позволяет облегчить создание машинно-независимых программ. Единственное, что потребуется при переходе на другую платформу, - это изменить оператор typedef . Он также может помочь документировать код, позволяя назначать содержательные имена стандартным типам данных. Стандартный вид оператора typedef следующий:
typedef тип имя;
где тип — это любой существующий тип данных, а имя - это новое имя для данного типа. Новое имя определяется в дополнение к существующему имени типа, а не замещает его. Пример:
sum – это другое имя для int в этой программе.
Домашнее задание
0. Подготовиться к контрольной работе.
1. Прочитать код. Протестировать работу программы:
2. Создать программу для автоматизации процесса перевода старой русской меры веса в современную. Программа должна позволить пользователю ввести два числа (пуды и фунты) и сообщить, каково значение в килограммах (1 пуд = 40 фунтам = 16,38 кг).
3. Создать программу для перевода количества лет, введенного пользователем, в секунды.
4. Даны две целые переменные a и b. Составить программу, в результате работы которой значения переменных поменяются местами.
5. Написать программу, которая решает следующую задачу по физике. Тело падает с высоты h . Какова его скорость в момент соприкосновения с землей и когда это произойдет.
6. Написать программу для решения следующей задачи. В равнобедренном треугольнике известно основание c и высота h . Найти площадь треугольника S и периметр Р .
7. Дано натуральное число. Вывести его последнюю цифру.
8. Дано натуральное число. Найти число десятков в его
десятичной записи.
9. Дано трехзначное число. Найти сумму его цифр.
10*. Даны две целочисленные переменные. Составить программу, которая меняет местами значения этих переменных. Использовать только 2 переменные.