Переменные

Переменная — это ячейка памяти, в которой хранится значение во время работы программы.

Тип данных показывает, какие данные хранятся в переменной и какие операции для них подходят.

В этой главе мы рассмотрим только работу со строками и целыми числами. Вещественные, логические и символьные типы мы рассмотрим в других главах.

Базовые термины работы с переменными

  • Объявление переменной связывает имя переменной с типом данных
  • Переменная хранит значение некоторого типа данных
  • Присваивание записывает значение в переменную.
  • Литерал — это запись конкретного значения прямо в коде.
  • Выражение — это комбинация имён переменных, литералов и операторов, которая вычисляется в значение.

Как работает оператор присваивания

Java сначала вычисляет выражение справа от знака =, а потом оператор присваивания записывает полученное значение в переменную слева.

Задачи для тренировки: базовые термины работы с переменными

1. Корректен ли такой фрагмент?

int a = 1;
123 = a;

Ответ

Некорректно.

Слева от оператора присваивания должна стоять переменная. 123 — это литерал, ему нельзя присвоить значение.


2. Корректен ли такой фрагмент?

double a = 2.5;
int b = a;

Ответ

Некорректно.

Справа значение типа double, а слева переменная типа int. Такое присваивание без явного преобразования типа нельзя.


3. Корректен ли такой фрагмент?

String s = 123;

Ответ

Некорректно.

Переменная s имеет тип String, а справа стоит числовой литерал 123, а не строка.


4. Корректен ли такой фрагмент?

int b = 2;
int a = 3 * b;

Ответ

Корректно.

Справа от = может стоять выражение. Сначала Java вычисляет 3 * b, потом записывает результат в a.


5. Корректен ли такой фрагмент?

int a = 3;
a = 2 * a;

Ответ

Корректно.

Переменной можно присваивать новое значение. Здесь сначала вычисляется 2 * a, потом результат записывается в ту же переменную a.


6. Корректен ли такой фрагмент?

int a = 2 * a;

Ответ

Некорректно.

В выражении справа используется переменная a, но до этого ей еще не присвоили начальное значение.

Имена переменных

Хорошее имя помогает быстро понять, что хранится в переменной.

  • имя должно подсказывать смысл значения: speed, time, totalSeconds
  • в Java имена переменных обычно записывают в lowerCamelCase: firstName, carSpeed, totalSeconds
  • имя не должно начинаться с цифры
  • в имени не используют пробелы и дефисы
  • короткие имена a, b, x лучше оставлять только для коротких формул

Пример понятных имен:

int speed = 90;
int time = 8;
int distance = speed * time;

То же вычисление с короткими именами читать сложнее:

int a = 90;
int b = 8;
int c = a * b;

Короткие имена уместны в короткой математической записи:

int a = 7;
int b = 5;
int x = a + b;

Трассировка

Трассировка помогает пошагово проследить, как в программе меняются значения переменных.

Рассмотрим задачу:


Даны длина и ширина прямоугольника. Длину увеличили на 2, а ширину уменьшили на 1. На сколько изменилась площадь прямоугольника?


Для решения будем использовать переменные: в них сохраним исходные данные, промежуточные результаты и ответ.

Проследите выполнение программы на слайдах ниже и посмотрите, как на каждом шаге меняются значения переменных.

Задачи для тренировки: трассировка

1. Какими станут a и b после выполнения этого кода?

int a = 1234;
int b = 99;

int temp = a;
a = b;
b = temp;

Ответ

В конце:

a = 99
b = 1234

Сначала в temp сохраняется старое значение a, потом a и b меняются местами.


2. Чему будет равно d после выполнения этого кода?

int a = 6;
int b = 7;

int s1 = a * b;

a = a + 1;
b = b + 1;

int s2 = a * b;

int d = s2 - s1;

Ответ

В конце:

d = 14

По шагам:

s1 = 6 * 7 = 42
a = 7
b = 8
s2 = 7 * 8 = 56
d = 56 - 42 = 14

3. Какими станут a и b после выполнения этого кода?

int a = 1234;
int b = 99;

a = a + b;
b = a - b;
a = a - b;

Ответ

В конце:

a = 99
b = 1234

Это тоже обмен значений местами, но без дополнительной переменной.


4. Чему будет равно x в конце выполнения этого кода?

int a = 4;
int b = 3;

int x = a + b;
a = x - a;
b = x - b;
x = a * b;

Ответ

В конце:

x = 12

По шагам:

x = a + b = 7
a = x - a = 7 - 4 = 3
b = x - b = 7 - 3 = 4
x = a * b = 3 * 4 = 12

5. Какими станут a и b после выполнения этого кода?

int a = 10;
int b = 4;

a = a - b;
b = a + b;
a = b - a;

Ответ

В конце:

a = 4
b = 10

По шагам:

a = a - b = 6
b = a + b = 10
a = b - a = 4

Строковый тип данных: String

String используется для ввода-вывода, хранения и обработки текстов.

Примеры выражений со строками:

Выражение Значение Комментарий
"My " + "Precious" "My Precious" пробелы внутри строк важны
"1234" + "99" "123499" строки не складываются как числа
"A" + "B" + "C" "ABC" можно склеивать несколько строк в одном выражении
"Привет, " + "мир!" "Привет, мир!" поддерживается Unicode

Обратите внимание: при склеивании строк новую часть можно добавить и в конец строки, и в её начало.

Проследите, как по шагам меняются значения переменных first и second в этой программе:

String first = "мама";         // В переменную first записали строку "мама".
String second = "кот";         // В переменную second записали строку "кот".

second = second + "ик";        // К "кот" добавили справа "ик". Получилось "котик".
first = "супер" + first;       // К "мама" добавили слева "супер". Получилось "супермама".
second = first + second;       // Склеили "супермама" и "котик". Получилось "супермамакотик".

Ввод-вывод строк

Вывод строк

