Урок 2. Переменные, типы, ввод и вывод
Программа из первого урока всегда выводит одно и то же. Чтобы она что-то считала, ей нужно где-то хранить числа и текст. Для этого есть переменные.
Что такое переменная
Переменная — именованное место в памяти, где лежит значение. У каждой переменной в C++ есть тип: он говорит, что в ней хранится (целое число, дробное, символ) и сколько места она занимает. Тип указывается один раз, когда переменная объявляется, и потом не меняется.
#include <iostream>
using namespace std;
int main() {
int age = 15; // целое число
double height = 1.72; // дробное число
char letter = 'A'; // один символ
bool ready = true; // истина или ложь
cout << age << " " << height << " " << letter << " " << ready << "\n";
age = 16; // новое значение той же переменной
cout << age << "\n";
return 0;
}15 1.72 A 1
16Строка using namespace std; позволяет писать cout вместо std::cout. В учебных программах и на олимпиадах так пишут очень часто; что это значит и когда так делать не стоит, рассказывает справка using namespace std — что это.
bool выводится как 1 (истина, true) или 0 (ложь, false).
Основные типы
| Тип | Что хранит | Пример |
|---|---|---|
int | целое число примерно от −2,1 до 2,1 миллиарда | int n = 42; |
long long | большое целое, примерно до 9,2·10¹⁸ | long long big = 10000000000LL; |
double | дробное число, около 15 верных знаков | double pi = 3.14159; |
char | один символ в одинарных кавычках | char c = 'x'; |
bool | true или false | bool ok = false; |
string | строка текста в двойных кавычках | string name = "Anna"; |
Для string нужен #include <string> — строкам посвящён отдельный урок Строки std::string.
Если сумма или произведение может выйти за 2 миллиарда, берите long long: int в таком случае переполняется и молча даёт неверный ответ. Подробно — в справке Переполнение int и long long.
Переменная без начального значения (int x; внутри функции) содержит случайный «мусор» — то, что осталось в памяти. Всегда задавайте значение до первого чтения.
Имена переменных
Имя состоит из латинских букв, цифр и знака _ и не может начинаться с цифры: sum, max_value, x2. Большие и маленькие буквы различаются: Sum и sum — разные переменные. Нельзя брать служебные слова языка: int, return, class и другие. Давайте понятные имена: total лучше, чем t, если переменная живёт дольше пары строк.
Арифметика
Действия: +, -, *, / и % (остаток от деления). Главная ловушка — деление: если оба числа целые, результат тоже целый, дробная часть отбрасывается.
#include <iostream>
using namespace std;
int main() {
cout << 7 / 2 << "\n"; // 3, а не 3.5
cout << 7 % 2 << "\n"; // остаток: 1
cout << 7.0 / 2 << "\n"; // одно число дробное — результат дробный
cout << -7 / 2 << "\n"; // отбрасывается к нулю: -3
cout << -7 % 2 << "\n"; // знак остатка — как у делимого
return 0;
}3
1
3.5
-3
-1Чтобы поделить две целые переменные «по-настоящему», переведите одну из них в double:
#include <iostream>
using namespace std;
int main() {
int a = 7, b = 2;
double half = static_cast<double>(a) / b;
cout << half << "\n";
return 0;
}3.5static_cast<double>(a) — приведение типа: значение a берётся как дробное. Часто пишут короче — (double)a / b, результат тот же.
Сокращённые записи: x += 5 значит x = x + 5, так же работают -=, *=, /=, %=. А x++ и ++x увеличивают x на единицу (чем они отличаются — в справке Разница между ++i и i++).
Ввод: cin
cin читает данные с клавиатуры (или из входного файла задачи на олимпиаде). Оператор >> пропускает пробелы и переводы строк и читает очередное значение в переменную:
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
cout << a + b << "\n";
cout << a - b << "\n";
cout << a * b << "\n";
cout << a / b << " " << a % b << "\n";
return 0;
}17 522
12
85
3 2Числа можно ввести через пробел или каждое на своей строке — cin >> прочитает одинаково. А строку cin >> name прочитает только до первого пробела — одно слово; как прочитать строку целиком, рассказывает справка Как прочитать строку с пробелами.
Вывод: cout
Через << в cout можно отправить сколько угодно значений подряд: числа, строки, переменные, выражения. Пробелы и переводы строк сами не вставляются — их пишут явно: " " и "\n".
Перевод строки можно сделать и через endl: cout << x << endl;. Разница в том, что endl ещё и сразу выталкивает накопленный вывод на экран, а это медленно. Если вывод большой (тысячи строк), пишите "\n" — программа будет работать заметно быстрее. Подробнее — в справке Быстрый ввод-вывод.
Дробные числа cout по умолчанию выводит не больше чем с 6 значащими цифрами: 3.14159265 превратится в 3.14159. Как вывести ровно два знака после запятой, рассказывает справка Как вывести число с нужной точностью.
const и auto
const делает переменную неизменной — компилятор не даст присвоить ей новое значение:
const int DAYS_IN_WEEK = 7;auto просит компилятор самому вывести тип из начального значения: auto x = 5; — это int, auto y = 2.5; — double. С простыми числами удобнее писать тип явно, а auto пригодится позже, с длинными типами из стандартной библиотеки.
Частые ошибки
intвместоlong longдля больших чисел — неверный ответ без всякого сообщения.5 / 2ждут2.5, а получают2— целочисленное деление.- Переменная без начального значения — случайный результат.
- Запятая вместо точки в дробном числе: в коде пишется
1.5, а1,5даёт либо ошибку компиляции, либо совсем другое значение.
Коротко
- Переменная объявляется с типом:
int n = 5;. Тип потом не меняется. - Целые —
int(до ~2·10⁹) иlong long(до ~9·10¹⁸), дробные —double, символ —char, логический —bool. - Деление двух целых отбрасывает дробную часть;
%— остаток. - Ввод —
cin >> a >> b;, вывод —cout << a << " " << b << "\n";. "\n"быстрееendlпри большом выводе.