Українська
Практика
У прикладах усі початкові дані записано в коді. Програми не очікують введення з клавіатури. Кожен приклад створюють як окремий консольний проєкт з одним файлом main.cpp: у межах виконуваної програми має бути лише одна функція main. Заголовок <print> надає std::println. Параметри проєкту та підготовку термінала наведено в теоретичних відомостях.
Приклад 1. Розклад дзвінків
Умова. Вивести розклад трьох пар. Номер пари, початок, закінчення й аудиторію задати в коді. Вирівняти стовпці та додати заголовок.
cpp
#include <print>
int main()
{
std::println("Розклад дзвінків");
std::println("Пара | Початок | Кінець | Аудиторія");
std::println("-----+---------+--------+----------");
std::println("{:>4} | {:^7} | {:^6} | {:>9}",
1, "08:30", "09:50", "201");
std::println("{:>4} | {:^7} | {:^6} | {:>9}",
2, "10:00", "11:20", "305");
std::println("{:>4} | {:^7} | {:^6} | {:>9}",
3, "11:30", "12:50", "112");
return 0;
}Рядок формату містить чотири поля, а після нього передано чотири значення в тому самому порядку. Запис {:>4} вирівнює номер праворуч у полі шириною чотири позиції. Запис {:^7} розміщує час посередині поля шириною сім позицій. Символи | і + створюють просту текстову таблицю, яка залишається зрозумілою без кольорів.
Результат виконання:
text
Розклад дзвінків
Пара | Початок | Кінець | Аудиторія
-----+---------+--------+----------
1 | 08:30 | 09:50 | 201
2 | 10:00 | 11:20 | 305
3 | 11:30 | 12:50 | 112Час тут є текстом, а не спеціальним часовим типом. Програма не обчислює інтервали між парами. Після зміни аудиторії 201 на 1001 стовпець збереже вирівнювання, оскільки значення поміщається в дев’ять позицій. Якщо текст довший за ширину поля, він не обрізається: поле розшириться. Це слід перевіряти під час оформлення таблиць.
Приклад 2. Етикетка товару
Умова. Для навчального товару «Блокнот» ціною 50 грн без податку обчислити умовний ПДВ 20 % та ціну з податком. Вивести етикетку з рамкою. Ставка в цьому прикладі є заданим навчальним параметром.
cpp
#include <print>
int main()
{
const double net = 50.0;
const double rate = 0.20;
const double tax = net * rate;
const double total = net + tax;
std::println("+----------------------------+");
std::println("| Товар: Блокнот |");
std::println("| Без ПДВ: {:>10.2f} грн |", net);
std::println("| ПДВ 20%: {:>10.2f} грн |", tax);
std::println("| З ПДВ: {:>10.2f} грн |", total);
std::println("+----------------------------+");
return 0;
}Імена net, rate, tax і total дають змогу читати обчислення як послідовність кроків. Слово const позначає значення, яке після ініціалізації не змінюють. Тип double використовуємо для чисел із дробовою частиною; докладно типи даних розглядаються в наступній темі. У коді десятковий роздільник – крапка. Множення позначене *, додавання – +. Наприклад, 50.0 * 0.20 дає 10.0.
Специфікатор {:>10.2f} означає праве вирівнювання, мінімальну ширину десять позицій і дві цифри після десяткового роздільника. Звичайний формат без локалізації виводить крапку незалежно від українських регіональних налаштувань. Форматування змінює вигляд результату, а не значення змінної.
Результат виконання:
text
+----------------------------+
| Товар: Блокнот |
| Без ПДВ: 50.00 грн |
| ПДВ 20%: 10.00 грн |
| З ПДВ: 60.00 грн |
+----------------------------+Перевірка обчислення
Порівняйте результат із ручним розрахунком: 50 · 0,20 = 10 грн, 50 + 10 = 60 грн. Для цього прикладу початкова ціна не містить податку: додавання 20 % до ціни й виділення податку з уже кінцевої ціни – різні задачі. Для реальних грошових розрахунків потрібні окремі правила округлення; тут мета полягає в побудові та оформленні першої програми.
Збережіть файл як UTF-8. У Developer PowerShell, відкритій у папці цього прикладу, виконайте:
powershell
cl /nologo /std:c++latest /EHsc /W4 /utf-8 main.cpp
.\main.exeПерший рядок викликає компілятор і компонувальник, другий запускає готовий файл. Якщо збирання завершилося помилкою, спершу виправте її та зберіть знову: старий main.exe може залишитися від попередньої успішної збірки й не відповідати поточному коду.
Приклад 3. Проєкт у Git
Умова. Створити локальний репозиторій невеликого консольного проєкту, зберегти три змістовні коміти, виключити службові файли та навчитися відновлювати одну навмисну зміну, збережену у файлі, але не в коміті.
Створіть у Visual Studio консольний проєкт Workshop в окремій папці для навчальних робіт. Замініть вміст єдиного файла програми:
cpp
#include <print>
int main()
{
std::println("Навчальна майстерня");
std::println("Версія: 1");
return 0;
}Очікуване виведення першої версії:
text
Навчальна майстерня
Версія: 1Зберіть і запустіть програму. У меню Git → Create Git Repository виберіть локальний репозиторій для папки рішення. Віддалений репозиторій для цього прикладу не потрібний. Якщо діалог пропонує початковий коміт, врахуйте його як окремий службовий коміт: три зміни програми нижче все одно мають бути видимі в історії.
Перевірте .gitignore у корені репозиторію. Шаблон Visual Studio може бути довшим; для навчального проєкту мають ігноруватися принаймні такі результати збирання й локальні налаштування:
text
.vs/
x64/
Debug/
Release/
*.obj
*.exe
*.pdb
*.ilk
*.vcxproj.userФайли .cpp, .vcxproj, .vcxproj.filters, рішення .sln або .slnx, README та сам .gitignore зберігають у репозиторії. Правила ігнорування не припиняють відстеження файла, який уже був доданий раніше. Тому перевірте перелік змін до першого коміту. Офіційний опис правил: https://git-scm.com/docs/gitignore.
- У вікні Git Changes перевірте файли, введіть повідомлення
Add workshop programі зафіксуйте початкову програму. - Змініть рядок версії на
Версія: 2та додайте передreturn 0;викликstd::println("Автор: навчальна група");. Зберіть і запустіть програму, перегляньте різницю та створіть комітAdd author line. - Створіть README з призначенням програми, командою збирання та очікуваним виведенням. Збережіть його комітом
Document build and output.
Очікуване виведення другої версії, яка залишається актуальною після додавання README:
text
Навчальна майстерня
Версія: 2
Автор: навчальна групаВідкрийте історію у Git Repository. Повідомлення пояснюють призначення зміни, а коміт з README не змінює виконувану програму. Короткі хеші, імена авторів і час у кожному репозиторії будуть іншими. Перевірити історію й чистоту робочого каталогу також можна командами:
powershell
git log --oneline -3
git status --shortПісля збереження всіх змін друга команда не має друкувати рядків. Якщо варіант передбачає тег, команда git show v1.0 показує позначений ним коміт. Щоб переглянути саме файл із цієї версії без зміни робочого каталогу, використайте git show v1.0:main.cpp; шлях після двокрапки задають від кореня репозиторію, наприклад v1.0:Workshop/main.cpp. Тег має вже існувати; його створення розглянуто в теоретичних відомостях.
Тепер навчально змініть лише текст Версія: 2 на Версія: 999, збережіть файл, але не додавайте його до індексу. Відкрийте термінал саме в папці, де розміщено main.cpp, і перевірте різницю:
powershell
git diff -- main.cppПереконавшись, що це тільки навмисна пробна зміна, відновіть файл:
powershell
git restore -- main.cpp
git diff -- main.cppДругий виклик git diff не виведе відмінностей. Команда git restore без додаткових параметрів бере вміст з індексу; оскільки пробна зміна не індексувалася, повернеться версія 2. Новий коміт при цьому не створюється. Зберіть програму повторно й перевірте її виведення. Документація: https://git-scm.com/docs/git-restore.
Межі відновлення
У цьому досліді відновлюємо один відомий файл і лише навмисну зміну, збережену у файлі, але не в коміті. Перед git restore переглядайте різницю: відкинутий текст, який ніколи не був у коміті, Git зазвичай не зможе повернути. Фіксація змін, відновлення файла та запуск програми – різні дії.