Для вывода строк используют System.out. С его помощью программа выводит текст на экран.

Вызов Что делает
System.out.print(x) Печатает x без перевода строки
System.out.println(x) Печатает x и переводит строку
System.out.println() Просто переводит строку

Основные способы вывода строк

Одни и те же строковые значения можно вывести по-разному: в одной строке или построчно.

Если два строковых значения нужно вывести в одной строке, используют System.out.print(...).

String first = "кот";
String second = "дом";

System.out.print(first);
System.out.print(" ");
System.out.print(second);

Вывод
кот дом

Если те же строковые значения нужно вывести построчно, используют System.out.println(...).

String first = "кот";
String second = "дом";

System.out.println(first);
System.out.println(second);

Вывод
кот
дом

Если рядом со строкой стоит число, Java автоматически превращает число в текст и склеивает его со строкой.

int age = 12;
System.out.println("Возраст: " + age);

Вывод
Возраст: 12

Ввод строк

Для ввода строк в Java обычно используют Scanner.

Scanner in = new Scanner(System.in);
Вызов Что считывает
in.next() Следующее слово до пробельного символа
in.nextLine() Всю строку до перевода строки

Основные способы ввода строк

Если два строковых значения разделены пробелом, используют next().

String first = in.next();
String second = in.next();

System.out.println(second + " " + first);

Ввод
кот дом
Вывод
дом кот

next() читает по словам, поэтому и пробел, и перевод строки работают для него как разделители.

Если каждое строковое значение находится на отдельной строке, используют nextLine().

String first = in.nextLine();
String second = in.nextLine();

System.out.println(second + " " + first);

Ввод
кот
дом
Вывод
дом кот

Задачи для тренировки: ввод-вывод строк

1. Что выведет программа?

String first = "кот";
String second = "ик";

System.out.print(first);
System.out.println(second);
System.out.println(first + second);

Ответ

Программа выведет:

котик
котик

Сначала print(first) печатает кот без перехода на новую строку, потом println(second) дописывает ик и переводит строку.


2. Что выведет программа?

int age = 12;

System.out.println("Возраст: " + age);
System.out.println(age + " лет");

Ответ

Программа выведет:

Возраст: 12
12 лет

Число рядом со строкой автоматически превращается в текст.


3. Какой метод нужно поставить вместо ???, если на вход подаётся одна строка:

кот дом
String first = in.???;
String second = in.???;

System.out.println(second + " " + first);

Ответ

Нужно поставить:

next()
next()

next() читает по одному слову до пробела, поэтому он подходит для ввода кот дом.


4. Какой метод нужно поставить вместо ???, если на вход подаются две строки:

кот
дом
String first = in.???;
String second = in.???;

System.out.println(second + " " + first);

Ответ

Нужно поставить:

nextLine()
nextLine()

Здесь каждое значение находится на отдельной строке, поэтому читаем строки целиком.


5. Что выведет программа?

String a = "ма";
String b = "ма";

System.out.println(a);
System.out.print(b);
System.out.println();
System.out.println(a + b);

Ответ

Программа выведет:

ма
ма
мама

Первый println(a) печатает ма и переводит строку. Потом print(b) печатает второе ма, а пустой println() просто переводит строку.


6. Какое значение будет у second в конце выполнения этого кода?

String first = "ма";
String second = "кот";

second = first + second;
second = "супер" + second;

Ответ

В конце:

second = "супермакот"

По шагам:

second = "макот"
second = "супермакот"

7. Что выведет программа?

String s = "ро";
s = s + "бот";
s = "су" + s;

System.out.println(s);

Ответ

Программа выведет:

суробот

По шагам:

s = "робот"
s = "суробот"

8. Какое значение будет у text в конце выполнения этого кода?

String text = "A";
text = text + "B";
text = text + text;

Ответ

В конце:

text = "ABAB"

По шагам:

text = "AB"
text = "ABAB"

9. Какое значение будет у answer в конце выполнения этого кода?

String first = "дом";
String second = "ик";

String word = first + second;
String answer = "супер" + word;

Ответ

В конце:

answer = "супердомик"

По шагам:

word = "домик"
answer = "супердомик"
Яндекс Контест: «01. Переменные» (задачи A-E)

Ссылка на контест: 01. Переменные (только для зарегистрированных учеников курса learncs.ru)

A. Hello, world!

Выведите строку Hello, world!.

Входные данные

Входных данных нет.

Выходные данные

Выведите ровно одну строку: Hello, world!.

Примеры
Ввод
Вывод
Hello, world!


B. Фамилия и имя

Даны имя и фамилия. Выведите их в порядке: сначала фамилия, потом имя.

Входные данные

В первой строке записано имя, во второй строке — фамилия. Обе строки непустые, не содержат пробелов, длина каждой не превосходит 100 символов.

Выходные данные

Выведите два слова через один пробел: сначала фамилию, затем имя.

Примеры
Ввод
Alexandr
Pushkin
Вывод
Pushkin Alexandr


C. Имя и возраст

Даны имя и возраст. Выведите ответ в точности в формате из примера.

Входные данные

В первой строке записано имя без пробелов. Во второй строке записан возраст — целое число от 0 до 150.

Выходные данные

Выведите одну строку в формате: name is age years old.

Примеры
Ввод
Maxim
34
Вывод
Maxim is 34 years old.
Ввод
Joe
25
Вывод
Joe is 25 years old.


D. Две строки наоборот

На вход подаются две строки. Прочитайте обе строки целиком и выведите их в обратном порядке: сначала вторую, потом первую.

Входные данные

В первой строке записана строка s1, во второй — строка s2. Обе строки могут содержать пробелы. Для чтения строк целиком удобно использовать nextLine().

Выходные данные

Выведите две строки: сначала s2, затем s1.

Примеры
Ввод
Мама мыла раму
Папа читал книгу
Вывод
Папа читал книгу
Мама мыла раму
Ввод
one two
three four five
Вывод
three four five
one two


