Отримані знання завжди потрібно застосовувати на практиці, тому ми спочатку повторимо теорію, а потім перейдемо до практики.
Теорія
Цілочисельні типи даних використовуються для зберігання цілих чисел. Не забувайте про проблеми ділення і переповнення з ними. Використовуйте цілочисельні типи з фіксованим розміром.
Типи даних з плаваючою крапкою використовуються для зберігання дійсних чисел. Не забувайте про проблеми з точністю, помилки округлення і неточне порівняння чисел.
Логічний тип даних містить 2 значення: true
і false
.
Символьний тип даних містить цілі числа, які можуть інтерпретуватися в символи, що відповідають стандарту ASCII. Будьте обережні при використанні фактичних чисел і цифр, які використовуються для представлення символів. Також пам’ятайте про проблеми переповнення.
Використовуйте специфікатор const для оголошення символьних констант замість використання директив #define. Це безпечніше.
Завдання №1
Чому символьні константи краще літеральних (магічних чисел)? Чому використання const краще використання директив #define?
Відповідь №1
Використання літеральних констант (магічних чисел) не тільки ускладнює програму, але і ускладнює внесення в неї змін. Символьні константи краще тим, що вони надають контекст того, навіщо і чому вони використовуються, а також, якщо вам потрібно буде внести зміни — достатньо внести правки тільки в визначенні константи, а не шукати їх по всьому коду. Константи #define не відображаються у відлагоджувачеві, ймовірність виникнення конфлікту імен у них вище.
Завдання №2
Виберіть відповідний тип даних для змінних в кожній з наступних ситуацій. Будьте якомога конкретнішими. Якщо відповіддю є цілочисельний тип даних, то використовуйте відповідний тип з фіксованим розміром (наприклад, int16_t
). Якщо змінна повинна бути константною, то так і відповідайте.
Вік користувача.
Чи подобається певний колір користувачеві?
Число Пі.
Кількість сторінок в підручнику.
Ціна акцій в доларах (є дробова частина).
Скільки разів ви моргнули за все своє життя? (Примітка: Відповідь обчислюється в мільйонах)
Користувач вибирає опцію за допомогою вводу певної букви.
Відповідь №2
int8_t
не зможе зберігати вік людини, старше 127 років. Незважаючи на те, що таких випадків у світі одиниці (якщо є взагалі), в майбутньому це може бути цілком можливим, тому int16_t
тут підійде найкраще.
bool.
const double.
Оскільки більшість книг мають більше 255 сторінок, але менше ніж 32 767, то int16_t
— тут найкращий варіант.
float.
int32_t.
char.
Завдання №3
Напишіть наступну програму. Спочатку користувачеві пропонується ввести 2 числа типу з плаваючою крапкою (використовуйте тип double). Потім пропонується ввести один з наступних математичних символів: +
, -
, *
або /
. Програма виконує обрану користувачем математичну операцію з двома числами, а потім виводить результат на екран. Якщо користувач ввів некоректний символ, то програма нічого не повинна виводити.
Наприклад:
Enter a double value: 7
Enter a second double value: 5
Enter one of the following: +, -, *, or /: *
7 * 5 = 35
Підказка: Ви можете використовувати розгалуження if для того, щоб визначити, ввів користувач певний математичний символ (наприклад, +
) чи ні. Детально про це читайте на уроці №37.
Відповідь №3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#include <iostream> double getDouble() { std::cout << "Enter a double value: "; double x; std::cin >> x; return x; } char getOperator() { std::cout << "Enter one of the following: +, -, *, or / "; char op; std::cin >> op; return op; } void printResult(double x, char op, double y) { if (op == '+') std::cout << x << " + " << y << " = " << x + y << '\n'; else if (op == '-') std::cout << x << " - " << y << " = " << x - y << '\n'; else if (op == '*') std::cout << x << " * " << y << " = " << x * y << '\n'; else if (op == '/') std::cout << x << " / " << y << " = " << x / y << '\n'; } int main() { double x = getDouble(); double y = getDouble(); char op = getOperator(); printResult(x, op, y); return 0; } |
Завдання №4
Це вже трохи складніше. Напишіть коротку програму-симулятор падіння м’ячика з вежі. Спочатку користувачеві пропонується ввести висоту вежі в метрах. Не забувайте про гравітацію (9,8м/с2
) і про те, що у м’ячика немає початкової швидкості (він тримається в руках). Програма повинна виводити відстань від землі, на якому знаходиться м’ячик після 0, 1, 2, 3, 4 і 5 секунд падіння. Мінімальна висота — 0 метрів (нижче м’ячику падати не можна).
У вашій програмі повинен бути заголовковий файл constants.h з простором імен myConstants
. У myConstants
визначте константу для зберігання значення сили тяжіння на Землі (9.8
). В якості нагадування дивіться урок №40.
Напишіть функцію для обчислення висоти м’ячика через х
секунд падіння. Використовуйте наступну формулу: висота м’ячика = константа_гравітаціі * x_секунд2/2.
Приклад результату виконання програми:
Enter the initial height of the tower in meters: 100
At 0 seconds, the ball is at height: 100 meters
At 1 seconds, the ball is at height: 95.1 meters
At 2 seconds, the ball is at height: 80.4 meters
At 3 seconds, the ball is at height: 55.9 meters
At 4 seconds, the ball is at height: 21.6 meters
At 5 seconds, the ball is on the ground.
Примітки:
Залежно від початкової висоти, м’ячик може і не досягти землі протягом 5 секунд — це нормально. Ми вдосконалимо цю програму, коли розглядатимемо цикли.
Символ ^
не є експонентом в мові C++. В формулі замість нього використовуйте знак множення *
.
Відповідь №4
Файл constants.h:
1 2 3 4 5 6 7 8 |
#ifndef CONSTANTS_H #define CONSTANTS_H namespace myConstants { const double gravity(9.8); } #endif |
Файл main.cpp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#include <iostream> #include "constants.h" // Отримуємо початкову висоту від користувача і повертаємо її double getInitialHeight() { std::cout << "Enter the height of the tower in meters: "; double initialHeight; std::cin >> initialHeight; return initialHeight; } // Повертаємо відстань від землі після "..." секунд падіння double calculateHeight(double initialHeight, int seconds) { // Використовуємо формулу: [ s = u * t + (a * t^2) / 2 ], де u (початкова швидкість) = 0 double distanceFallen = (myConstants::gravity * seconds * seconds) / 2; double currentHeight = initialHeight - distanceFallen; return currentHeight; } // Виводимо висоту, на якій знаходиться м'ячик після кожної секунди падіння void printHeight(double height, int seconds) { if (height > 0.0) std::cout << "At " << seconds << " seconds, the ball is at height: " << height << " meters\n"; else std::cout << "At " << seconds << " seconds, the ball is on the ground.\n"; } void calculateAndPrintHeight(double initialHeight, int seconds) { double height = calculateHeight(initialHeight, seconds); printHeight(height, seconds); } int main() { const double initialHeight = getInitialHeight(); calculateAndPrintHeight(initialHeight, 0); calculateAndPrintHeight(initialHeight, 1); calculateAndPrintHeight(initialHeight, 2); calculateAndPrintHeight(initialHeight, 3); calculateAndPrintHeight(initialHeight, 4); calculateAndPrintHeight(initialHeight, 5); return 0; } |
Зверніть увагу, функція calculateHeight() не виводить висоту на екран (пам’ятайте про “правило одного завдання”). Ми використовуємо окрему функцію для виводу.
А ось якщо для третього завдання писати код, то такий варіант приємлемий?