JavaRush /Курси /C++ SELF /Цілі числа: int, арифметика, ділення та остача %

Цілі числа: int, арифметика, ділення та остача %

C++ SELF
Рівень 2 , Лекція 1
Відкрита

1. Змінні int: навіщо вони потрібні й як із ними працювати

Спершу може здаватися, що числа в програмі можна використовувати «як у зошиті»: написали 2 + 2 — і готово. Але реальна програма зазвичай не обмежується одним рядком. Вона зберігає дані, змінює їх, кілька разів використовує результати обчислень і виводить різні фрагменти в різних місцях. Тому нам потрібен спосіб сказати: «Це число важливе. Дамо йому імʼя і звертатимемося до нього пізніше».

Тип int — це найпростіший інструмент для цього. Він зберігає цілі числа: 0, 7, -12, 42. Без дробової частини. Можна уявити його як «коробку для цілого числа» з ярличком — імʼям змінної, — щоб не плутатися.

Оголошення, початкове значення та присвоювання

Коли ви створюєте змінну, то робите дві речі: вигадуєте їй імʼя і вибираєте тип, тобто визначаєте, що саме в ній зберігатиметься. Потім зазвичай одразу задаєте початкове значення, щоб змінна не залишалася «порожньою» (у C++ це особливо важливо).

Подивімося на найпростіший приклад. Тут ми не робимо нічого складного: просто зберігаємо вік і виводимо його. Але саме з таких дрібниць починається майже будь-яка програма.

#include <iostream>

int main() {
    int age = 18;

    std::cout << "Age = " << age << '\n'; // Age = 18
}

Зверніть увагу на три моменти. По-перше, int age = 18; можна прочитати так: «створи змінну age типу int і поклади туди 18». По-друге, у std::cout можна виводити і текст, і числа, просто поєднуючи їх оператором <<. По-третє, символ переведення рядка '\n' допомагає зробити виведення охайним.

Тепер найважливіше: змінна — не константа. Її значення можна змінювати за допомогою присвоювання.

#include <iostream>

int main() {
    int score = 0;
    std::cout << score << '\n'; // 0

    score = 10;
    std::cout << score << '\n'; // 10
}

Тут рядок score = 10; означає: «замінити старе значення новим». І так, знак = у програмуванні зазвичай означає не «дорівнює», а «поклади» або «запиши».

2. Арифметика int і дужки у виразах

Операції +, -, * для цілих чисел

З арифметикою в int все досить знайомо, і це приємно: додавання, віднімання та множення працюють так, як ви й очікуєте. Щоправда, є важливий нюанс: результат теж буде цілим числом, бо ми працюємо у світі int. Поки що це звучить очевидно, але під час ділення ця особливість проявиться особливо помітно — і до цього ми ще дійдемо.

Почнімо з простого: порахуймо суму, різницю та добуток.

#include <iostream>

int main() {
    int a = 7;
    int b = 2;

    std::cout << (a + b) << '\n'; // 9
    std::cout << (a - b) << '\n'; // 5
    std::cout << (a * b) << '\n'; // 14
}

Дужки тут не обовʼязкові, але для новачків вони часто рятівні: ви явно показуєте, що саме хочете обчислити, і маєте менше шансів перетворити вираз на ребус.

Ще один корисний прийом — зберігати результат обчислення у змінній. Так код легше читати: спочатку обчислили, потім використали.

#include <iostream>

int main() {
    int apples = 3;
    int pears = 4;

    int total = apples + pears;
    std::cout << total << '\n'; // 7
}

Дужки: для сенсу й читабельності

Коли вирази стають трохи довшими, мозок починає робити те саме, що й компілятор: намагатися зрозуміти порядок обчислень. Різниця в тому, що мозок втомлюється, а компілятор — ні. Тому хороший стиль у програмуванні часто зводиться до простого правила: ставте дужки там, де людині може бути неочевидно. Це не слабкість, а турбота про майбутнього себе і про ментора, який перевірятиме ваш код.

Порівняйте два варіанти: на вигляд вони схожі, але читаються по-різному.

#include <iostream>

int main() {
    int x = 10;
    int y = 3;

    int r1 = x + y * 2;
    int r2 = (x + y) * 2;

    std::cout << r1 << '\n'; // 16
    std::cout << r2 << '\n'; // 26
}