E. Фигура из звездочек

Выведите указанную фигуру из звездочек в точности по образцу.

Примеры
Ввод
Вывод
  *
 ***
*****

*****
 ***
  *

Целочисленные типы данных: int и long

int и long используют для хранения целых чисел и вычислений без дробной части.

int

Этот тип подходит для счёта, количества предметов, номеров и других задач, где не нужны дроби.

Если в выражении участвуют только значения типа int, результат тоже будет иметь тип int.

Примеры выражений с типом int:

Выражение Значение Комментарий
20 + 3 23 сложение
20 - 3 17 вычитание
20 * 3 60 умножение
20 / 3 6 дробная часть отбрасывается
20 % 3 2 остаток от деления
21 % 5 1 остаток после деления на 5
38 % 10 8 последняя цифра числа
24 % 2 0 проверка на чётность
20 / 0 ошибка на ноль делить нельзя
2147483647 + 1 -2147483648 переполнение типа int

Обратите внимание: при делении двух int ответ тоже остаётся целым числом.

Если значение выходит за границы типа int, происходит переполнение. Поэтому очень большие целые числа в int хранить нельзя.

long

long используют для хранения больших целых чисел.

Этот тип нужен, когда значения не помещаются в int. Например, если в задаче встречаются миллиарды, очень большие расстояния или результаты больших вычислений.

По размеру long больше, чем int.

Примерные диапазоны такие:

  • int: от -2 000 000 000 до 2 000 000 000
  • long: от -9 000 000 000 000 000 000 до 9 000 000 000 000 000 000

Литералы типа long обычно записывают с суффиксом L.

Примеры:

long population = 5000000000L;
long distance = 12000000000L;
long stars = 0L;

Если большое число записать без суффикса L, Java сначала воспримет его как int, и возникнет ошибка.

long population = 5000000000; // будет ошибка

Если есть сомнение, хватит ли int, лучше сразу использовать long.

Как и у int, у типа long есть границы. Если значение выходит за них, происходит переполнение.

Ввод-вывод int и long

Для вывода int и long используют те же System.out.print(...) и System.out.println(...), что и для строк.

Для ввода целых чисел в Java обычно используют Scanner. Предполагается, что в программе уже есть:

Scanner in = new Scanner(System.in);
Вызов Что считывает
in.nextInt() Следующее целое число типа int
in.nextLong() Следующее целое число типа long

Основные способы ввода int и long

Обычные целые числа читают через nextInt(), а большие через nextLong().

Обратите внимание: результат nextLong() нужно сохранять в переменную типа long.

int days = in.nextInt();
long visitors = in.nextLong();

System.out.println(days);
System.out.println(visitors);

Ввод
12 5000000000
Вывод
12
5000000000

Приоритет арифметических операций

В выражениях с int и long сначала выполняются действия в скобках. Потом идут *, / и %. После этого выполняются + и -.

Если рядом стоят операции одного уровня, они выполняются слева направо.

Выражение То же самое Значение Комментарий
3 * 5 - 2 (3 * 5) - 2 13 * выполняется раньше -
20 + 5 / 2 20 + (5 / 2) 22 / выполняется раньше +
20 - 17 % 5 20 - (17 % 5) 18 % выполняется раньше -
18 / 5 * 2 (18 / 5) * 2 6 / и * имеют одинаковый приоритет
17 % 5 % 3 (17 % 5) % 3 2 % выполняется слева направо
20 % (7 - 3) 20 % 4 0 скобки меняют порядок вычислений

Эти задачи тренируют шаблоны, которые часто встречаются уже в самых первых задачах: извлечение цифр числа, перевод времени и разбиение суммы на рубли и копейки.

Задачи для тренировки: целочисленные типы данных (int и long)

1. Чему равны выражения:

348 / 10
348 % 10

Ответ

Ответ:

348 / 10 = 34
348 % 10 = 8

Деление на 10 убирает последнюю цифру, а остаток от деления на 10 даёт последнюю цифру.


2. Дано положительное трёхзначное число n. Заполните пропуски, чтобы получить цифру сотен, десятков и единиц.

int hundreds = ???;
int tens = ???;
int ones = ???;

Ответ

int hundreds = n / 100;
int tens = n / 10 % 10;
int ones = n % 10;

3. Дано int totalMinutes = 135;. Чему будут равны hours и minutes?

int hours = totalMinutes / 60;
int minutes = totalMinutes % 60;

Ответ

Ответ:

hours = 2
minutes = 15

4. Дано int totalSeconds = 3672;. Заполните пропуски и найдите значения переменных.

int hours = ???;
int minutes = ???;
int seconds = ???;

Ответ

int hours = totalSeconds / 3600;
int minutes = totalSeconds % 3600 / 60;
int seconds = totalSeconds % 60;

Получится:

hours = 1
minutes = 1
seconds = 12

5. Дано int totalHours = 53;. Сколько это суток и часов?

int days = totalHours / 24;
int hours = totalHours % 24;

Ответ

Ответ:

days = 2
hours = 5

6. Что выведет программа?

long rub = 12;
long kop = 35;
long pieces = 4;

long total = (rub * 100 + kop) * pieces;
System.out.println(total / 100 + " " + total % 100);

Ответ

Программа выведет:

49 40

По шагам:

12 руб 35 коп = 1235 коп
1235 * 4 = 4940 коп
4940 / 100 = 49 руб
4940 % 100 = 40 коп

7. Что выведет программа?

int x = 20 - 17 % 5 * 2;
System.out.println(x);

Ответ

Программа выведет:

16

По шагам:

17 % 5 = 2
2 * 2 = 4
20 - 4 = 16

8. Какой тип нужно выбрать для числа 5000000000 и как правильно записать это значение в коде?

Ответ

Нужен тип long.

long value = 5000000000L;

В int такое число не помещается.

Яндекс Контест: «01. Переменные» (задачи F-M)

