Занятие 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 на этом занятии не рассматривается.


Ссылка на Яндекс Контест: Контест