Дужки змінюють сенс. Тому варто тримати в голові просте правило: якщо формула важлива, краще зробити її очевидною, а не покладатися на памʼять про пріоритети операторів.

3. Ділення / і остача % для int

Ділення /: результат завжди цілий

Оператор / для int виконує цілочисельне ділення. Це означає, що результат теж буде int, а дробова частина не округлюється за правилами математики, а просто відкидається.

Перевірмо це на класичному прикладі:

#include <iostream>

int main() {
    int a = 7;
    int b = 2;

    std::cout << (a / b) << '\n'; // 3
}

Чому 3, а не 3.5? Тому що int не вміє зберігати .5. Він зберігає лише цілі значення. Тож програма бере цілу частину, а решту відкидає.

Ця поведінка зручна, коли ви рахуєте, скільки цілих предметів уміщується. Наприклад, скільки пачок по 6 штук можна скласти, якщо у вас є 25 печив. Але вона ж може збити з пантелику, якщо ви очікували «справжнього» ділення. Поки ми працюємо лише з int, просто запамʼятайте правило: int / int дає int.

Окремо зверніть увагу: з відʼємними числами результат теж буде цілим. У сучасному C++ дробова частина відкидається в бік нуля, тобто -7 / 2 дає -3.

#include <iostream>

int main() {
    int a = -7;
    int b = 2;

    std::cout << (a / b) << '\n'; // -3
}

Якщо ви зараз подумали: «М-м-м, а яка тоді буде остача?» — ви мислите як програміст. Переходимо до %.

Остача %: що залишається після ділення

Оператор % читається як «остача від ділення». Він працює лише з цілими числами (у нашому випадку — з int). Зазвичай його використовують у задачах на кшталт «розкласти по коробках», «розміняти суму» або «перевірити, чи ділиться число без остачі».

Найпростіший приклад:

#include <iostream>

int main() {
    int a = 7;
    int b = 2;

    std::cout << (a % b) << '\n'; // 1
}

Тобто якщо поділити 7 апельсинів між 2 людьми, кожен отримає 3 апельсини, а 1 залишиться в остачі.

Корисно памʼятати звʼязок між діленням та остачею у вигляді формули: a = (a / b) * b + (a % b)

Це не магія і не заклинання, а просто охайний спосіб сказати: «число a складається з цілого числа груп по b плюс остача».

Давайте перевіримо це прямо в коді:

#include <iostream>

int main() {
    int a = 25;
    int b = 6;

    int q = a / b;  // скільки повних груп
    int r = a % b;  // скільки залишилося

    std::cout << q << '\n'; // 4
    std::cout << r << '\n'; // 1
}

Зараз це може здаватися «іграшкою», але вже через кілька задач ви почнете помічати % всюди: час на годиннику, парність і непарність, розбиття на сторінки, переведення секунд у хвилини тощо.

4. Ділення на нуль неприпустиме

У математиці ділення на нуль не визначене. У програмуванні це перетворюється на практичну проблему: вирази a / 0 та a % 0 неприпустимі. Програма або аварійно завершиться, або поводитиметься зовсім непередбачувано, а це ще гірше, бо помилки можуть проявитися «десь потім».

Тут важливий не страх, а звичка: якщо у вас є дільник, який теоретично може стати нулем, це треба контролювати. Поки ми ще не проходили if, тому сьогодні правило просте: у прикладах і перших задачах не ділимо на нуль і памʼятаємо, що дільник має бути ненульовим.

5. Мінізастосунок: «Автомат із монетами»

Зараз ми напишемо невелику програму, схожу на фрагмент із реального життя: у нас є сума грошей і ціна товару, і ми хочемо зʼясувати дві речі. По-перше, скільки товарів можна купити. По-друге, скільки грошей залишиться. Це ідеальна задача для пари / і %.

Важливо: поки що ми не вміємо вводити дані, тому числа будуть задані прямо в коді. Це нормально: сьогодні наша мета — не введення, а арифметика.

Версія 1: рахуємо кількість і остачу

Уявімо, що в нас є 275 центів (тобто $2.75), а печиво коштує 60 центів. Порахуємо.