Ссылка на контест: 01. Переменные (только для зарегистрированных учеников курса learncs.ru)

F. Сумма двух чисел

Даны два целых числа a и b. Найдите их сумму.

Входные данные

В единственной строке записаны два целых числа a и b.

Выходные данные

Выведите одно целое число — сумму этих чисел.

Примеры
Ввод
2 3
Вывод
5


G. Следующее целое

Дано целое число a. Выведите число, которое идет сразу после него.

Входные данные

В единственной строке записано целое число a.

Выходные данные

Выведите одно целое число — число, следующее за a.

Примеры
Ввод
4
Вывод
5
Ввод
-3
Вывод
-2


H. Число десятков двузначного числа

Дано двузначное натуральное число. Найдите число десятков в нем.

Входные данные

В единственной строке записано двузначное натуральное число.

Выходные данные

Выведите число десятков в этом числе.

Примеры
Ввод
42
Вывод
4
Ввод
98
Вывод
9


I. В сантиметры

Автомобиль едет t часов со скоростью v километров в час. Определите, сколько сантиметров он проедет.

Входные данные

В единственной строке записаны два целых числа t и v.

Выходные данные

Выведите одно целое число — расстояние в сантиметрах.

Примеры
Ввод
1 10
Вывод
1000000
Ввод
2 5
Вывод
1000000


J. Стоимость покупки

Пирожок стоит a рублей и b копеек. Определите, сколько рублей и копеек нужно заплатить за n пирожков.

Входные данные

В единственной строке записаны три целых числа a, b и n. Гарантируется, что 1 ≤ a, b, n ≤ 10000.

Выходные данные

Выведите два целых числа через пробел: стоимость покупки в рублях и копейках.

Примеры
Ввод
10 15 2
Вывод
20 30
Ввод
2 50 3
Вывод
7 50


K. Покупка

Товар стоит a рублей и b копеек. Купили n штук. Определите, сколько рублей и копеек нужно заплатить за всю покупку.

Входные данные

В первой строке записано число a, во второй — b, в третьей — n. Дополнительно гарантируется, что a и n неотрицательны, а 0 ≤ b < 100.

Выходные данные

Выведите два числа: сначала количество рублей, потом количество копеек. Каждое число выведите на отдельной строке.

Примеры
Ввод
10
15
2
Вывод
20
30
Ввод
2
50
4
Вывод
10
0


L. Раскрыть скобки

Недавно на математике Амир научился раскрывать скобки. Теперь он знает, что (a + b) * c = a * c + b * c. На этом уроке учитель задал большую домашнюю работу с очень похожими заданиями. В каждом задании было задано три натуральных числа. Из них нужно было составить выражение, как в формуле, раскрыть скобки и вычислить ответ. Например, если заданы числа 3, 4 и 5, в тетради нужно было записать так: (3+4)*5=3*5+4*5=15+20=35. Вычисления обязательно нужно было выполнять в том же порядке, как в примере, иначе двойка была неизбежна.

Амир уже давно учится программировать и понял, что легко может написать программу, которая выполнит все вычисления в нужном порядке и запишет ответ. Осталось только написать программу.

Входные данные

В единственной строке записаны три натуральных числа a, b и c.

Выходные данные

Выведите полную запись вычислений в точности в формате из примера.

Примеры
Ввод
3 4 5
Вывод
(3+4)*5=3*5+4*5=15+20=35
Ввод
5 3 7
Вывод
(5+3)*7=5*7+3*7=35+21=56


M. Большое число

В этой задаче не надо придумывать никаких сложных формул, в ней даже нет входных данных, просто верните число 10^18.

Входные данные

Входных данных нет.

Выходные данные

Выведите число 10^18.

Примеры
Ввод
Вывод
1000000000000000000

Преобразование типов

Преобразование типов нужно, когда значение уже есть, но для следующего действия нужен другой тип. Например, строку с числом нужно превратить в int или long, а значение типа double иногда нужно явно превратить в int.

Автоматические преобразования

Часть преобразований Java делает сама.

Если к строке прибавить число, это число автоматически превратится в строку.

String text = "x = " + 99;

System.out.println(text);

Вывод
x = 99

Преобразование строки в число

Если число хранится в строке, а дальше его нужно использовать в вычислениях, используют специальные методы.

Вызов Что получается
Integer.parseInt(text) строка превращается в int
Long.parseLong(text) строка превращается в long

Преобразование строки в целое число

int a = Integer.parseInt("126");
long b = Long.parseLong("5000000000");

System.out.println(a);
System.out.println(b);

Вывод
126
5000000000

Строка должна быть записана как число. Например, строку "12a" так преобразовать уже нельзя.

Явное преобразование

Явное преобразование нужно, когда в результате преобразования можно потерять часть данных. Тогда тип пишут в скобках перед выражением.

int a = (int) 2.71828;

System.out.println(a);

Вывод
2

При таком преобразовании из double в int дробная часть отбрасывается.

Преобразования в double разбираются отдельно в главе про вещественные числа.

Выражение Тип Значение Комментарий
Integer.parseInt("12") + 6 int 18 строка сначала превращается в число, и только потом выполняется сложение
(int) 5.9 int 5 дробная часть отбрасывается
"12" + 6 String "126" число превращается в строку, и получается склеивание текста

Примеры преобразования типов в выражениях

Задачи для тренировки: преобразование типов

1. Чему равны тип и значение выражения?

"Возраст: " + 12

Ответ

Ответ:

тип: String
значение: "Возраст: 12"

Число автоматически превращается в строку.


2. Заполните пропуски:

int a = Integer.???("126");
long b = Long.???("5000000000");

Ответ

Нужно подставить:

parseInt
parseLong

Получится:

int a = Integer.parseInt("126");
long b = Long.parseLong("5000000000");

3. Что выведет программа?

int a = (int) 5.9;
int b = (int) 2.1;

System.out.println(a);
System.out.println(b);

