Занятие 1. Типы данных, условия и циклы
1 Переменные, условия и повторение
Программа хранит значения в переменных, принимает решения с помощью условий и повторяет действия с помощью циклов. Эти три идеи связаны между собой. Сначала определяется, какие данные нужны программе, затем формулируется условие, а при повторении указывается, как данные меняются после каждого шага.
1.1 Переменные и типы данных
Переменная это именованная область памяти, в которой хранится значение определенного типа. Тип задает, какие значения можно хранить и какие операции с ними можно выполнять.
Объявление создает переменную:
int a;Инициализация сразу записывает в нее начальное значение:
int a = 77;Запись фиксированного значения в исходном коде называется литералом. Например, в строке выше 77 это целочисленный литерал.
Для первых программ достаточно четырех основных типов.
| Тип | Что хранит | Пример |
|---|---|---|
int |
целое число | 77 |
double |
вещественное число | 0.1 |
char |
символ | 'a' |
bool |
логическое значение | true |
Информация в компьютере хранится в двоичном виде, а размер данных измеряется в байтах. Размер типа или уже созданной переменной можно узнать оператором sizeof.
sizeof(int)
double x;
sizeof(x)С целыми числами используются обычные арифметические операции +, -, * и /. При делении двух целых чисел получается целая часть результата. Оператор % находит остаток от деления. Операторы ++ и -- увеличивают и уменьшают значение на единицу.
int a = 77;
int b = a % 5; // b = 2
a += 5; // a = 82
a++; // a = 83В этом примере значение a меняется последовательно. Сначала в памяти хранится 77, затем 82, затем 83. Переменная b получает остаток от деления 77 на 5.
1.2 Вещественные числа
Для вещественных чисел в C++ есть типы float, double и long double. В слайдах для float указан размер 4 байта, для double 8 байт, а размер long double зависит от реализации и может составлять 8, 10 или 16 байт. В первых программах будет использоваться double.
Для вещественных чисел доступны сложение, вычитание, умножение и деление. Операция остатка % для них не определена. Если в одном выражении встречаются целое и вещественное числа, целое значение преобразуется в вещественный тип.
1 + 0.0f; // результат имеет тип floatВ памяти вещественное число представляется с помощью знака, порядка и мантиссы. Число отведенных битов конечно, поэтому не каждое вещественное значение можно сохранить точно. Это проявляется даже в простом сложении:
double a = 0.1;
double b = 0.2;
double c = a + b;Переменная c хранит результат машинного сложения приближенных представлений 0.1 и 0.2. Поэтому при работе с double важно помнить об ограниченной точности.
1.3 Условия
Условие имеет логическое значение true или false. Результат сравнения двух значений имеет тип bool.
| Оператор | Смысл |
|---|---|
== |
равно |
!= |
не равно |
> |
больше |
< |
меньше |
>= |
больше или равно |
<= |
меньше или равно |
Оператор if проверяет условие. Если оно истинно, выполняется тело if. Ветвь else выполняется только при ложном условии.
if (x != 0) {
std::cout << y / x << '\n';
} else {
std::cout << "Error\n";
}Сначала программа проверяет x != 0. При истинном условии деление безопасно и программа выводит y / x. При ложном условии деление не выполняется, вместо результата выводится сообщение об ошибке.
Условия можно соединять логическими операциями. Оператор && означает логическое И, оператор || означает логическое ИЛИ, оператор ! меняет истинное значение на ложное и наоборот.
if (x >= 0 && y >= 0) {
std::cout << "Positives\n";
}Фигурные скобки явно показывают границы тела условия. Они особенно важны, когда внутри ветви находится несколько действий.
1.4 Цикл while
Цикл нужен, когда одно действие должно выполняться несколько раз. У цикла while есть условие и тело:
while (условие) {
действия
}Перед каждой итерацией программа проверяет условие. Если оно истинно, тело выполняется один раз. Один проход тела называется итерацией. После этого программа снова возвращается к проверке условия.
В следующем примере управляющая переменная x начинает со значения 1. Цикл выводит ее и увеличивает на единицу.
int x = 1;
while (x <= 3) {
std::cout << x << '\n';
x++;
}На первой итерации выводится 1, затем x становится равен 2. На второй итерации выводится 2, затем x становится равен 3. После третьего вывода значение меняется на 4, условие x <= 3 становится ложным, и цикл завершается.
Изменение управляющей переменной является частью логики цикла. Если убрать строку x++, значение останется равным 1, условие всегда будет истинным и программа попадет в бесконечный цикл.
Условие while проверяется до первой итерации. Если начальное значение уже не подходит, тело не выполнится ни разу. Например, при x = 4 и условии x <= 3 программа сразу перейдет к коду после цикла.
1.5 Цикл do-while
Цикл do-while отличается порядком проверки. Сначала выполняется тело, затем проверяется условие.
int x = 4;
do {
std::cout << x << '\n';
x++;
} while (x <= 3);Этот пример выводит 4 один раз. Только после вывода программа проверяет условие x <= 3 и завершает цикл. Точка с запятой после условия обязательна.
Таким образом, тело while может не выполниться ни разу, потому что условие проверяется заранее. Тело do-while всегда выполняется хотя бы один раз, потому что первая проверка происходит после первой итерации. В обоих циклах нужно следить, чтобы данные внутри тела изменялись и условие могло стать ложным.
Цикл for на этом занятии не рассматривается.
Ссылка на Яндекс Контест: Контест