#include <iostream>

int main() {
    int moneyCents = 275;
    int cookiePrice = 60;

    int cookies = moneyCents / cookiePrice;
    int change = moneyCents % cookiePrice;

    std::cout << cookies << '\n'; // 4
    std::cout << change << '\n';  // 35
}

Тут добре видно, навіщо потрібні змінні: ми один раз задали ціну й суму, а далі використовуємо їх в обчисленнях і можемо легко змінити сценарій, не переписуючи всю програму.

Версія 2: робимо виведення зрозумілішим

Поки що виведення має «компʼютерний» вигляд: просто числа стовпчиком. Давайте додамо підписи, щоб це стало схожим на звичайну консольну програму. Ми ще не використовуємо рядки як тип — це буде в наступній лекції, — але виводити текст у лапках уже вміємо.

#include <iostream>

int main() {
    int moneyCents = 275;
    int cookiePrice = 60;

    int cookies = moneyCents / cookiePrice;
    int change = moneyCents % cookiePrice;

    std::cout << "Cookies: " << cookies << '\n'; // Cookies: 4
    std::cout << "Change: " << change << " cents\n"; // Change: 35 cents
}

Тепер це вже більше схоже на застосунок, а не на контрольну з арифметики.

Версія 3: ще одна покупка

Припустімо, після купівлі печива ви ще хочете купити жуйку за 35 центів. Оcтачі якраз вистачає. Порахуємо, скільки жуйок можна купити на ці гроші. До речі, це знову задача на / і %, просто з іншими числами.

#include <iostream>

int main() {
    int moneyCents = 275;
    int cookiePrice = 60;
    int gumPrice = 35;

    int cookies = moneyCents / cookiePrice;
    int changeAfterCookies = moneyCents % cookiePrice;

    int gums = changeAfterCookies / gumPrice;

    std::cout << "Cookies: " << cookies << '\n'; // Cookies: 4
    std::cout << "Gums: " << gums << '\n';       // Gums: 1
}

Тут особливо добре видно, що змінні допомагають утримувати «сюжет» програми. Ми не просто обчислюємо числа — ми описуємо процес.

6. Типові помилки під час роботи з int, / і %

Помилка № 1: очікувати, що 7 / 2 дасть 3.5.
Це одна з найтиповіших пасток для новачків: мозок памʼятає шкільну математику, а програма працює у світі int. У цілочисельному діленні дробова частина відкидається, бо int не вміє зберігати половинки. Якщо вам потрібен дріб, це вже окрема тема, але сьогодні ми свідомо працюємо лише з цілими числами і приймаємо їхні правила.

Помилка № 2: використовувати % «для всього підряд».
Остача — не «чарівна кнопка», а цілком конкретна операція зі змістом «що залишилося після ділення на рівні груп». Якщо ви не можете словами пояснити, що саме залишається, найімовірніше, % ви застосовуєте навмання. А вгадування в програмуванні працює приблизно так само, як і «вгадування пароля»: інколи спрацьовує, але краще на це не покладатися.

Помилка № 3: забути, що a % 0 і a / 0 неприпустимі.
Ділення на нуль не просто «дає помилку». Воно ламає саму логіку обчислень. Тому правило просте: дільник, тобто те, на що ділимо, має бути ненульовим. Пізніше, коли зʼявляться умови (if), ви навчитеся захищати програму від такого введення. А поки — просто не пишіть такого коду і не підставляйте 0 у дільник.

Помилка № 4: писати довгі вирази без дужок і потім не розуміти результат.
Формально компілятор розбереться, але людині не завжди так легко. У підсумку легко отримати ситуацію: «ніби все правильно, але чому відповідь не та?» Дужки — простий і дешевий спосіб зробити зміст виразу очевидним і для вас, і для того, хто читатиме код. У програмуванні це називається не занудством, а профілактикою багів.

Помилка № 5: плутати «створити змінну» і «змінити змінну».
int x = 10; — це створення змінної з початковим значенням. x = 10; — це присвоювання вже наявній змінній. Якщо спробувати «створити» змінну вдруге з тим самим імʼям у тому самому місці, компілятор справедливо обуриться: «так, хвилинку, у нас тут уже є x».

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