Ответ

Программа выведет:

5
2

При преобразовании из double в int дробная часть отбрасывается.


Яндекс Контест: «01. Переменные» (задачи N-O)

Ссылка на контест: 01. Переменные (только для зарегистрированных учеников курса learncs.ru)

N. Число из трех строк

Даны три строки, каждая из которых состоит только из цифр. Склейте их в одну строку, преобразуйте результат в число, прибавьте 1 и выведите ответ.

Входные данные

В первой, второй и третьей строках записаны строки из цифр. Гарантируется, что после склейки получается целое число, не превосходящее 10^9.

Выходные данные

Выведите одно целое число — результат описанных действий.

Примеры
Ввод
12
34
5
Вывод
12346
Ввод
0
0
0
Вывод
1


O. Большое число из пяти строк

Даны пять строк, каждая из которых состоит только из цифр. Склейте их в одну строку, преобразуйте результат в число типа long, прибавьте 1 и выведите ответ.

Входные данные

В пяти строках записаны строки из цифр. Гарантируется, что после склейки получается целое число, не превосходящее 10^18.

Выходные данные

Выведите одно целое число — результат описанных действий.

Примеры
Ввод
12
34
56
78
9
Вывод
123456790
Ввод
0
0
0
0
0
Вывод
1

Переменная — это ячейка памяти, в которой хранится значение во время работы программы.

Тип данных показывает, какие данные хранятся в переменной и какие операции для них подходят.

В этой главе мы рассмотрим только работу со строками и целыми числами. Вещественные, логические и символьные типы мы рассмотрим в других главах.

Базовые термины работы с переменными

  • Объявление переменной связывает имя переменной с типом данных
  • Переменная хранит значение некоторого типа данных
  • Присваивание записывает значение в переменную
  • Литерал — это запись конкретного значения прямо в коде
  • Выражение — это комбинация имён переменных, литералов и операторов, которая вычисляется в значение

Как работает оператор присваивания

C++ сначала вычисляет выражение справа от знака =, а потом оператор присваивания записывает полученное значение в переменную слева.

Задачи для тренировки: базовые термины работы с переменными

1. Корректен ли такой фрагмент?

int a = 1;
123 = a;

Ответ

Некорректно.

Слева от оператора присваивания должна стоять переменная. 123 — это литерал, ему нельзя присвоить значение.


2. Корректен ли такой фрагмент?

string text = "12";
int value = text;

Ответ

Некорректно.

Справа значение типа string, а слева переменная типа int. Для такого преобразования нужно явно переводить строку в число, например через stoi(...).


3. Корректен ли такой фрагмент?

string s = 123;

Ответ

Некорректно.

Переменная s имеет тип string, а справа стоит числовой литерал 123, а не строка.


4. Корректен ли такой фрагмент?

int b = 2;
int a = 3 * b;

Ответ

Корректно.

Справа от = может стоять выражение. Сначала C++ вычисляет 3 * b, потом записывает результат в a.


5. Корректен ли такой фрагмент?

int a = 3;
a = 2 * a;

Ответ

Корректно.

Переменной можно присваивать новое значение. Здесь сначала вычисляется 2 * a, потом результат записывается в ту же переменную a.


6. Корректен ли такой фрагмент?

int a = 2 * a;

Ответ

Некорректно.

В выражении справа используется переменная a, но до этого ей еще не присвоили начальное значение.

Имена переменных

Хорошее имя помогает быстро понять, что хранится в переменной.

  • имя должно подсказывать смысл значения: speed, time, distance
  • имя не должно начинаться с цифры
  • в имени не используют пробелы и дефисы
  • короткие имена a, b, x лучше оставлять только для коротких формул

Пример понятных имен:

int speed = 90;
int time = 8;
int distance = speed * time;

То же вычисление с короткими именами читать сложнее:

int a = 90;
int b = 8;
int c = a * b;

Короткие имена уместны в короткой математической записи:

int a = 7;
int b = 5;
int x = a + b;

Трассировка

Трассировка помогает пошагово проследить, как в программе меняются значения переменных.

Рассмотрим задачу:


Даны длина и ширина прямоугольника. Длину увеличили на 2, а ширину уменьшили на 1. На сколько изменилась площадь прямоугольника?


Для решения будем использовать переменные: в них сохраним исходные данные, промежуточные результаты и ответ.

Например, такой фрагмент можно разбирать по шагам, записывая текущее значение каждой переменной после каждой строки:

int length = 5;
int width = 3;

int s1 = length * width;

length = length + 2;
width = width - 1;

int s2 = length * width;
int d = s2 - s1;
Задачи для тренировки: трассировка

1. Какими станут a и b после выполнения этого кода?

int a = 1234;
int b = 99;

int temp = a;
a = b;
b = temp;

Ответ

В конце:

a = 99
b = 1234

Сначала в temp сохраняется старое значение a, потом a и b меняются местами.


2. Чему будет равно d после выполнения этого кода?

int a = 6;
int b = 7;

int s1 = a * b;

a = a + 1;
b = b + 1;

int s2 = a * b;

int d = s2 - s1;

Ответ

В конце:

d = 14

По шагам:

s1 = 6 * 7 = 42
a = 7
b = 8
s2 = 7 * 8 = 56
d = 56 - 42 = 14

3. Какими станут a и b после выполнения этого кода?

int a = 1234;
int b = 99;

a = a + b;
b = a - b;
a = a - b;

Ответ

В конце:

a = 99
b = 1234

Это тоже обмен значений местами, но без дополнительной переменной.


4. Чему будет равно x в конце выполнения этого кода?

int a = 4;
int b = 3;

int x = a + b;
a = x - a;
b = x - b;
x = a * b;

Ответ

В конце:

x = 12

По шагам:

x = a + b = 7
a = x - a = 7 - 4 = 3
b = x - b = 7 - 3 = 4
x = a * b = 3 * 4 = 12

5. Какими станут a и b после выполнения этого кода?

int a = 10;
int b = 4;

a = a - b;
b = a + b;
a = b - a;

Ответ

В конце:

a = 4
b = 10

По шагам:

a = a - b = 6
b = a + b = 10
a = b - a = 4

Строковый тип данных: string

string используется для ввода-вывода, хранения и обработки текстов.

В C++ строки склеивают оператором +. Если в склеивании участвует число, его сначала превращают в строку через to_string(...).

В отличие от Java, в таком выражении хотя бы одна часть должна быть типа string. Поэтому в примерах ниже слева мы явно создаем string.

Примеры выражений со строками:

Выражение Значение Комментарий
string("My ") + "Precious" "My Precious" пробелы внутри строк важны
string("1234") + "99" "123499" строки не складываются как числа
string("A") + "B" + "C" "ABC" можно склеивать несколько строк в одном выражении
string("Привет, ") + "мир!" "Привет, мир!" можно работать и с русскими строками

Обратите внимание: при склеивании строк новую часть можно добавить и в конец строки, и в её начало.

Проследите, как по шагам меняются значения переменных first и second в этой программе:

string first = "мама";         // В переменную first записали строку "мама".
string second = "кот";         // В переменную second записали строку "кот".

second = second + "ик";        // К "кот" добавили справа "ик". Получилось "котик".
first = "супер" + first;       // К "мама" добавили слева "супер". Получилось "супермама".
second = first + second;       // Склеили "супермама" и "котик". Получилось "супермамакотик".

Ввод-вывод строк

Вывод строк

Для вывода строк используют cout. С его помощью программа выводит текст на экран.

Вызов Что делает
cout << x Печатает x без перевода строки
cout << x << endl Печатает x и переводит строку
cout << endl Просто переводит строку

Основные способы вывода строк

Одни и те же строковые значения можно вывести по-разному: в одной строке или построчно.

Если два строковых значения нужно вывести в одной строке, используют cout << ....

string first = "кот";
string second = "дом";

cout << first;
cout << " ";
cout << second;

Вывод
кот дом

Если те же строковые значения нужно вывести построчно, используют endl.

string first = "кот";
string second = "дом";

cout << first << endl;
cout << second << endl;

Вывод
кот
дом

Если рядом со строкой нужно вывести число, в C++ обычно используют цепочку <<.

int age = 12;
cout << "Возраст: " << age << endl;

Вывод
Возраст: 12

Ввод строк

Для ввода строк в C++ обычно используют cin и getline.

Вызов Что считывает
cin >> word Следующее слово до пробельного символа
getline(cin, line) Всю строку до перевода строки

Основные способы ввода строк

Если два строковых значения разделены пробелом, используют cin >>.

string first;
string second;

cin >> first;
cin >> second;

cout << second << " " << first << endl;

Ввод
кот дом
Вывод
дом кот

cin >> читает по словам, поэтому и пробел, и перевод строки работают для него как разделители.

Если каждое строковое значение находится на отдельной строке, используют getline(...).

string first;
string second;

getline(cin, first);
getline(cin, second);

cout << second << " " << first << endl;

Ввод
кот
дом
Вывод
дом кот

Задачи для тренировки: ввод-вывод строк

1. Что выведет программа?

string first = "кот";
string second = "ик";

cout << first;
cout << second << endl;
cout << first + second << endl;

Ответ

Программа выведет:

котик
котик

Сначала cout << first печатает кот без перехода на новую строку, потом cout << second << endl дописывает ик и переводит строку.


2. Что выведет программа?

int age = 12;

cout << "Возраст: " << age << endl;
cout << age << " лет" << endl;

Ответ

Программа выведет:

Возраст: 12
12 лет

В цепочке cout << число можно вывести рядом со строкой без явного to_string(...).


3. Что нужно поставить вместо ???, если на вход подаётся одна строка:

кот дом
string first;
string second;

cin ??? first;
cin ??? second;

cout << second << " " << first << endl;

Ответ

Нужно поставить:

>>
>>

cin >> читает по одному слову до пробела, поэтому он подходит для ввода кот дом.


4. Что нужно поставить вместо ???, если на вход подаются две строки:

кот
дом
string first;
string second;

???(cin, first);
???(cin, second);

cout << second << " " << first << endl;

Ответ

Нужно поставить:

getline
getline

Здесь каждое значение находится на отдельной строке, поэтому читаем строки целиком.


5. Что выведет программа?

string a = "ма";
string b = "ма";

cout << a << endl;
cout << b;
cout << endl;
cout << a + b << endl;

Ответ

Программа выведет:

ма
ма
мама

Первый cout << a << endl печатает ма и переводит строку. Потом cout << b печатает второе ма, а отдельный cout << endl просто переводит строку.


6. Какое значение будет у second в конце выполнения этого кода?

string first = "ма";
string second = "кот";

second = first + second;
second = "супер" + second;

Ответ

В конце:

second = "супермакот"

По шагам:

second = "макот"
second = "супермакот"

7. Что выведет программа?

string s = "ро";
s = s + "бот";
s = "су" + s;

cout << s << endl;

Ответ

Программа выведет:

суробот

По шагам:

s = "робот"
s = "суробот"

8. Какое значение будет у text в конце выполнения этого кода?

string text = "A";
text = text + "B";
text = text + text;

Ответ

В конце:

text = "ABAB"

По шагам:

text = "AB"
text = "ABAB"

9. Какое значение будет у answer в конце выполнения этого кода?

string first = "дом";
string second = "ик";

string word = first + second;
string answer = "супер" + word;

Ответ

В конце:

answer = "супердомик"

По шагам:

word = "домик"
answer = "супердомик"

Целочисленные типы данных: int и long long

int и long long используют для хранения целых чисел и вычислений без дробной части.

int

Этот тип подходит для счёта, количества предметов, номеров и других задач, где не нужны дроби.

Если в выражении участвуют только значения типа int, результат тоже будет иметь тип int.

Примеры выражений с типом int:

Выражение Значение Комментарий
20 + 3 23 сложение
20 - 3 17 вычитание
20 * 3 60 умножение
20 / 3 6 дробная часть отбрасывается
20 % 3 2 остаток от деления
21 % 5 1 остаток после деления на 5
38 % 10 8 последняя цифра числа
24 % 2 0 проверка на чётность
20 / 0 ошибка на ноль делить нельзя
2147483647 + 1 не определено выход за границы signed int

Обратите внимание: при делении двух int ответ тоже остаётся целым числом.

Если значение выходит за границы типа int, на результат уже нельзя рассчитывать. Поэтому очень большие целые числа в int хранить нельзя.

long long

long long используют для хранения больших целых чисел.

Этот тип нужен, когда значения не помещаются в int. Например, если в задаче встречаются миллиарды, очень большие расстояния или результаты больших вычислений.

По размеру long long больше, чем int.

Примерные диапазоны такие:

  • int: от -2 000 000 000 до 2 000 000 000
  • long long: от -9 000 000 000 000 000 000 до 9 000 000 000 000 000 000

Литералы типа long long в учебных примерах удобно записывать с суффиксом LL, чтобы тип был виден прямо в коде.

Примеры:

long long population = 5000000000LL;
long long distance = 12000000000LL;
long long stars = 0LL;

Если есть сомнение, хватит ли int, лучше сразу использовать long long.

Как и у int, у типа long long есть границы. Если значение выходит за них, на результат вычислений уже нельзя рассчитывать.

Ввод-вывод int и long long

Для вывода int и long long используют те же cout << ..., что и для строк.

Для ввода целых чисел в C++ обычно используют cin.

Фрагмент Что считывает
cin >> x при int x; Следующее целое число типа int
cin >> y при long long y; Следующее целое число типа long long

Основные способы ввода int и long long

Обычные целые числа читают в int, а большие — в long long.

int days;
long long visitors;

cin >> days;
cin >> visitors;

cout << days << endl;
cout << visitors << endl;

Ввод
12 5000000000
Вывод
12
5000000000

Приоритет арифметических операций

В выражениях с int и long long сначала выполняются действия в скобках. Потом идут *, / и %. После этого выполняются + и -.

Если рядом стоят операции одного уровня, они выполняются слева направо.

Выражение То же самое Значение Комментарий
3 * 5 - 2 (3 * 5) - 2 13 * выполняется раньше -
20 + 5 / 2 20 + (5 / 2) 22 / выполняется раньше +
20 - 17 % 5 20 - (17 % 5) 18 % выполняется раньше -
18 / 5 * 2 (18 / 5) * 2 6 / и * имеют одинаковый приоритет
17 % 5 % 3 (17 % 5) % 3 2 % выполняется слева направо
20 % (7 - 3) 20 % 4 0 скобки меняют порядок вычислений

Эти задачи тренируют шаблоны, которые часто встречаются уже в самых первых задачах: извлечение цифр числа, перевод времени и разбиение суммы на рубли и копейки.

Задачи для тренировки: целочисленные типы данных (int и long long)

1. Чему равны выражения:

348 / 10
348 % 10

Ответ

Ответ:

348 / 10 = 34
348 % 10 = 8

Деление на 10 убирает последнюю цифру, а остаток от деления на 10 даёт последнюю цифру.


2. Дано положительное трёхзначное число n. Заполните пропуски, чтобы получить цифру сотен, десятков и единиц.

int hundreds = ???;
int tens = ???;
int ones = ???;

Ответ

int hundreds = n / 100;
int tens = n / 10 % 10;
int ones = n % 10;

3. Дано int totalMinutes = 135;. Чему будут равны hours и minutes?

int hours = totalMinutes / 60;
int minutes = totalMinutes % 60;

Ответ

Ответ:

hours = 2
minutes = 15

4. Дано int totalSeconds = 3672;. Заполните пропуски и найдите значения переменных.

int hours = ???;
int minutes = ???;
int seconds = ???;

Ответ

int hours = totalSeconds / 3600;
int minutes = totalSeconds % 3600 / 60;
int seconds = totalSeconds % 60;

Получится:

hours = 1
minutes = 1
seconds = 12

5. Дано int totalHours = 53;. Сколько это суток и часов?

int days = totalHours / 24;
int hours = totalHours % 24;

Ответ

Ответ:

days = 2
hours = 5

6. Что выведет программа?

long long rub = 12;
long long kop = 35;
long long pieces = 4;

long long total = (rub * 100 + kop) * pieces;
cout << total / 100 << " " << total % 100 << endl;

Ответ

Программа выведет:

49 40

По шагам:

12 руб 35 коп = 1235 коп
1235 * 4 = 4940 коп
4940 / 100 = 49 руб
4940 % 100 = 40 коп

7. Что выведет программа?

int x = 20 - 17 % 5 * 2;
cout << x << endl;

Ответ

Программа выведет:

16

По шагам:

17 % 5 = 2
2 * 2 = 4
20 - 4 = 16

8. Какой тип нужно выбрать для числа 5000000000 и как правильно записать это значение в коде?

Ответ

Нужен тип long long.

long long value = 5000000000LL;

В int такое число не помещается.

Преобразование типов

Преобразование типов нужно, когда значение уже есть, но для следующего действия нужен другой тип. Например, строку с числом нужно превратить в int или long long, а значение типа double иногда нужно явно превратить в int.

Автоматические преобразования

Часть преобразований C++ делает сама.

Если в выражении участвуют int и long long, значение типа int автоматически расширяется до long long.

int a = 12;
long long b = 5000000000LL;
long long total = a + b;

cout << total << endl;

Вывод
5000000012

При выводе через cout << число тоже не нужно вручную превращать в строку.

Преобразование строки в число

Если число хранится в строке, а дальше его нужно использовать в вычислениях, используют специальные функции.

Вызов Что получается
stoi(text) строка превращается в int
stoll(text) строка превращается в long long

Преобразование строки в целое число

int a = stoi("126");
long long b = stoll("5000000000");

cout << a << endl;
cout << b << endl;

Вывод
126
5000000000

Строка должна быть записана как число. Например, строку "12a" так преобразовать уже нельзя.

Явное преобразование

Явное преобразование нужно, когда в результате преобразования можно потерять часть данных. Тогда тип пишут явно перед выражением.

int a = static_cast<int>(2.71828);

cout << a << endl;

Вывод
2

При таком преобразовании из double в int дробная часть отбрасывается.

Преобразования в double разбираются отдельно в главе про вещественные числа.

Выражение Тип Значение Комментарий
stoi("12") + 6 int 18 строка сначала превращается в число, и только потом выполняется сложение
static_cast<int>(5.9) int 5 дробная часть отбрасывается
to_string(12) + "6" string "126" число превращается в строку, и получается склеивание текста

Примеры преобразования типов в выражениях

Задачи для тренировки: преобразование типов

1. Чему равны тип и значение выражения?

to_string(12) + " лет"

Ответ

Ответ:

тип: string
значение: "12 лет"

Число сначала превращается в строку функцией to_string(...).


2. Заполните пропуски:

int a = ???("126");
long long b = ???("5000000000");

Ответ

Нужно подставить:

stoi
stoll

Получится:

int a = stoi("126");
long long b = stoll("5000000000");

3. Что выведет программа?

int a = static_cast<int>(5.9);
int b = static_cast<int>(2.1);

cout << a << endl;
cout << b << endl;

Ответ

Программа выведет:

5
2

При преобразовании из double в int дробная часть отбрасывается.


По материалам:
М. Густокашин. Введение в программирование на языке C++. Сириус Курсы. Перейти к курсу.

Типы данных

В Python переменная — это имя, которое ссылается на значение. Тип рядом с именем писать не нужно: Python определяет его по значению справа.

count = 10            # int
price = 19.99         # float
ok = True             # bool
title = "Типы данных" # str

Чаще всего используются такие типы:

Что храним Тип Примеры значений
Целые числа int 0, 7, -3, 2025, 5000000000
Вещественные числа float 3.14, 0.5, -2.75
Ответы «да/нет» bool True, False
Текст str "Привет", "Python"

Как выбрать тип переменной для чисел

  • int используют для целых чисел, в том числе очень больших;
  • отдельный тип long в Python не нужен: int автоматически расширяется;
  • float используют, когда у числа есть дробная часть.

Работа со строками

Строковый тип str используют для хранения текста.

first_name = "Анна"
last_name = "Иванова"
full_name = first_name + " " + last_name
print(full_name)

Вывод
Анна Иванова

Склеивание строк — это объединение частей в одну строку с помощью +. Если в склеивании участвует число, его сначала преобразуют в строку через str(...).

age = 12
print("Возраст: " + str(age))

Вывод
Возраст: 12

Ввод на Python

input() всегда возвращает строку. Если нужно прочитать число, сразу преобразуйте ввод:

age = int(input())
avg = float(input())
print(age + 1)
print(avg)

Ввод
12
4.6
Вывод
13
4.6

Если в одной строке несколько чисел, удобно читать их так:

speed, time = map(int, input().split())
dist = speed * time
print(dist)

Ввод
90 8
Вывод
720

Что делает map(int, input().split())

  • input() читает строку целиком, например "90 8";
  • split() делит строку на части по пробельным символам (пробелы, табы): ["90", "8"];
  • map(int, ...) применяет int к каждому элементу: получаются числа 90 и 8;
  • speed, time = ... раскладывает эти два числа по переменным.

Для строк тоже полезен split():

first_name, last_name = input().split()
print(last_name, first_name)

Типичная ошибка при вводе: если забыть int(...), то число останется строкой.

a = input()   # "2"
b = input()   # "5"
print(a + b)  # 25, а не 7

Ввод
2
5
Вывод
25

Правильный вариант:

a = int(input())
b = int(input())
print(a + b)

Ввод
2
5
Вывод
7

Простые числовые шаблоны

Какие шаблоны нужны уже в самых первых задачах

  • для положительных целых n // 10 убирает последнюю цифру: 57 // 10 дает 5;
  • если величина хранится в младшей единице, то whole = total // 100, part = total % 100.
code = 57
print(code // 10)

Вывод
5

meters = 12
centimeters = 35
pieces = 4
total_cm = (meters * 100 + centimeters) * pieces
print(total_cm // 100, total_cm % 100)

Вывод
49 40

Подробно про операции // и % рассказано в главе Целочисленная арифметика.

Вывод на Python

Для вывода используют print().

Как работает print()

  • если передать несколько значений через запятую, print выведет их через пробел;
  • по умолчанию после каждого вызова print добавляется перевод строки.

Проверим правила на примерах:

points = 18
total = 20
print("Результат:", points, "из", total)

Вывод
Результат: 18 из 20

print("Первая строка")
print("Вторая строка")

Вывод
Первая строка
Вторая строка

Когда условие требует ровно один знак после запятой, удобно использовать format(..., ".1f").

meters = 260
kilometers = meters / 1000
print(str(meters) + " m = " + format(kilometers, ".1f") + " km")

Вывод
260 m = 0.3 km

Имена переменных

Имена лучше делать понятными: count, price, time, dist. Имена a, b, x лучше использовать только в короткой математической записи.

Хорошее имя сразу подсказывает, что хранится в переменной.

Пример понятных имен:

speed = 90
time = 8
dist = speed * time
print(dist)

Вывод
720

То же вычисление с короткими именами читать сложнее:

a = 90
b = 8
c = a * b
print(c)

Вывод
720

Короткие имена уместны в короткой математической записи:

a = 7
b = 5
x = a + b
print(x)

Вывод
12