Методична розробка "Початкове програмування мовою С++ для учнів середніх та старших класів загальноосвітніх навчальних закладів"
КОМУНАЛЬНИЙ ЗАКЛАД “ВІННИЦЬКИЙ ТЕХНІЧНИЙ ЛІЦЕЙ”
Методична розробка
“Початкове програмування мовою С++ для учнів середніх та старших класів ЗНЗ”
Частина 1
Підготувала:
Томчук Олена Василівна, вчитель інформатики комунального закладу «Вінницький технічний ліцей»
Вінниця
2025р.
Метою даної методичної розробки є допомога вчителю у підготовці та проведенні уроків з програмування, а також самостійне опанування учнями основ написання програмного коду мовою С++. Пропонуються алгоритми розв’язання типових задач з основних тем початкового програмування, реалізованих мовою програмування С++, наведені готові приклади стандартних програм, спираючись на які можна опанувати більш складні варіанти задач.
Збірник містить практичні матеріали для використання на уроках інформатики, на факультативах, для самопідготовки учнів.
Може використовуватись як вчителями, так і учнями.
Історія мови С++ (Сі-плюс-плюс) почалася з мови С (Сі). Компанія Bell Laboratories на початку 1970-х рр. створила мову С як інструмент розробки операційної системи UNIX. Завдяки лаконічності, потужності та надійним компіляторам ця мова програмування дуже швидко стала однією з найпопулярніших і найпоширеніших. Проте з часом розміри програм і вимоги до них збільшувались, тому можливості мови С та інших мов, подібних до неї, поступово вичерпувалися.
Кризу в програмуванні було подолано за допомогою переходу до об'єктноорієнтованого програмування (ООП). Однією з об'єктно-орієнтованих мов стала мова С++, яку на базі мови С розробив Бйорн Страуструп у кінці 1970-х рр. Пізніше мову С++ було збагачено й стандартизовано. Нащадками мови С++ є мови Java та С#, спеціалізовані для програмування в сучасних комп'ютерних мережах. Ці мови за структурою схожі на С++ і якщо ви будете володіти С++, не важко перейти на Java або C#, і навпаки.
Для розв'язання поставленої задачі засобами мови програмування потрібно:
а) скласти алгоритм дій, який буде виконувати ваша програма для виконання поставленої
задачі, обрати мову програмування, якою ви володієте;
б) написати текст програми у текстовому редакторі та за допомогою компілятора
перекласти код на мову, зрозумілу комп’ютеру.
Для написання програм потрібно встановити середовище розробки IDE (“Integrated Development Environment”) – це програмне забезпечення, яке містить одразу весь необхідний набір інструментів для розробки, компіляції, компонування та тестування коду програм. Для встановлення можна скористатись списком доступних IDE для різних операційних систем:
Для швидкого запуску невеликих програм без встановлення IDE можна скористатись онлайн-компіляторами:
onlinegdb.com cpp.sh online-cpp.com jdoodle.com online-ide.com
Після того як ви визначились з середовищем програмування можна переходити до написання коду. В кінці посібника знаходиться ДОВІДНИК (для мови С++), що містить необхідну довідкову інформацію.
● для кращого сприйняття програмного коду доцільно писати коментарі (в прикладах позначені зеленим кольором), їх програма ігнорує, однорядковий коментар позначається
//, багаторядковий коментар розташовують між символами /* та */
● після кожного оператора (вказівки, команди) в мові С++ обов’язково потрібно ставити знак ; (крапка з комою)
● назви змінних можуть складатись з літер, цифр та знаку підкреслення "_", назва не може починатись з цифри (!), великі і маленькі літери розрізняються, також бажано називати змінні змістовно, наприклад, змінна для позначення кількості яблук може бути названа countApples
● в мові С++ при оголошенні змінної перед назвою потрібно вказати її тип, наприклад, int countApples, double averageMarkStudent тощо. Від типу даних (див. таблицю типів даних) залежить, яких значень можуть набувати величини цього типу, а також операції та функції, які можна застосовувати до величин цього типу. Саме програміст обирає тип кожної величини, що використовується в його програмі
● при оголошенні змінної можна одразу надати їй певне значення, це буде називатись ініціалізація змінної, наприклад, int countApples = 5; // оголошено змінну countApples і надано значення 5
● для виведення на екран інформації використовують оператор cout << ● щоб вивести текст, його потрібно записати в подвійних лапках, наприклад:
cout << "I am student";
● щоб вивести число, арифметичний вираз або змінну, їх пишуть після cout << без лапок, наприклад: cout << 5; cout << 2 + 3;
cout << a; // a – це змінна, значення якої буде виведено
● якщо потрібно вивести декілька об’єктів, то між ними ставиться знак <<, причому пробіли не мають значення, крім пробілів, взятих у подвійні лапки: cout << 5 << "=" << 2+3; // буде надруковано 5=5 cout << 5 << " = " << "2+3"; // буде надруковано 5 = 2+3
● для введення даних з клавіатури використовують оператор cin >>, наприклад, cin >> countApples; // ввести значення змінної countApples
● для введення кількох даних між ними ставиться знак >>, пробіли ігноруються cin >> countApples >> numberStudent; // потрібно ввести два значення
● якщо потрібно присвоїти значення змінній, використовуємо знак «дорівнює»:
countApples = 5; // кількість яблук буде дорівнювати 5
● якщо в програмі є дані, значення яких не повинно змінюватись в процесі виконання програми, їх оголошують як константи. Назву константи пишемо великими літерами,
наприклад: const double PI = 3.14159;
Майже всі програми пишуться на основі трьох базових алгоритмічних структур та їх поєднань. Лінійний алгоритм – це алгоритм, дії у якому виконуються послідовно, одна за одною від початку до кінця. Кожна команда лінійного алгоритму є обов’язковою до виконання. На рисунку за допомогою блок-схеми зображений загальний вигляд лінійного алгоритму.
Лінійні програми не потребують особливих методів програмування. Найчастіше потрібно здійснити введення даних, їх обробку та виведення результату. Частина програми, що обробляє введені дані, може бути математично складною, тобто потребуватиме знання формул або вміння їх придумати. Також потрібно звертати увагу на тип, кількість та межі вхідних та вихідних даних.
|
Завдання та приклад коду |
1. |
Напишіть програму, яка зчитує ціле число та виводить текст, аналогічний наведеному у прикладі. Приклад: Вхідні дані: 45 Вихідні дані: The next number for the number 45 is 46. The previous number for the number 45 is 44. |
|
#include <bits/stdc++.h> // підключення усіх бібліотек using namespace std; int main() { int a; // оголошення змінної cin >> a; // введення змінної cout << "The next number for the number " << a << " is " << a + 1 << "." << endl; cout << "The previous number for the number " << a << " is " << a - 1 << "."; return 0; } |
2. |
Обчислити добуток двох цілих чисел. |
|
#include <bits/stdc++.h> using namespace std; int main() { int a, b; // оголошення змінних long c; cin >> a >> b; // введення змінних c = a * b; cout << c; // виведення добутку return 0; } |
3. |
N школярів ділять K яблук порівну. Залишок, що не ділиться, залишається в кошику. Скільки яблук залишиться у кошику? |
|
#include <bits/stdc++.h> using namespace std; int main() { int n, k; // оголошення змінних cin >> n >> k; // введення змінних cout << k % n; // виведення результата return 0; } |
4. |
Дано трицифрове число. Визначити скільки в ньому сотень, десятків та одиниць. |
|
#include <bits/stdc++.h> using namespace std; int main() { int a; // оголошення змінної cin >> a; // введення змінної cout << "the number of units = " << a % 10 << endl; cout << "number of tens= " << (a / 10) % 10 << endl; cout << "the number of hundreds = " << a / 100 << endl; return 0; } |
5. |
Обчислити площу трикутника за координатами його вершин. |
|
#include <bits/stdc++.h> using namespace std; int main() { double x1, y1, x2, y2, x3, y3, a, b, c, p, s; // оголошення змінних cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3; // введення змінних a = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2)); // обчислення довжини сторони a b = sqrt(pow(x3 - x2, 2) + pow(y3 - y2, 2)); // обчислення довжини сторони b c = sqrt(pow(x3 - x1, 2) + pow(y3 - y1, 2)); // обчислення довжини сторони c p = (a + b + c) / 2; // обчислення півпериметра трикутника s = sqrt(p * (p - a) * (p - b) * (p - c)); // обчислення площі за формулою Герона cout << fixed << setprecision(2) << s; // виведення площі з 2-ма знаками після коми return 0; } |
1. Дано число х. Обчислити значення виразу y = 7х2 – 3х + 6.
Вхідні дані: x = 3.1 |
Вихідні дані: y = 63.97 |
2. Відома ціна 1 кг цукерок, печива і фруктів. Знайти вартість усієї покупки, якщо купили a кг цукерок, b кг печива і c кг фруктів.
3. Дано масу вантажу в кілограмах. Знайти число повних тон.
Вхідні дані: 15120 |
Вихідні дані: 15 |
4. З початку доби пройшло n секунд. Визначити скільки повних годин пройшло з початку доби.
Вхідні дані: 54236 |
Вихідні дані: 15 |
5. Дано двоцифрове число. Визначити:
а) суму та добуток цифр числа;
б) число, утворене перестановкою цифр початкового числа.
6. Дано трицифрове число. Визначити:
а) суму та добуток цифр числа;
б) число, утворене перестановкою першою і третьою цифр початкового числа;
в) чотирицифрове число, отримане дописуванням одиниць в тисячі (наприклад, було 245, стало 5245).
7. Дано 2 дійсних числа. Визначити:
а) середнє арифметичне цих чисел з точністю 2 знака після коми;
б) середнє арифметичне модулів цих чисел з точністю 3 знака після коми.
8. Відомі координати двох точок на площині. Знайти відстань між точками з точністю 2 знака після коми.
9. Відомі основи та висота рівнобедреної трапеції. Визначити її периметр з точністю до 1 знаку після коми;
10. Наталка задумала число. Потім подвоїла його і додала до нього число 7. В результаті було отримано число n. Яке число задумала Наталка спочатку?
11. Дано два числа a та b. Знайдіть гіпотенузу трикутника із заданими катетами.
Вхідні дані: 3 4 |
Вихідні дані: 5.0 |
12. Відомі два моменти часу однієї доби в годинах, хвилинах і секундах. Відомо, що перший момент відбувся раніше, ніж другий. Визначити скільки секунд пройшло між двома моментами.
13. Довжина кільцевої автомобільної дороги 109 кілометрів. Через кожен кілометр стоїть відмітка відстані. Мотоцикліст стартує з нульового кілометра та їде зі швидкістю х кілометрів на годину. На якій відмітці він зупиниться через t годин? Вхідні дані:
Програма одержує на вхід значення х та t. Якщо х > 0, то рух відбувається в бік збільшення чисел на відмітках, якщо значення х < 0, то в бік зменшення чисел на відмітках.
Вихідні дані:
Програма має вивести ціле число від 0 до 108 – номер відмітки, на якій зупиниться мотоцикліст.
Вхідні дані: 60 2 Вхідні дані: -1 1 |
Вихідні дані: 11 Вихідні дані: 108 |
14. Равлик повзе по вертикальній жердині заввишки h метрів, піднімаючись за день на a метрів, а за ніч спускаючись на b метрів. На який день равлик доповзе до вершини жердини?
Вхідні дані:
Програма одержує на вхід натуральні числа h, a, b. Гарантується, що a>b.
Вихідні дані:
Програма має вивести одне натуральне число.
Примітка. Не можна користуватися if та циклами.
Вхідні дані: 10 3 2 Вхідні дані: 20 7 3 |
Вихідні дані: 8 Вихідні дані: 5 |
15. Дано число в межах 4х розрядів. Визначте, чи є його десятковий запис симетричним. Якщо число симетричне, виведіть 1, інакше виведіть 0. Число може мати менше чотирьох знаків, тоді слід вважати, тоді його десятковий запис доповнюється ліворуч незначущими нулями.
Примітка. Не можна користуватися if та циклами.
Вхідні дані:
Ввести число.
Вихідні дані: Вивести відповідь на завдання.
Вхідні дані: 2002 Вхідні дані: 101 Вхідні дані: 110 |
Вихідні дані: 1 Вихідні дані: 0 Вихідні дані: 1 |
Коли для розв’язання задачі лінійного алгоритму недостатньо, застосовують розгалуження, коли в залежності від виконання певних умов програма може піти різними шляхами. Наприклад, якщо сигнал світлофора червоний – треба стояти, жовтий – приготуватись, зелений – йти.
Під умовою розуміють логічний вираз, який містить знаки порівняння (див. таблицю) та величини, що порівнюються. Результат виконання умови – логічне значення true або false. В мові С++ значення true сприймається як 1 (або будь-яке ціле число, відмінне від 0), false сприймається як 0.
{
} |
дія_1; дія_2; … дія_N; |
Інколи під час написання програмного кода виникає ситуація, що декілька дій мають виконуватись як одне ціле, тобто вони утворюють один блок. В мові С++ для створення такого блоку застосовують фігурні дужки (одну дію також можна помістити у фігурні дужки).
Якщо умова істинна (true) – виконуємо дію_1 та йдемо далі по програмі. Якщо умова дає хибний результат (false) – виконуємо дію_2 та ідемо далі по програмі, причому замість однієї дії може бути блок, обмежений фігурними дужками.
Код цього фрагменту може виглядати так:
Аналогом повного розгалуження може бути тернарний оператор. Розглянемо його застосування на прикладі такої задачі – якщо число a більше числа b, вивести a, інакше вивести число b. Через умовний оператор команда буде такою:
if (a>b) cout << a; else cout << b;
Із застосуванням тернарного оператора:
... умова ? дія_1 : дія_2; ... |
... a > b ? cout << a : cout << b; ... |
// вивести на екран // більше зі значень // змінних a i b |
... змінна = умова ? вираз_1 : вираз_2; ... |
... c = (a > b) ? a : b; ... |
// змінній с //присвоюється більше // з чисел a i b |
Якщо умова істинна (true) – виконуємо дію_1 або присвоюємо змінній вираз_1.
Якщо умова хибна (false) – виконуємо дію_2 або присвоюємо змінній вираз_2.
Іноді в програмі є потреба в перевірці декількох умов одразу, тобто потрібно багато разів застосувати умовний оператор if-else. В такому випадку замість створення довгого ланцюжка if-else краще скористатись оператором вибору switch-case.
Загальний вигляд оператора вибору: switch(<вираз>) { case <мітка_1> : <дія_1 або декілька дій>; break; case <мітка_2> : <дія_2 або декілька дій>; break; case <мітка_3> : <дія_3 або декілька дій>; break;
...
case <мітка_N>: <дія_N або декілька дій>; break; default: <дія>;
}
Код цього фрагменту може виглядати так:
Вираз (ціле число або символ) оператора switch порівнюється на відповідність з мітками case. Якщо мітка в case збігається з виразом switch, то виконуються відповідна цьому case дія (набір дій), після чого команда break здійснює вихід з оператора switch.
Якщо жоден case не відповідає виразу switch, то виконуються дія, зазначена після оператора default (якщо він був вказаний), або у разі його відсутності просто вихід зі switch.
Оператор break необхідний для того, щоб перервати виконання switch. Якщо його не використовувати, то вираз switch буде послідовно порівнюватись з усіма мітками, незалежно від того, співпадають вони чи ні.
Через свою реалізацію оператори switch зазвичай більш ефективні, ніж довгі ланцюжки if-else.
|
Завдання та приклад коду |
1. |
Дано два різних дійсних числа. Визначити яке з них більше. |
|
#include <bits/stdc++.h> // приклад повного розгалуження using namespace std; int main() { double a, b; // оголошення змінних cin >> a >> b; // введення змінних if (a > b) cout << a << ">" << b; else cout << b << ">" << a; return 0; } |
2. |
Дано дійсне число. Вивести на екран його модуль, не використовуючи стандартну функцію. |
|
#include <bits/stdc++.h> // приклад неповного розгалуження using namespace std; int main() { double a; // оголошення змінних cin >> a; // введення змінних if (a >= 0) { // якщо число додатне або 0 cout << a; //виводимо число return 0; //вихід з програми } if (a < 0) { // якщо число від’ємне cout << a * (-1); //виводимо число, помножене на -1 return 0; //вихід з програми } } |
3. |
Відомо дві швидкості: одна в кілометрах за годину, друга - в метрах за секунду. Яка швидкість більша? |
|
#include <bits/stdc++.h> // приклад вкладеного розгалуження using namespace std; int main() { double speedKmPerHour, speedMperSecond, speed; // оголошення змінних cin >> speedKmPerHour >> speedMperSecond; // введення змінних speed = speedMperSecond * 3.6; // переводимо швидкість в км/год щоб порівняти if (speedKmPerHour > speed) cout << speedKmPerHour <<"km'/h > " << speedMperSecond << "m'/s"; else if (speedKmPerHour < speed) cout << speedKmPerHour <<"km'/h < " << speedMperSecond << "m'/s"; else cout << speedKmPerHour <<"km'/h = " << speedMperSecond << "m'/s"; return 0; } |
4. |
Дано радіус круга і сторону квадрата. У якої фігури площа більша? |
|
#include <bits/stdc++.h> // приклад використання тернарного оператора using namespace std; int main() { double radiusCircle, sideSquare, areaCircle, areaSquare; // оголошення змінних cin >> radiusCircle >> sideSquare; // введення змінних areaCircle = M_PI * pow(radiusCircle, 2); // площа кола r2 areaSquare = pow(sideSquare, 2); // площа квадрата а2 // тернарний оператор areaSquare >= areaCircle ? cout << "square is more" : cout << "circle is more"; return 0; //вихід з програми } |
5. |
В залежності від номера місяця вивести назву пори року. |
|
#include <bits/stdc++.h> // приклад використання оператора вибору using namespace std; int main() { int weekday; cin >> weekday; switch (weekday) { case 1: case 2: case 12: cout << "Winter"; break; case 3: case 4: case 5: cout << "Spring"; break; case 6: case 7: case 8: cout << "Summer"; break; case 9: case 10: case 11: cout << "Autumn"; break; default: cout << "Error"; } return 0; } |
6. |
Напишіть програму, яка створить випадкове число від 1 до 6. Користувачу потрібно відгадати число. Організуйте невеликий діалог. |
|
#include <bits/stdc++.h> using namespace std; int main() { int n; srand(time(0)); // прив’язка до системного годинника int x = rand() % 6 + 1; // створення випадкового числа в межах від 1 до 6 cout << "Enter a number from 1 to 6 => "; cin >> n; // користувач вводить своє число if (n > x) cout << "Didn't guess, your number is greater"; else if (n < x) cout << "Didn't guess, your number is less "; else cout << "Congratulations! You guessed the number!"; return 0; } |
1. Дано два різних цілих числа. Визначити яке з них менше.
Вхідні дані: x = 3 y = 5 |
Вихідні дані: The number 3 is less than the number 5. |
2. Визначити, чи є число a дільником числа b?
Вхідні дані: a = 3 b = 15 |
Вихідні дані: The number 3 is a divisor of the number 15. |
Вхідні дані: a = 3 b = 10 |
Вихідні дані: The number 208 is not divisible by 18 |
3. Дано двозначне число. Визначити яка із цифр більша - перша чи друга.
4. Дано двозначне число. Визначити чи є сума його цифр двозначним числом.
5. Дано тризначне число. Визначити чи є воно паліндромом, тобто таким числом, десятковий запис якого читається однаково зліва направо і справа наліво.
6. Дано тризначне число. Визначити чи більший заданого числа х добуток його цифр.
7. Перевірити чи належить число x, введене з клавіатури інтервалу [a; b]. Вхідні дані: цілі числа x, a, b. Вихідні дані: "YES" або "NO".
8. Дано три цілих числа a, b, c. Перевірити чи виконується нерівність a < b < c.
9. Дано три дійсних числа a, b, c. Визначити чи рівні хоча б два з них. Вивести "YES" або "NO".
10. Визначити чи є трикутник зі сторонами a, b, c рівностороннім. Вивести "YES" або "NO".
11. Є конверт розмірами а і b мм та прямокутна листівка розмірами с і d мм. Чи поміститься листівка в конверт, якщо необхідний зазор в 1 мм з кожного боку. Вивести "YES" або "NO".
12. Дано двозначне число. Визначити чи містить воно цифру х. Вивести "YES" або "NO".
13. Дано два цілих числа. Скласти програму, яка зменшує перше введене число в два рази, якщо воно за модулем більше другого введеного числа. Вивести обидва числа.
14. Скласти програму для обчислення значення функції z(a):
15. Визначити, чи є задане шестизначне число "щасливим" (сума його перших трьох цифр дорівнює сумі його останніх трьох цифр). Вивести "YES" або "NO".
16. Дано два прямокутника, сторони яких паралельні або перпендикулярні осям координат. Відомі координати лівого нижнього кута кожного з них і довжини їх сторін (всі вхідні дані – натуральні числа). Визначити в скількох точках перетинаються прямокутники. Якщо не перетинаються зовсім – вивести 0, якщо в одній точці – вивести 1, якщо в двох точках – вивести 2, якщо співпадають сторони (повністю чи частково) – вивести "many".
17. В чемпіонаті по футболу команді за виграш нараховують 3 очки, за програш – 0, за нічию
– 1. Відома кількість очок, отриманих командою за гру. Визначити результат гри – вивести ("win", "lose" or "draw").
18. Визначити максимальне і мінімальне значення із трьох різних цілих чисел.
19. Вивести на екран номер чверті координатної площини, у якій лежить точка з координатами (x, y), за умови, що x i y не дорівнюють 0.
20. Відома оцінка учня з інформатики. Визначити та вивести рівень його знань (оцінка 1-3 – "initial level" (початковий), оцінка 4-6 – "medium level" (середній), оцінка 7-9 – "sufficient level" (достатній), оцінка 10-12 – "high level" (високий).
Під циклом розуміють фрагмент кода, що повторюється певну кількість разів. В кожному конкретному випадку кількість повторів буде залежати від виконання чи невиконання умови входу в цикл. Цикли поділяють на декілька видів.
Цикл з передумовою (цикл while) – спочатку перевіряється умова, якщо вона істинна (true) – виконуються команди тіла циклу (одна або декілька), потім знову перевіряється умова. Цикл припиняється щойно умову входу в цикл НЕ буде виконано (false), тоді відбувається вихід з циклу.
Код цього фрагменту може виглядати так:
Цикл з післяумовою (цикл do-while) – спочатку виконуються команди тіла циклу (одна або декілька), а потім перевіряється умова повторення циклу. Якщо вона істинна (true) – команди циклу повторюються, потім знову перевіряється умова. Цикл припиняється щойно умову циклу НЕ буде виконано (false), тоді відбувається вихід з циклу. Основна особливість цього виду циклу – хоча б один раз він виконається обов’язково.
Код цього фрагменту може виглядати так:
Цикл з параметром (цикл for) – найчастіше застосовують, коли відомо, скільки разів потрібно повторити команди циклу, і саме за це зазвичай відповідає параметр циклу.
Спочатку відбувається ініціалізація параметрів циклу (одного або декількох, записаних через кому), потім перевіряється умова циклу, вона може бути як проста, так і складена. Якщо вона істинна (true) – виконуються команди циклу, потім відбувається зміна параметрів і знову
перевіряється умова. Цикл припиняється щойно умову циклу не буде виконано (false), тоді відбудеться вихід з циклу.
Загальний вигляд запису циклу з параметром:
for (<ініціалізація параметрів>;<умова циклу>; <зміна параметрів>) {
...
тіло циклу
...
}
Зауважимо, що кожен з елементів, записаних у круглих дужках може бути присутній або відсутній у разі потреби, або може не бути жодного (для нескінченного циклу), але два знака ;(дві «крапки з комою») мають бути обов’язково!
Код для циклу з параметром може виглядати так:
Зміна параметра циклу відбувається з вказаним кроком, наприклад:
i++ параметр і кожного разу збільшується на 1 (інкремент) i-- параметр і кожного разу зменшується на 1 (декремент) i += 2 параметр і кожного разу збільшується на 2 i *= 2 параметр і кожного разу множиться на 2
Параметр не обов’язково має бути цілого типу, наприклад:
i += 0.5 - параметр і (типу double чи float) кожного разу збільшується на 0.5
Для вирішення деяких завдань пропонуються різні варіанти використання циклів.
Завдання та приклад коду |
|
1. Дано непорожню послідовність цілих чисел, яка закінчуються нулем. Знайти суму всіх чисел послідовності. |
|
#include <bits/stdc++.h> // цикл while #include <bits/stdc++.h> // цикл do-while using namespace std; using namespace std; int main() { int main() { int x = 1, sum = 0; // ініціалізація змінних int x, sum = 0; // оголошення змінних while (x != 0) { // заходимо в цикл поки х ≠ 0 do { // заходимо в цикл cin >> x; // вводимо число cin >> x; // вводимо число sum += x; // додаємо його в суму sum += x; // додаємо його в суму } } while (x != 0); заходимо в цикл поки х ≠ 0 cout << sum; // виводимо суму cout << sum; // виводимо суму return 0; return 0; } } |
|
2. Дано натуральне число n. Знайти ті натуральні числа, квадрат яких не перевищує n. |
|
#include <bits/stdc++.h> // цикл while using namespace std; int main() { int x = 1, n; // ініціалізація змінних cin >> n; // вводимо n while (x*х <= n) { // поки х2 <= n cout << x; // виводимо х x++; // збільшуємо х } return 0; } |
#include <bits/stdc++.h> // цикл do-while using namespace std; int main() { int x = 1, n; // ініціалізація змінних cin >> n; // вводимо n do { // заходимо в цикл cout << x; // виводимо х x++; // збільшуємо х } while (x*х <= n); зайти в цикл поки х2 <= n return 0; } |
3. Послідовність чисел Фібоначчі утворюється так: перше і друге числа послідовності дорівнюють 0 і 1, кожне наступне дорівнює сумі двох попередніх (0, 1, 1, 2, 3, 5, 8, 13, …). Знайти: |
|
а) перше число в послідовності Фібоначчі, яке більше n (значення n вводиться з клавіатури, n > 1); |
|
#include <bits/stdc++.h> // цикл while using namespace std; int main() { int a = 0, b = 1, numFib = 0, n; cin >> n; // вводимо n while (numFib <= n) { // поки numFib <= n numFib = a + b; a = b; b = numFib; } cout << numFib; return 0; } |
#include <bits/stdc++.h> // цикл do-while using namespace std; int main() { int a = 0, b = 1, numFib, n; cin >> n; // вводимо n do { numFib = a + b; a = b; b = numFib; } while (numFib <= n); // поки numFib <= n cout << numFib; return 0; } |
б) суму всіх чисел в послідовності Фібоначчі, які не перевищують 1000. |
||
#include <bits/stdc++.h> // цикл while using namespace std; int main() { int a = 0, b = 1, numFib = a + b, sum = a + b; while (numFib <= 1000) { sum += numFib; a = b; b = numFib; numFib = a + b; } cout << sum; return 0; } |
#include <bits/stdc++.h> // цикл do-while using namespace std; int main() { int a = 0, b = 1, numFib = a + b, sum = a + b; do { sum += numFib; a = b; b = numFib; numFib = a + b; } while (numFib <= 1000); cout << sum; return 0; } |
|
4. Дано натуральне число n. Визначити скільки разів у ньому зустрічається цифра х. |
||
#include <bits/stdc++.h> // цикл while using namespace std; int main() { int n, x, digit, countX = 0; // змінні cin >> n >> x; // вводимо n та x while (n > 0) { // поки число n > 0 digit = n % 10; // остання цифра if (digit == x) countX++; // умова n /= 10; // ділимо націло на 10 } cout << countX; // кількість цифр, рівних х return 0; } |
#include <bits/stdc++.h> // цикл do-while using namespace std; int main() { int n, x, digit, countX = 0; // змінні cin >> n >> x; // вводимо n та x do { digit = n % 10; // остання цифра if (digit == x) countX++; // умова n /= 10; // ділимо націло на 10 } while (n > 0); // поки число n > 0 cout << countX; // кількість цифр, рівних х return 0; } |
|
5. Надрукувати таблицю переведення відстаней з дюймів у сантиметри для значень від 5 до 25 дюймів (1 дюйм = 2,54 см). |
||
#include <bits/stdc++.h> // цикл for using namespace std; int main() { for (int i = 5; i < 26; i++) { cout << i << " inches = " << i * 2.54 << " sm" << endl; } return 0; } |
||
6. Середнє арифметичне усіх цілих чисел від а до b включно (a < b). |
||
#include <bits/stdc++.h> // цикл for using namespace std; int main() { int a, b; double sum = 0, count, average; |
||
cin >> a >> b; count = b – a + 1; // кількість цілих чисел між a i b for (int i = a; i <= b; i++) { sum += i; // знаходимо суму чисел } average = sum / count; // середнє арифметичне cout << average; return 0; } |
||
7. Обчислити суму чисел послідовності 2/3 + 3/4 + 4/5 + … + n / (n+1) за умови цілого n, що більше 2 |
||
#include <bits/stdc++.h> // цикл for using namespace std; int main() { double sum = 0, n; cin >> n; for (double i = 2; i <= n; i++) { sum += i / (i+1); // знаходимо суму } cout << sum; return 0; } |
#include <bits/stdc++.h> // цикл while using namespace std; int main() { double sum = 0, n, i = 2; cin >> n; while (i <= n) { // умова sum += i / (i+1); // знаходимо суму i++; // збільшуємо i } cout << sum; return 0; } |
|
1. Надрукувати “у стовпчик” усі цілі числа від 15 до 35.
2. Надрукувати в один рядок числа 21 20.4 19.8 ... 3.6 3
3. Надрукувати таблицю множення на 9:
9 х 1 = 9
9 х 2 = 18
…
9 х 20 = 180
4. Відомі оцінки з фізики кожного із 30 учнів класу (оцінки – псевдовипадкові числа від 1 до 12). Вивести їх на екран. Визначити середню оцінку. Відповідь округлити до трьох знаків після коми.
5. Відомі дані про вартість кожного з N товарів. Знайти загальну вартість тих товарів, що коштують більше 1000 грн.
6. Відомі оцінки по інформатиці кожного з N учнів класу. Визначити кількість оцінок високого рівня - 10, 11 або 12.
7. Знайти всі натуральні числа, що кратні тринадцяти та менші за 100. Вивести їх в рядок через пробіл.
8. Вивести на екран усі числа від 100 до 200, яка кратні трьом (діляться націло на три).
9. На проміжку від а до b знайти суму цілих додатних чисел, які кратні чотирьом.
10. Дано натуральне число. Отримати всі його дільники.
11. Дано натуральне число. Визначити суму його цифр, які більші 5.
12. Дано непусту послідовність цілих чисел, яка закінчуються нулем. Знайти суму всіх чисел послідовності, яка більші числа х.
13. Дано послідовність ненульових цілих чисел, яка закінчуються нулем. Визначити, скільки разів у цій послідовності змінюється знак. Приклад: у послідовності 21, -5, 12, 60, -10 знак змінюється 3 рази.
14. Дано натуральне число. Визначити його максимальну цифру.
15. Напишіть програму, яка вводить два цілі числа і знаходить їх добуток, не використовуючи операцію множення (числа можуть бути від'ємними). Приклад:
Вхідні дані: 6 12 |
Вихідні дані: 72 |
Вхідні дані: -7 15 |
Вихідні дані: -105 |
Масив – це набір елементів одного типу, що мають однакове ім’я, але відрізняються порядковим номером. Цей номер (індекс) використовують для доступу до елементів масиву. Часто масиви використовують для об’єднання даних одного типу в групу для полегшення їх обробки. Масиви бувають одновимірними, двовимірними та багатовимірними. В цьому розділі будемо працювати з одновимірними масивами.
Загальний вигляд оголошення одновимірного масиву:
<тип_елементів> <назва_масиву>[<розмір_масиву>];
Приклад:
int arrayInt[30]; // оголошено масив з назвою arrayInt з 30 елементів цілого типу
Елементи цього масиву будуть мати номери від 0 до 29.
Зауваження! Нумерація елементів масиву в мові С++ завжди починається з 0
При оголошенні масиву обов’язково вказується його розмір, тому що під час компіляції має бути відомо скільки пам’яті потрібно виділити на збереження масиву.
Розмір масиву = кількість елементів * розмір одного елемента, для наведеного вище прикладу розмір масиву 1200 байт = 30 х 4 байт (тип int - 4 байт). Після оголошення масиву його розмір змінити не можна. Можна вважати це недоліком масивів, але перевагою їх використання є прямий швидкій доступ до його елементів за вказаним порядковим номером.
При оголошенні можна одразу ініціалізувати масив, тобто надати значення його елементам.
Приклад:
int arrayMark[7] = {3, 12, 2, 5, 6, 8, 10};
Якщо розмір масиву більший кількості вказаних елементів, то замість них будуть 0.
Приклад:
int arrayMark[7] = {3, 12, 2}; // перших 3 елементи відомі, замість інших будуть 0.
Якщо розмір масиву менший кількості вказаних елементів, то зайві елементи ігноруються.
Приклад:
int arrayMark[7] = {3, 12, 2, 5, 6, 8, 10, 7, 9, 11}; // елементи 7, 9, 11 будуть ігноруватись
Звертатись до елементів масиву потрібно за їх порядковим номером.
Приклад:
cout << arrayMark[4]; // виведеться елемент номер 4, тобто число 6, бо нумерація з 0
Так само можна змінити значення елемента масиву.
Приклад: arrayMark[4] = 12; // елемент номер 4 отримає значення 12 замість 6
...
int arrayMark[100] = {3, 12, 2, 5, 6, 8, 10};
...
...
int arrayMark[100]; // оголошення масиву на 100 елементів цілого типу int size; // оголошення змінноїcin >> size; //введення її значення, це значення може бути меншим 100 for (int i = 0; i < size; i++) { // цикл з параметром для введення елементів масиву cin >> arrayMark[i]; //користувач вводить елемент масиву з номером і
}
...
...
int arrayMark[100]; // оголошення масиву на 100 елементів цілого типу int size; // оголошення змінноїcin >> size; //введення її значення, це значення може бути меншим 100 for (int i = 0; i < size; i++) { // цикл з параметром для створення елементів масиву arrayMark[i] = i * 3; // значення і-го елементу масиву буде номер, помножений на 3
}
...
Часто, з метою економію часу на введення елементів, а також перевірки програми на різних наборах даних, застосовують випадкові числа, що генеруються самою програмою. Для цього потрібно використати функцію rand(), яка генерує випадкове (псевдовипадкове - кожне число в послідовності здається випадковим щодо попереднього, але вся послідовність не є випадковою) число в межах типу int. Оскільки це може бути велике число, варто застосувати до отриманого числа остачу від ділення на 10, 100, 1000 тощо, що дасть можливість отримати число в потрібних користувачу межах.
Зауваження! Заповнення масиву відбувається автоматично, тому користувач не побачить елементи масиву поки не виведе їх на екран.
Приклад: int a, b, c;
a = rand() % 10; // змінній a буде присвоєно випадкове число в межах від 0 до 9 b = rand() % 100; // змінній b буде присвоєно випадкове число в межах від 0 до 99 c = rand() % 1000; // змінній c буде присвоєно випадкове число в межах від 0 до 999 d = rand() % 35; // змінній d буде присвоєно випадкове число в межах від 0 до 34
Якщо потрібно отримати випадкове число в певному інтервалі, наприклад, від х до y (x<y) включно, то застосовують таку формулу: int a = rand() % (y – x + 1) + x;
Приклад. Заповнимо масив випадковими числами від 1 до 12 включно. Ліва межа x = 1, права межа y = 12, тоді в дужках після rand()% буде 12 – 1 + 1, тобто 12.
...
srand(time(0)); // прив’язка до системного годинника int arrayMark[100]; // оголошення масиву на 100 елементів цілого типа int size; // оголошення змінноїcin >> size; //введення її значення, це значення може бути меншим 100 for (int i = 0; i < size; i++) { // цикл з параметром для створення елементів масиву arrayMark[i] = rand() % 12 + 1; // заповнюємо масив випадковими числами в заданих межах cout << arrayMark[i] << " "; // виводимо елементи масиву на екран (за необхідності)
}
…
Вивести елементи одновимірного масиву можна декількома способами.
1) всі елементи в один ряд підряд один за одним
...
for (int i = 0; i < size; i++) { // цикл з параметром для виведення елементів масиву розміром size cout << arrayMark[i]; // виводимо елементи масиву на екран один за одним
}
...
2) всі елементи в один ряд через пробіл
...
for (int i = 0; i < size; i++) { // цикл з параметром для виведення елементів масиву розміром size cout << arrayMark[i] << " "; // виводимо елементи масиву на екран в один ряд через пробіл
}
...
3) всі елементи в стовпчик
...
for (int i = 0; i < size; i++) { // цикл з параметром для виведення елементів масиву розміром size cout << arrayMark[i] << endl; // виводимо елемент масиву і переходимо на наступний рядок
}
...
Існують класичні алгоритми для роботи з масивами, опишемо деякі з них. В наступних прикладах будемо вважати, що створено масив arrayMark розміром SIZE, який заповнено цілими числами одним зі способів, описаних вище.
1)пошук необхідного елемента, наприклад, числа х. Якщо х знайдено серед елементів масиву, вивести "YES", інакше вивести "NO" (варіанти дій після знаходження або не знаходження можуть бути інші залежно від поставленої задачі).
...
int x; cin >> x; for (int i = 0; i < SIZE; i++) { // цикл з параметром для перебору елементів масиву if (arrayMark[i] == x) { cout << "YES"; // якщо елемент масиву = х, вивести "YES" return 0; // вихід з програми
}
cout << "NO"; // якщо елемент не було знайдено при проходженні по масиву, вивести "NO"
...
...
int maxNum = INT_MIN; // початкове значення максимального елементу робимо мінімальним for (int i = 0; i < SIZE; i++) { // цикл з параметром для перебору елементів масиву if (arrayMark[i] > maxNum) { // якщо елемент масиву більший за максимальний maxNum = arrayMark[i]; // тоді знайдений елемент стає максимальним
}
cout << maxNum; // вивести максимальний елемент масиву
...
...
int minNum = INT_MAX; // початкове значення мінімального елементу робимо максимальним for (int i = 0; i < SIZE; i++) { // цикл з параметром для перебору елементів масиву if (arrayMark[i] < minNum) { // якщо елемент масиву менший за мінімальний minNum = arrayMark[i]; // тоді знайдений елемент стає мінімальним
}
cout << minNum; // вивести мінімальний елемент масиву
...
...
int sumNum = 0; // змінна для збереження суми елементів, початкове значення має бути 0 for (int i = 0; i < SIZE; i++) { // цикл з параметром для перебору елементів масиву sumNum += arrayMark[i]; // додати в суму і-ий елемент масиву
}
cout << sumNum; // вивести суму елементів
...
5) кількість елементів за умовою (наприклад, кількість додатних елементів)
...
int countNum = 0; // змінна для кількості додатних елементів, початкове значення 0 for (int i = 0; i < size; i++) { // цикл з параметром для перебору елементів масиву if (arrayMark[i] > 0) { // якщо елемент масиву додатний countNum++; // збільшуємо кількість додатних елементів масиву
};
}
cout << countNum; // вивести кількість додатних елементів
...
6) сортування масиву (наприклад, за зростанням). Методів сортування є дуже багато, вони відрізняються швидкодією, обсягом використаної пам’яті, варіантами застосування для масивів різних розмірів тощо. Розглянемо деякі найпростіші варіанти сортування.
... // 1 варіант - метод обмінів («бульбашкою»)
for (int i = 0; i < SIZE - 1; i++) { for (int j = 0; j < SIZE - i - 1; j++) {
if (arrayMark[j] > arrayMark[j + 1]) { // якщо попередній елемент більший за наступний int temp = arrayMark[j]; // temp – тимчасова змінна arrayMark[j] = arrayMark[j + 1]; // для обміну значень між двома arrayMark[j + 1] = temp; // елементами масиву arrayMark[j] та arrayMark[j + 1]
}
}
}
... // 2 варіант - метод обмінів («бульбашкою») + функція обміну for (int i = 0; i < SIZE - 1; i++) { for (int j = 0; j < SIZE - i - 1; j++) { if (arrayMark[j] > arrayMark[j + 1]) { swap(arrayMark[j], arrayMark[j + 1]); // функція обміну значень двох елементів масиву
}
}
}
... // 3 варіант - використання бібліотечної функції сортування sort(arrayMark, arrayMark + SIZE); // функція для сортування масиву
...
|
Завдання та приклад коду |
1. |
Скласти програму виведення на екран будь-якого елемента одновимірного масиву за вказаним індексом. |
|
#include <bits/stdc++.h> using namespace std; int main() { int arrayMark[] = {3, 12, 2, 5, 6, 8, 10}; // ініціалізація масиву int num; cout << "Еnter an array element number from 0 to 6 => "; cin >> num; if (num < 0 || num > 6) // якщо номер < 0 або > 6 cout << "Wrong number!"; else |
|
cout << arrayMark [num]; // виведення елемента за вказаним індексом return 0; } |
2. |
Дано масив з N дійсних чисел (N < 100). Усі його елементи зменшити на 20 та вивести результуючий масив. |
|
#include <bits/stdc++.h> using namespace std; int main() { double arrayNumbers[100]; // оголошення масиву на 100 елементів цілого типу int n; cin >> n; // кількість елементів масиву for (int i = 0; i < n; i++) { cin >> arrayNumbers[i]; // заповнення масиву користувачем } for (int i = 0; i < n; i++) { arrayNumbers[i] -= 20; // зменшення кожного елемента на 20 } for (int i = 0; i < n; i++) { cout << arrayNumbers[i] << " "; // виведення масиву в один рядок через пробіл } return 0; } |
3. |
Одновимірний масив призначений для збереження зросту 12 людей. Заповнити масив випадковими цілими значеннями, які лежать в діапазоні від 163 до 190 включно. |
|
#include <bits/stdc++.h> using namespace std; int main() { srand(time(0)); // прив’язка до системного годинника const int SIZE = 12; // оголошення константи для збереження розміру масиву int arrayHeights[SIZE]; // оголошення масиву на 12 елементів цілого типу for (int i = 0; i < SIZE; i++) { // цикл з параметром для створення елементів масиву // за формулою y – x + 1 = 190 - 163 + 1 = 28 arrayHeights [i] = rand() % 28 + 163; // випадкові числа в заданих межах cout << arrayHeights [i] << " "; // виводимо елементи масиву на екран } return 0; } |
4. |
Заповнити одновимірний масив із двадцяти елементів наступним чином: 20 19 … 1 |
|
#include <bits/stdc++.h> using namespace std; int main() { const int SIZE = 20; // оголошення константи для збереження розміру масиву int arrayNumbers[SIZE]; // оголошення масиву for (int i = 0; i < SIZE; i++) { // заповнення масиву |
|
arrayNumbers[i] = SIZE - i; // заповнюємо числами від 20 до 1 } for (int i = 0; i < SIZE; i++) { cout << arrayNumbers[i] << " "; // виводимо елементи масиву на екран } return 0; } |
5. |
Дано одновимірний масив з N (1<N<100) цілих чисел. Розрахувати середнє арифметичне усіх його елементів, кратних числу 5. |
|
#include <bits/stdc++.h> using namespace std; int main() { int arrayNumbers[100]; // оголошення масиву на 100 елементів цілого типу int n, sum = 0, count = 0; cin >> n; // кількість елементів масиву for (int i = 0; i < n; i++) { cin >> arrayNumbers[i]; // заповнення масиву користувачем } for (int i = 0; i < n; i++) { if (arrayNumbers[i] % 5 == 0) { // перебір елементів, шукаємо кратні 5 count++; // збільшуємо кількість sum += arrayNumbers[i]; // додаємо елемент до суми } } double average; average = (double) sum / count; // double – щоб результат не заокруглювався cout << average; return 0; } |
6. |
Дано одновимірний масив з N (1 < N < 100) цілих чисел. Вивести на екран спочатку його елементи з парними номерами, а потім – з непарними. |
|
#include <bits/stdc++.h> using namespace std; int main() { int array[100]; // оголошення масиву int n; cin >> n; // кількість елементів for (int i = 0; i < n; i++) { cin >> array [i]; // вводимо елементи масиву } for (int i = 0; i < n; i++) { if (i % 2 == 0) cout << array[i] << " "; // парні номери } cout << endl; |
|
for (int i = 0; i < n; i++) { if (i % 2 != 0) cout << array[i] << " "; // непарні номери } return 0; } |
7. |
Дано масив цілих чисел (див. приклад 3). Потрібно відсортувати його за спаданням. |
|
#include <bits/stdc++.h> using namespace std; int main() { srand(time(0)); const int SIZE = 12; int arrayHeights[SIZE]; for (int i = 0; i < SIZE; i++) { arrayHeights [i] = rand() % 28 + 163; // заповнення масиву cout << arrayHeights [i] << " "; } cout << endl; for (int i = 0; i < SIZE - 1; i++) { // сортування за спаданням for (int j = 0; j < SIZE - i - 1; j++) { if (arrayHeights [j] < arrayHeights [j + 1]) { swap(arrayHeights [j], arrayHeights [j + 1]); // обмін значень двох елементів } } } for (int i = 0; i < SIZE; i++) { cout << arrayHeights [i] << " "; // результуючий масив } return 0; } |
8. |
Дано натуральне число. Порахувати кількість кожної цифри в цьому числі. |
|
#include <bits/stdc++.h> using namespace std; int main() { long long number; cin >> number; // вводимо число int a[10] = {0}; // оголошуємо масив і заповнюємо його нулями while (number > 0) { // поки наше число > 0 a[number % 10]++; // збільшуємо на 1 елемент масиву з номером, що = останній цифрі number = number / 10; // "відкидаємо" останню цифру числа } for (int i = 0; i <= 9; i++) cout << "digit " << i << " - " << a[i] << endl; // скільки разів цифра зустрічається в числі return 0; } |
1. В масиві зберігаються дані про кількість опадів за кожний день лютого (дані – випадкові числа в межах від 0 до 100 (мм). Визначити загальну кількість опадів за лютий.
2. Дано масив цілих чисел. Вивести:
а) усі парні елементи;
б) усі елементи, які закінчуються нулем;
в) усі елементи масиву, які є двозначними числами;
г) усі елементи масиву, які є тризначними числами;
д) третій, шостий елементи тощо;
е) спочатку його невід’ємні елементи, потім від’ємні.
3. Дано масив цілих чисел. Змінити елементи масиву таким чином:
а) Усі елементи, які закінчуються цифрою 4, зменшити вдвічі.
б) Усі парні елементи замінити на їх квадрати, а непарні подвоїти.
в) Парні елементи збільшити на х, а від елементів з парними номерами відняти y.
4. В масиві зберігається інформація про зріст 25 людей. Визначити, на скільки зріст самої високої людини перевищує зріст самої низької.
5. Відома кількість мешканців, які проживають у кожному з будинків вулиці. Будинки з непарними номерами розташовані на одному боці вулиці, з парними – на іншій. На якій стороні вулиці проживає більше мешканців?
6. Знайти кількість елементів масиву, які більші за своїх "сусідів", тобто попереднього та наступного.
7. Дано масив. Визначити кількість елементів, більших суми всіх елементів масиву, і надрукувати їх номера.
8. Визначити, чи є в одновимірному масиві однакові елементи.
Для роботи з окремими символами в мові С++ є символьний тип даних char. Для роботи з наборами символів використовують символьні масиви та рядки (клас string). Розглянемо особливості використання кожного з названих типів даних.
Змінна типу char займає 1 байт. Кожному символу відповідає цілочисельний код з таблиці ASCII (англ. American Standard Code for Information Interchange). Нижче наведена частина цієї таблиці з розшифровкою кодів символів з 32 по 127. Ця частина є незмінною для усіх країн світу.
Код |
Символ |
Код |
Символ |
Код |
Символ |
32 |
пробіл |
64 |
@ |
96 |
` |
33 |
! |
65 |
A |
97 |
a |
34 |
” |
66 |
B |
98 |
b |
35 |
# |
67 |
C |
99 |
c |
36 |
$ |
68 |
D |
100 |
d |
37 |
% |
69 |
E |
101 |
e |
38 |
& |
70 |
F |
102 |
f |
39 |
’ |
71 |
G |
103 |
g |
40 |
( |
72 |
H |
104 |
h |
41 |
) |
73 |
I |
105 |
i |
42 |
* |
74 |
J |
106 |
j |
43 |
+ |
75 |
K |
107 |
k |
44 |
, |
76 |
L |
108 |
l |
45 |
– |
77 |
M |
109 |
m |
46 |
. |
78 |
N |
110 |
n |
47 |
/ |
79 |
O |
111 |
o |
48 |
0 |
80 |
P |
112 |
p |
49 |
1 |
81 |
Q |
113 |
q |
50 |
2 |
82 |
R |
114 |
r |
51 |
3 |
83 |
S |
115 |
s |
52 |
4 |
84 |
T |
116 |
t |
53 |
5 |
85 |
U |
117 |
u |
54 |
6 |
86 |
V |
118 |
v |
55 |
7 |
87 |
W |
119 |
w |
56 |
8 |
88 |
X |
120 |
x |
57 |
9 |
89 |
Y |
121 |
y |
58 |
: |
90 |
Z |
122 |
z |
59 |
; |
91 |
[ |
123 |
{ |
60 |
< |
92 |
\ |
124 |
| |
61 |
= |
93 |
] |
125 |
} |
62 |
> |
94 |
^ |
126 |
~ |
63 |
? |
95 |
_ |
127 |
DEL |
Наприклад: код літери 'а' – 97, код літери 'b' – 98. Символи завжди вказуються в одинарних лапках. Відповідно до цієї таблиці за вказаним кодом ми можемо вивести відповідний символ, і навпаки, за вказаним символом ми можемо дізнатись його код.
Наводимо приклади відповідних команд:
...
cout << char(97); // буде виведено літеру acout << int(‘a’); // буде виведено число 97
...
Введення та виведення символів у програмі відбувається звичним способом:
...
char ch;// оголошення символьної змінної ch cin >> ch; // введення її з клавіатуриcout << ch; // виведення на екран
...
Зауваження! Якщо оголошено символьну змінну, а користувач введе більше ніж один символ, зайві символи будуть проігноровані, крім першого введеного символу.
У мові C++ є керуючі символи. Вони починаються з символу \ ("бекслеш"), а потім іде певна літера або цифра (див. довідник). Найбільш поширеним керуючим символом в мові С++ є ‘\n’, який позначає символ нового рядка, тобто в місці де зустрінеться цей символ, відбудеться перехід на новий рядок.
Приклад:
... cout << "My name is \n Taras"; ...
|
/* буде виведено My name is Taras */ |
Оскільки символьний тип є цілочисельним, це дає можливість використовувати його в якості параметра циклу, тоді він буде змінюватись згідно розташування символів у таблиці символів.
Приклад:
...
for (char i = 'a'; i <= 'z'; i++) { // параметр циклу i буде набувати значень від 'a' до 'z' включно cout << i << " "; // буде виведено літери латиниці від a до z
} ...
Набір символів у мові С++ можна подати як масив елементів типу char, що закінчуються нуль-термінатором '\0' (нуль-термінатор – це спеціальний символ, ASCII-код якого дорівнює 0, він використовується для позначення кінця рядка). Такий масив можна записати як рядок символів у подвійних лапках, але при оголошенні такого масиву необхідно враховувати наявність у кінці рядка нуль-термінатора, тобто відводити додатковий байт під нього. При ініціалізації довжину масиву символів буде визначено автоматично (тобто можна її не вказувати), а в кінець масиву буде додано '\0'.
Приклад:
#include <bits/stdc++.h> using namespace std; int main() { char mas[6] = "12345"; // якщо вказати mas[5] буде помилка компіляції, можна mas[]return 0;
}
Якщо користувачу потрібно ввести символьний масив, можна організувати його введення за допомогою циклу з посимвольним введенням або ввести його як рядок за допомогою оператора cin >>. При цьому потрібно враховувати, що оператор cin >> зчитує набір символів до першого пробілу або ознаки кінця рядка (клавіша Enter). Для зчитування символьних масивів, що містять пробіли використовують спеціальний метод.
cin.getline(mas, n); – метод для введення масиву символів, що містить пробіли (mas –
назва символьного масиву, в якій зберігаються введені користувачем символи, n – найбільша кількість символів, яку можна записати в масив.
Приклад:
#include <bits/stdc++.h> using namespace std; int main () {
char mas[99]; // оголошення символьного масиву розміром 99 символів cout <<"Enter an array of characters:"<< endl; // виведення повідомлення cin.getline (mas, 99); //введення користувачем символьного масиву cout << mas; // виведення масиву return 0;
}
strlen(mas) |
повертає довжину масиву mas без урахування нуль-символу; |
strcpy(mas1, mas2) |
копіювання символів з масиву mas2 в масив mas1; |
strncpy(mas1, mas2, n) |
копіювання n символів з масиву mas2 в масив mas1, повертається mas1; |
strcat(mas1, mas2) |
зберігає в mas1 результат об'єднання масивів mas1 і mas2; |
strncat(mas1, mas2, n) |
зберігає в mas1 результат об'єднання масиву mas1 і n символів масиву mas2; |
strcmp(mas1, mas2) |
порівнює з урахуванням регістра масиви mas1 і mas2, повертає ціле значення типу int: 0 (якщо масиви збігаються), від'ємне, якщо mas1 < mas2; додатне, якщо mas1 > mas2; |
isalnum(ch) |
повертає true, якщо ch – літера або цифра, інакше – false; |
isalpha(ch) |
повертає true, якщо ch – літера, інакше – false; |
isdigit(ch) |
повертає true, якщо ch – цифра, інакше – false; |
islower(ch) |
повертає true, якщо ch – літера нижнього регістру, інакше – false; |
isupper(ch) |
повертає true, якщо ch – літера верхнього регістру, інакше – false; |
ispunct(ch) |
повертає true, якщо ch – знак пунктуації, інакше – false; |
isspace(ch) |
повертає true, якщо ch – пробіл, інакше – false; |
strchr(mas, ch) |
пошук першого входження символа ch у масив mas. У разі вдалого пошуку повертає покажчик на місце першого входження символу ch. Приклад: cout << strchr(mas, ch); виводить масив mas, починаючи з цього першого входження символа ch. Якщо символ не знайдено, то буде повернуто NULL; |
toupper(ch) |
якщо символ ch – маленька літера латиниці, то функція перетворить її на відповідну велику літеру, інакше – символ залишиться без змін; |
tolower(ch) |
якщо символ ch – велика літера латиниці, то функція перетворить її на відповідну маленьку літеру, інакше – символ залишиться без змін; |
atof(mas) |
перетворює символьний масив s у число типу float, при цьому сам масив має бути числом у вигляді набора цифр, наприклад, char s[4] = "123" – цей масив символів може бути перетворений на число 123 |
atoi(mas) |
перетворює символьний масив mas у число типу int; |
atol(mas) |
перетворює символьний масив mas у число типу long; |
ch – '0' (ch – символ) |
вираз перетворює символ цифри на цифру, тобто якщо є символ '5', то з нього можна отримати цифру 5: int n = ch - '0'; |
getchar() |
повертає символ, зчитаний зі стандартного потока введення. Приклад: char ch = getchar(); // аналогічно: ... char ch; cin >> ch; ... |
putchar(сh) |
виводить символ сh у стандартний потік виведення; // аналогічно: ... cout << ch; ... |
Нагадуємо! При виведенні тексту українською мовою через cout<< для коректного відображення літер кирилиці можна застосувати, наприклад, таку функцію: setlocale(LC_ALL, "ukr"), але для посимвольної обробки кирилиці ця функція НЕ ДОПОМОЖЕ, тому при введенні тексту з клавіатури краще користуватись латиницею
|
Приклад:
#include <bits/stdc++.h> using namespace std; int main() { char mas[] ="little BIG літери 123";
for (int i = 0; i < strlen(mas); i++) { // перебір елементів масиву mas if (islower(mas [i])) // якщо символ масиву є маленькою літерою латиниці
cout << (char)toupper(mas [i]); // або putchar(toupper(mas [і])); - зробити великою і
// вивести else // інакше cout << (char)tolower(mas [i]); // або putchar(tolower(mas [і])); - зробити маленькою і
} // вивести, цифри та інші літери залишаються без змінreturn 0;
}
результат: LITTLE big літери 123
Як і у більшості мов програмування для роботи з рядками у мові C++ є тип даних string, але не як основна частина мови, а як частина Стандартної бібліотеки мови С++, тому він потребує підключення бібліотеки #include<string>. Змінні типу string (рядки), можна оголошувати, ініціалізувати, присвоювати їм значення, змінювати, виводити на екран тощо. Рядки також можуть містити числа, але вони будуть сприйматись як текст, тобто з ними не можна буде виконувати арифметичні операції без застосування спеціальних функцій для конвертації в звичайні числа.
Для виведення рядків застосовують оператор cout <<. Приклад:
...
string st = "Taras Shevchenko"; // або string st("Taras Shevchenko"); cout << st; // виведення рядка
...
Для введення рядків (якщо рядок не містить пробілів) можна застосовувати оператор cin >>.
Приклад:
...
string st; // оголошення змінної cin >> st; // введення рядка без пробілів
// якщо в рядку будуть пробіли, то в змінну st збережуться лише символи до першого пробіла
// всі інші символи ігноруються
...
Для введення рядків, що містять пробіли можна застосовувати функцію getline: getline(cin, st); // cin – потік даних, st – змінна для збереження введеного рядка.
Приклад:
#include <string> #include <iostream> using namespace std; int main() { string st; // оголошення змінної
cout << "Enter a string of characters" << endl; // виведення повідомлення getline (cin, st); // введення користувачем рядка, можна з пробілами cout << st; // виведення рядка return 0;
}
Для додавання рядків можна використати конкатенацію:
... // приклад 1 string st1 = "Taras", st2 = "Shevchenko", st3; //оголошення та ініціалізація змінних st3 = st1 + " " + st2; // додавання рядків cout << st3; // виведення результуючого рядка: Taras Shevchenko
...
... // приклад 2 string st1 = "45", st2 = "25", st3; //оголошення та ініціалізація зміннихst3 = st1 + st2; // додавання рядківcout << st3; // виведення результата: 4525
...
Використаємо для пояснення рядки string st1 = "Taras", st2 = "Shevchenko";
визначення довжини рядка st |
st.length(); st.size(); |
cout << st1; // 5 cout << st2; // 10 |
повне очищення рядка st |
st.clear();
|
рядок st стане порожній |
видалення n символів з рядка st, починаючи з позиції pos |
st.erase(pos, n); |
st2.erase(2, 4); // видалити з рядка st2 чотири // символи починаючи з другого, нумерація з 0 cout << st2; // Shenko |
обмін значень рядків st1 та st2 |
st1.swap(st2); |
cout << st1; // Shevchenko cout << st2; // Taras |
перевірка, чи порожній рядок st |
st1.empty(); |
повертає логічне true (1), якщо рядок порожній, інакше false (0) |
вставлення в рядок st1 рядка st2, починаючи з позиції pos |
st1.insert(pos, st2); |
// вставити рядок st2 в рядок st1 починаючи st1.insert(3, st2); // з третього символа, нумерація з 0 cout << st1; // TarShevchenkoas |
копіювання n символів з рядка st, починаючи з позиції pos |
st.substr(pos, n); |
string st3; //оголошення змінної st3 st3 = st2.substr(4, 3); // копіювати з st2 три символи // починаючи з четвертого і присвоїти їх рядку st3 cout << st3; // che |
пошук позиції першого входження рядка st2 у рядок st1, починаючи з позиції pos
|
st1.find(st2, pos); st1.rfind(st2, pos); різниця у напрямку пошуку - від початку до кінця рядка і навпаки |
повертається індекс (номер елемента, з якого починається входження), якщо рядок st2 не входить у склад рядка st1, то буде повернуто число за межами діапазону значень індексів елементів рядка, у якому здійснюють пошук. string st1 = "Taras Shevchenko", st2 = "Shevchenko"; cout << st1.find(st2, 0); // 6 |
порівняння рядків st1 та st2 (посимвольно згідно таблиці символів) |
st1.compare(st2); якщо перші символи однакові, то коротший рядок вважають меншим; |
string st1 = "abcde", st2 = "abced", st3 = "abcdefgh"; cout << st1.compare(st2); // -1 від’ємне cout << st2.compare(st1); // 1 додатне cout << st1.compare(st1); // 0 cout << st3.compare(st1); // 1 додатне cout << st2.compare(st3); // 1 додатне |
перетворення рядка st типу string на символьний масив |
st.c_str(); |
string st1 = "abcd"; // рядок const char *st2; // символьний покажчик st2 = st1.c_str(); // перетворення рядка st1 на символьний масив st2 |
Завдання та приклад коду |
|
1. Скласти програму, яка запитує ім’я людини та виводить його на екран з привітанням. |
|
// масив символів без пробілів #include <iostream> #include <cstring>
using namespace std; int main() { cout << "What is your name?\n"; char name[50]; cin >> name; // масив символів без пробілів cout << "Hello," << " " << name << "!"; return 0; } |
// рядок без пробілів #include <iostream> #include<string> using namespace std; int main() { cout << "What is your name?\n"; string name; cin >> name; // рядок без пробілів cout << "Hello," << " " << name << "!"; return 0; } |
// масив символів з пробілами #include <iostream> using namespace std; int main() { setlocale(LC_ALL, "uk_UA.UTF-8"); cout << "What is your name?\n"; char name[50]; cin.getline(name, 50); // масив з пробілами cout << "Hello," << " " << name << "!"; return 0; } |
// рядок з пробілами #include <iostream> using namespace std; int main() { setlocale(LC_ALL, "uk_UA.UTF-8"); cout << "What is your name?\n"; string name; // рядок з пробілами getline(cin, name); cout << "Hello," << " " << name << "!"; return 0; } |
2. Дано слово. Визначити, чи однакові у ньому другий і четвертий символи (нагадуємо, що нумерація символів з 0). Увага! Слово написане кирилицею має бути одразу ініціалізоване у програмі або воно має бути введене з клавіатури латиницею. |
|
// масив символів без пробілів #include <iostream> |
// рядок без пробілів #include <iostream> |
using namespace std; int main() { setlocale(LC_ALL, "ukr"); cout << "Enter word: \n"; char word[50]; cin >> word; // латиницею if (word[1] == word[3]) cout << "same letters"; else cout << "not the same letters"; return 0; } |
using namespace std; int main() { setlocale(LC_ALL, "ukr"); cout << "Enter word: \n"; string word; cin >> word; // латиницею if (word[1] == word[3]) cout << "same letters"; else cout << "not the same letters"; return 0; } |
3. Зі слова informatika отримати слово forma. |
|
// 1 спосіб – за допомогою масиву символів #include <bits/stdc++.h> using namespace std; int main() { char word[] = "informatika"; // масив символів cout << word[2] << word[3] << word[4] << word[5] << word[6] << endl; return 0; } |
|
// 2 спосіб – за допомогою рядка #include <bits/stdc++.h> using namespace std; int main() { string word = "informatika"; // рядок cout << word.substr(2, 5); // починаючи з символа номер 2 "вирізати" 5 символів return 0; } |
|
4. Дано речення. Визначити число входжень у нього деякого символу. |
|
// 1 спосіб – за допомогою масиву символів #include <bits/stdc++.h> using namespace std; int main() { setlocale(LC_ALL, "ukr"); cout << "Введіть речення: \n"; char sentence[100]; cin.getline(sentence, 100); // речення латиницею довжиною до 100 символів int sentLen = strlen(sentence); // довжина речення cout << "Введіть символ для пошуку: \n"; char symbol; cin >> symbol; // шуканий символ int countSym = 0; // кількість знайдених символів for (int i = 0; i < sentLen; i++) { // перебір усіх символів речення |
if (sentence[i] == symbol) { // якщо знайдено countSym++; // збільшуємо кількість } } cout << countSym; // кількість входжень символу return 0; } |
// 2 спосіб – за допомогою рядка #include <bits/stdc++.h> using namespace std; int main() { setlocale(LC_ALL, "uk_UA.UTF-8"); cout << "Введіть речення: \n"; string sentence; getline(cin, sentence); // речення латиницею int sentLen = sentence.size(); // довжина речення cout << "Введіть символ для пошуку: \n"; char symbol; cin >> symbol; // шуканий символ int countSym = 0; // кількість знайдених символів for (int i = 0; i < sentLen; i++) { // перебір усіх символів речення if (sentence[i] == symbol) { // якщо знайдено countSym++; // збільшуємо кількість } } cout << countSym; // кількість входжень символу return 0; } |
5. Дано слово. Перевірити чи є воно паліндромом (читається однаково як з початку так і з кінця). |
#include <bits/stdc++.h> using namespace std; int main() { setlocale(LC_ALL, "ukr"); cout << "Введіть слово: \n"; char word[50]; cin >> word; // ввести слово латиницею int lenWord = strlen(word); // довжина слова for (int i = 0; i < lenWord / 2; i++) { // перебір символів до половини слова if (word[i] != word[lenWord - 1 - i]) { // якщо символи не співпали cout << "NO"; return 0; // вихід з програми } } cout << "YES"; // якщо вихід з програми достроково не відбувся |
return 0; } |
6. Порахувати суму цифр в довгому (великому) натуральному числі. Схожа задача вже була представлена в розділі "Програми з циклами". В ній на вході програми подавалось ціле число. Якщо число є дуже великим (навіть таким, що виходить за межі типу), можна подати його у вигляді символьного масиву чи рядка. Тоді програма буде виглядати так: |
#include <bits/stdc++.h> using namespace std; int main() { char number[1000]; // або string number; cin >> number; // вводиться довге число без пробілів int sum = 0; for (int i = 0; i < strlen(number); i++) { // або for (int i = 0; i < number.size(); i++) { sum = sum + number[i] - ’0’; // або sum = sum + number[i] - 48; } cout << sum << endl; return 0; } // кожен символ масиву перетворюється на цифру за допомогою виразу // number[i] - '0' або number[i] - 48 // пояснення: оскільки цей вираз додається до змінної, що є цілим числом, // відбувається неявне перетворення char на int, тобто // код символа - код нуля = цифра // наприклад, символ '5' має код 53, символ '0' має код 48 // тому 53 – 48 = 5 // потім отримана цифра додається в суму |
7. Порахувати кількість кожної цифри в натуральному числі (аналогічно попередній задачі використовуємо символьний масив (рядок) для введення числа). |
#include <bits/stdc++.h> using namespace std; int main() { char number[1000]; // масив для збереження числа, або string number cin >> number; // вводиться число без пробілів int digits[10] = {0}; // масив для збереження кількості кожної цифри в числі, заповнюємо 0 for (int i = 0; i < strlen(number); i++) { // або for (int i = 0; i < number.size(); i++) { digits[number[i] - 48]++; // збільшуємо елемент з номером, що дорівнює цифрі в числі } for (int i = 0; i <= 9; i++) { cout << "digit " << i << " - " << digits[i] << endl; // скільки разів цифра зустрічається в числі } return 0; } // вираз number[i] – 48 неявно перетворює символ number[i] на відповідну цифру |
Увага! В усіх завданнях інформацію вводити латиницею!
1. Дано символ. Змініть регістр символу, якщо він був латинською літерою. Зробіть його великим, якщо він був малою літерою і навпаки. Якщо це не літера, залишити як є.
2. Дано символ. З’ясувати, чи є він цифрою.
3. Скласти програму, яка запитує назву футбольної команди і повторює її на екрані зі словами “... - це чемпіон!”.
4. Дано назву футбольного клуба. Визначити кількість символів у ній.
5. Скласти програму, яка запитує назву літературного твору та прізвище автора, а потім виводить повідомлення “Письменник … - автор твору …” (на місці крапок повинні виводитися відповідні значення).
6. Ввести два прізвища та порівняти, яке з них довше.
7. Дано слово. Визначити чи на початку та в кінці слова одна й та сама літера.
8. Дано речення. Надрукувати всі його літери а.
9. Дано текст. Визначити, скільки у ньому речень.
10. Дано речення. Видалити з нього усі літери а. Вивести результуюче речення.
11. Дано текст. Надрукувати всі цифри, які є в ньому та порахувати їх кількість.
12. Дано текст, в якому є цифри. Знайти їх суму. Знайти максимальну цифру.
13. Дано рядок, що містить пробіли. Знайдіть у ньому найдовше слово, виведіть це слово та його довжину. Якщо таких слів декілька, виведіть перше із них.
14. Юлій Цезар мав свій спосіб шифрування тексту. Кожна літера замінювалась наступною за абеткою через K позицій по колу. Створіть програми шифрування і дешифрування тексту.
Вхідні дані – текстовий рядок та ціле число К (від 1 до 5). Вихідні дані – перетворений текст.
Програми мовою С++ складаються з функцій. Функція — це послідовність команд для виконання певного завдання, яка має свою назву і може повернути певний результат своєї роботи. Під час виконання програми може зустрітись виклик функції — це вираз, який вказує процесору перервати виконання поточної функції і приступити до виконання іншої функції. Коли виконання функції, що викликається, завершено, то процесор відновлює виконання перерваної функції.
Функція, яка обов’язково має бути присутня в кожній програмі – це головна функція main, її структура повторюється в усіх інших функціях, що використовуються в програмі – стандартних (взятих з бібліотек, наприклад, функція для обчислення модуля abs(x), тригонометрична функція sin(x) тощо) чи створених програмістом для зручності, скорочення коду або підвищення ефективності виконання програми. Загальний вигляд функції:
<тип_результату> назва_функції (список int main() { //int – тип результату, main - назва
параметрів) { // в круглих дужках після назви функції має бути ... // список параметрів або він може бути порожній тіло функції int a, b;
... cin >> a >> b; // тіло функції
cout << a + b;
return <результат, що повертається>; return 0; // 0 – результат функції main
} }
Зауваження! Круглі дужки після назви функції обов’язкові незалежно від того має функція параметри чи ні!
Функція завершує свою роботу після повернення результату (одне значення) за допомогою команди return. Якщо функція має виконати певні дії і не повинна нічого повертати (наприклад, функція, що виводить на екран певну інформацію), то типом результату для неї буде void, а слово return не пишемо взагалі або пишемо його без параметра (return;). Розглянемо різні варіанти застосування функції на прикладі визначення парності числа.
опис функції варіант застосування
Функція, що визначає #include<bits/stdc++.h> чи є параметр х парним using namespace std; числом. Якщо так, то // опис функції вона виводить число х void printEven(int x) { // функція не повертає результат на екран if (x % 2 == 0) // якщо парне cout << x << " "; // виведення х void printEven(int x) { }
if (x % 2 == 0) int main() { // головна функція
cout << x << endl; int mas[10] = {12, 34, 25, -4, 0, 23, 7, 1, 567, 8}; // ініціалізація масиву
} for (int i = 0; i < 10; i++) { // перебір елементів масиву
Обидва варіанти програми дадуть один і той самий результат – парні числа з масиву будуть виведені на екран, але за допомогою різних функцій.
В наведених вище прикладах опис функції передував головній функції main. Так роблять коли функція має невеликий за обсягом код. У випадку використання функцій з довгим кодом або декількох функцій в одній програмі доцільніше скористатись прототипом функції - спочатку записується заголовок функції, потім слідує головна функція main, і лише після неї йде повний опис усіх функцій, записаних за допомогою прототипів.
Коли в програмі оголошується змінна, постають питання – чи скрізь у програмі є до неї доступ (де і коли її можна використовувати, тобто область видимості) і коли вона знищується (тривалість життя).
Змінні, визначені всередині блоку, називаються локальними (нагадаємо, блок – це частина коду, обмежена фігурними дужками { ... }, блок може бути самостійною одиницею або бути частиною циклу чи функції). Локальні змінні мають автоматичну тривалість життя: вони створюються в точці оголошення і знищуються при виході з блока (циклу, функції).
Локальні змінні мають локальну область видимості, тобто вони стають доступними («видимими») з місця оголошення і перестають бути доступними після вихода з блока, в якому оголошені.
Будь-який блок може бути частиною іншого зовнішнього блоку. Змінні, які визначені всередині вкладених блоків, знищуються, як тільки завершується вкладений блок. Змінні визначені у зовнішньому блоці є доступними всередині вкладеного блоку.
Коли ми викликаємо функцію, ми можемо передати в неї дані, які вона буде обробляти чи з якими буде взаємодіяти. Для передачі даних застосовують параметри і аргументи функції.
Параметр функції — це змінна, яка отримує значення, що потім використовується в функції. Параметри вказуються при оголошенні функції в круглих дужках з обов’язковим вказанням типу змінної (параметра). Якщо параметрів багато, то вони перераховуються через кому. Якщо їх немає, то вказуються порожні круглі дужки.
І параметри функції, і змінні всередині функції мають локальну область видимості, тобто використовуються тільки всередині функції, в якій вони оголошені.
Аргумент функції — це значення, що передається у функцію. Воно вказується в круглих дужках після назви функції при виклику. Кількість аргументів та їх тип мають збігатися з кількістю та типом параметрів. При виклику функції параметри стають локальними змінними, а значення кожного з аргументів копіюється у відповідний параметр (локальну змінну). Слово «копіюється» важливе, тому що при цьому функція буде працювати з копіями змінних і не буде змінювати їх вихідні значення. І якщо в процесі виконання функції параметри буде змінено, то самі передані аргументи змінено не буде (винятком є передача у функцію масивів, структур і класів).
Іноді потрібно, щоб функція змінила значення переданого аргументу. В цьому випадку потрібно оголосити параметри функції не як звичайні змінні, як посилання. Приклад наведено нижче, але більш детальне пояснення в даному посібнику не передбачено. При виклику функції змінна стане посиланням на аргумент. Оскільки посилання на змінну обробляється точно так же, як і сама змінна, то будь-які зміни, внесені в посилання, призводять до змін вихідного значення аргумента!
Приклад:
функція без зміни аргумента функція зі зміною аргумента #include <iostream> #include <iostream> using namespace std; using namespace std;
void num7(int x) { // х - параметр void num7(int &x) { // х – посилання на аргумент x = 7; // змінюється копія аргумента x = 7; // змінюється аргумент
} }
int main() { int main() { int x = 6; int x = 6;
cout << "x = " << x << endl; // х = 6 cout << "x = " << x << endl; // х = 6 num7(x); // виклик функції, х - аргумент num7(x); // виклик функції, х - аргумент cout << "х = " << x ; // х = 6 cout << "х = " << x; // х = 7 return 0; return 0;
} }
1) Функція — це невелика програма, яку можна записати окремо від головної програми. Це дозволяє розбивати складні завдання на більш прості;
2) Функцію можна викликати багато разів, щоб не дублювати код;
3) Перевірити працездатність функції набагато простіше ніж всю програму, тому достатньо перевірити її один раз і потім повторно використовувати багато разів без необхідності проводити тестування;
4) Якщо змінити функцію, то ці зміни одразу запрацюють скрізь де ми використовуємо цю функцію;
5) Щоб використати функцію, нам потрібно знати її ім’я, вхідні дані (аргументи) та що вона повертає (чи не повертає) як результат. Не потрібно знати, як саме вона працює.
Рекурсивна функція (або просто "рекурсія") в мові C++ – це функція, яка викликає саму себе. Рекурсивні виклики функцій працюють так само, як і звичайні виклики функцій. Але є важлива відмінність – в рекурсивній функції потрібно вказати умову завершення рекурсії, інакше функція виконуватиметься нескінченну кількість разів (фактично до тих пір, поки не закінчиться "пам’ять").
Умова завершення рекурсії — це умова, при якій рекурсивна функція перестане викликати саму себе. В цій умові зазвичай використовується оператор if.
Одним з найбільш відомих математичних рекурсивних алгоритмів є послідовність Фібоначчі. Послідовність Фібоначчі можна побачити навіть в природі: розгалуження дерев, спіраль мушлі, плоди ананасу тощо.
Числа Фібоначчі визначаються наступним чином – кожне число Фібоначчі отримується як сума двох попередніх, крім перших двох, визначених як 0 і 1:
fib(0) = 0, якщо n = 0 fib(1) = 1, якщо n = 1 fib(n) = fib(n - 1) + fib(n - 2), якщо n > 1
0 1 1 2 3 5 8 13 21 ….
Рекурсивна функцію для обчислення n чисел Фібоначчі може виглядати таким чином:
#include <iostream> using namespace std; int fib(int number) { // опис рекурсивної функції if (number == 0) return 0; // умова завершення if (number == 1) return 1; // умова завершення return fib(number - 1) + fib(number - 2);
}
int main() { // головна функція int n; cin >> n; for (int i = 0; i<= n; i++)
cout << fib(i) << " "; // виклик рекурсивної функції return 0;
}
// Результат виконання програми, якщо n = 10: 0 1 1 2 3 5 8 13 21 44 65
Наведемо ще декілька прикладів використання рекурсивних функцій та їх ітераційних аналогів.
Завдання та приклад коду
1. Обчислення факторіалу числа. Факторіал числа n обчислюється за формулою f (n) = 1 · 2 · … · (n - 1) · n, де n >= 1 |
|
Рекурсивна функція |
Ітераційна функція |
#include <iostream> using namespace std;
int fact(int n) { // рекурсивна функція if (n == 1) return 1; // умова завершення рекурсії else return fact(n - 1) * n; // рекурсія з n - 1 }
int main() { // головна функція int n; cin >> n; cout << fact(n); // виклик функції return 0; } |
#include <iostream> using namespace std;
long long fact(int n) { // ітераційна функція long long product = 1; for (int i = 1; i <= n; i++) { product = product * i; // добуток від 1 до n } return product; }
int main() { // головна функція int n; cin >> n; cout << fact(n); // виклик функції return 0; } |
2. Знайти найбільший спільний дільник двох чисел за алгоритмом Евкліда. |
|
#include<bits/stdc++.h> #include <bits/stdc++.h> using namespace std; using namespace std; int MaxDiv (int n, int m){ // рекурсивна функція int MaxDiv(int n, int m) { // ітераційна функція if (n == m) // умова завершення рекурсії while (n != m) { return n; if (n > m) n = n - m; else if (n > m) else m = m - n; return MaxDiv (n-m, m); } else return MaxDiv (n, m - n); return n; // результат, що повертається } }
int main(){ // головна функція int main() { // головна функція int a, b; int a, b; cin >> a >> b; cin >> a >> b; cout << MaxDiv(a,b); // виклик функції cout << MaxDiv(a, b); // виклик функції return 0; return 0; } } |
|
3. Дано натуральне число n. Вивести його цифри в зворотному порядку. |
|
#include<iostream> using namespace std; void Revers(long long N) { // рекурсивна функція if (N < 10) cout << N; // завершення рекурсії else { cout << N % 10; |
#include <iostream> using namespace std; void Revers(long long n) { // ітераційна функція while (n > 0) { cout << n % 10; n /= 10; |
Revers(N / 10); } } int main() { // головна функція long long x; cin >> x; Revers(x); // виклик функції return 0; } |
} }
int main() { // головна функція long long x; cin >> x; Revers(x); // виклик функції return 0; } |
4. Дано число в десятковій системі числення. Перевести його у двійкову систему числення |
|
#include<bits/stdc++.h> using namespace std;
void printBin(int n) { // рекурсивна функція if (n == 0) return; // завершення рекурсії printBin(n / 2); cout << n % 2; } int main(){// головна функція int n; cin >> n; printBin(n); // виклик функції }
|
#include <bits/stdc++.h> using namespace std;
void printBin(int n) { // ітераційна функція int arrRemainders[20]; // масив для остач int i = 0; while (n > 0) { arrRemainders[i] = n % 2; n /= 2; if (n > 0) i++; } for (; i >= 0; i--) { cout << arrRemainders[i]; } } int main() { // головна функція int n; cin >> n; printBin(n); // виклик функції } |
5. "Ханойські вежі". Маємо три стрижні та піраміду з N дисків різного діаметра на 1 стрижні. Потрібно переставити диски з 1- го стрижня на 3-й згідно таких правил: за один крок можна брати лише один диск, не можна більший диск накладати на менший, можна використовувати допоміжний стрижень. Вивести послідовність дій (послідовність номерів стрижнів). |
|
#include<bits/stdc++.h> using namespace std; // рекурсивна функція void Hanoi (int n, int k, int m) { // n - кількість дисків, k - звідки, m - куда int p; // номер допоміжного стрижня // 6 шість варіантів перестановок, 3 стрижні => 1 + 2 + 3 = 6 p = 6 - k - m; if (n == 0) return; // умова завершення рекурсії Hanoi (n - 1, k, p); // переносимо n-1 дисків з стрижня k на допоміжний стрижень p |
|
cout << k << " -> " << m << endl; // перенесення нижнього диска Hanoi (n - 1, p, m); // n-1 дисків з допоміжного стрижня p на потрібний стрижень m } int main(){ // головна функція int countDisks; //кількість дисків cin >> countDisks; Hanoi(countDisks, 1, 3); //перенести countDisks дисків з 1 на 3 стрижень } |
Дуже часто виникає питання – навіщо використовувати рекурсивну функцію, якщо задачу можна виконати за допомогою ітерацій (використовуючи цикл). Відповідь на нього може бути така: в деяких випадках рекурсивна функція буває набагато простішою як для написання, так і для читання. Наприклад, функцію обчислення n-го числа Фібоначчі можна написати і за допомогою ітерацій, але це складніше.
Ітеративні функції майже завжди більш ефективні, ніж аналогічні рекурсивні. Кожного разу при виконанні рекурсивної функції, витрачається певна кількість ресурсів на додавання і витягування даних зі стеку (області пам'яті). Але іноді рекурсивна реалізація може бути простішою, особливо, якщо алгоритм не вимагає занадто багато часу для пошуку рішення.
Загалом, рекурсія є хорошим вибором, якщо виконується більшість з наступних тверджень:
● рекурсивний код набагато простіший;
● глибину рекурсії можна обмежити;
● ітеративний алгоритм вимагає управління стеком даних; ● цей код напряму не впливає на продуктивність програми.
Рекомендується використовувати ітерацію замість рекурсії в тих випадках, коли це дійсно практичніше. Але якщо рекурсивний алгоритм простіше реалізувати, то є сенс почати з рекурсії, а потім вже оптимізувати код в ітеративний алгоритм.
|
Завдання та приклад коду |
1. |
Скласти програму з використанням функції для знаходження найбільшого спільного дільника (НСД) двох чисел і використати її для n пар чисел. |
|
#include <iostream> using namespace std;
int nsd(int a, int b) { // функція nsd з двома параметрами // алгоритм Евкліда – від більшого віднімаємо менше, поки не будуть рівні while (a != b) { if (a > b) a -= b; // a = a – b; else b -= a; // b = b – a; |
|
} return a; // результат, що повертає функція }
int main() { // головна функція main int n, x, y; cout << "Enter n => "; cin >> n; // кількість пар чисел for (int i = 1; i <= n; i++) { cout << "Enter 2 numbers => "; cin >> x >> y; // введення двох чисел для знаходження їх НСД cout << "NSD " << x << " and " << y << " = " << nsd(x, y) << endl; // виклик функції } return 0; } |
2. |
Знайти периметр трикутника, заданого координатами своїх вершин. Використати функцію для розрахунку довжини відрізка за координатами його кінців. |
|
#include <bits/stdc++.h> using namespace std;
using db = double; // псевдонім db для типу double, або typedef double db;
db lenSegment(db a1, db b1, db a2, db b2) { // функція для довжини відрізка db len; len = sqrt((a1 - a2) * (a1 - a2) + (b1 - b2) * (b1 - b2)); return len; // результат, що повертає функція }
int main() { // головна функція main db x1, y1, x2, y2, x3, y3; cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3; // координати вершин трикутника db a, b, c; a = lenSegment(x1, y1, x2, y2); // довжина сторони b = lenSegment(x2, y2, x3, y3); // довжина сторони c = lenSegment(x1, y1, x2, y2); // довжина сторони cout << a + b + c; // периметр return 0; } |
3. |
Знайти всі трицифрові прості числа. Застосувати функцію, що перевіряє чи є число простим (просте число – це натуральне число, яке має рівно два різні натуральні дільники - 1 і саме число). |
|
#include <bits/stdc++.h> using namespace std;
|
|
bool isPrime(int); // прототип функції
int main() { for (int i = 100; i < 1000; i++) { if (isPrime(i)) cout << i << " "; // виклик функції з відповіддю true або false } return 0; }
bool isPrime(int n) { // функція для перевірки чи є число n простим // Якщо число = 0 або 1 або ділиться на 2, то воно не є простим if (n == 0 || n == 1 || n % 2 == 0) return false; for (int i = 3; i * i <= n; i += 2) { if (n % i == 0) return false; } return true; } |
4. |
Дано два натуральні числа. Визначити у якому з чисел сума цифр більше. Застосувати функцію розрахунку суми цифр натурального числа. |
|
#include <bits/stdc++.h> using namespace std;
int sumDigits(int n) { // функція для обчислення суми цифр числа int sum = 0; while (n != 0) { sum += n % 10; n /= 10; } return sum; // повернення результату – суми цифр числа }
int main() { // головна функція setlocale(LC_ALL, "uk_UA.UTF-8"); int num1, num2; cin >> num1 >> num2; int sum1, sum2; sum1 = sumDigits(num1); // виклик функції для числа num1 sum2 = sumDigits(num2); // виклик функції для числа num2 if (sum1 > sum2) cout << "Сума цифр " << num1 << " > суми цифр " << num2; else if (sum1 < sum2) cout << "Сума цифр " << num1 << " < суми цифр " << num2; |
1. Написати програму, в якій застосовується функція, яка перетворює значення в градусах у радіани.
2. Написати програму, в якій застосовується функція, яка обчислює площу кола за заданим радіусом
3. Написати програму, в якій застосовується функція, яка перевіряє чи є задане число парним.
4. Написати програму, в якій застосовується функція, яка приймає два числа і повертає більше з них.
5. Написати програму, в якій застосовується функція, яка обчислює середнє арифметичне двох чисел.
6. Дано два натуральні числа. З'ясувати, у якому з них більша кількість цифр. Застосувати функцію для обчислення кількості цифр натурального числа.
7. Знайти всі "щасливі" чотиризначні числа та вивести їх на екран. "Щасливим" називають таке чотиризначне число, в якому сума його перших двох цифр дорівнює сумі його останніх двох цифр. Застосувати функцію для розрахунку суми цифр двозначного числа.
8. Дано сторони двох трикутників. Знайти їх периметри та площі. Застосувати функції для розрахунку периметра та площі трикутника.
9. Дано два масиви цілих чисел по N штук в кожному. Знайти кількість парних чисел у першому масиві та кількість непарних у другому масиві. Застосувати функцію, що дозволяє розпізнавати парні числа.
10. Написати програму, в якій застосовується функція, яка знаходить мінімальний елемент у масиві.
11. Написати програму, в якій застосовується функція, яка знаходить максимальний елемент у масиві.
12. Написати програму, в якій застосовується функція, яка сортує масив у порядку зростання.
13. Написати програму, в якій застосовується функція, яка обчислює середнє арифметичне елементів масиву.
14. Дано три слова. Перевірити чи є серед них паліндроми, тобто такі що читаються однаково в обидва боки. Застосувати функцію, що дозволяє розпізнавати слова-паліндроми.
15. Написати програму, в якій застосовується рекурсивна функція для обчислення факторіалу числа.
16. Написати програму, в якій застосовується функція, яка виводить усі прості числа до заданого числа N.
17. Написати програму, в якій застосовується рекурсивна функція, яка обчислює n-е число Фібоначчі.
18. Написати програму, в якій застосовується функція для обчисленняНСК (найменшого спільного кратного) двох натуральних чисел (щоб знайти НСК для чисел a і b, потрібно їх добуток поділити на їх НСД (найбільший спільний дільник). Написати функцію знаходження НСК двох чисел за допомогою функції знаходження НСД цих чисел.
19. Написати програму, в якій застосовується функція, яка робить зворотній запис числа (наприклад, з 12345 повертає 54321). Застосувати рекурсивну функцію.
20. Написати програму, в якій застосовується функція Число Армстронга: Написати функцію, яка перевіряє, чи є число числом Армстронга (приклад: 153 = 1^3 + 5^3 + 3^3).
21. Написати програму-довідник для площ різних геометричних фігур. Для кожної фігури створити функцію для знаходження її площі. Організувати діалог з користувачем.
Кожна програма на С++ містить директиви препроцесора #include. Вони необхідні для включення у програму певних файлів (бібліотек) під час компіляції. Наведемо приклади застосування деяких бібліотек.
Для виведення на екран тексту за допомогою cout << або введення даних за допомогою cin >> необхідно підключити бібліотеку #include<iostream> (input-output streams – вхіднівихідні потоки даних).
Для застосування математичних функцій – бібліотека #include<cmath>.
Для керування форматом виведення – бібліотека #include<iomanip>.
Для роботи з символами – бібліотека #include<cstring>.
Для роботи з рядками – бібліотека #include<string>.
Для підключення всіх бібліотек – #include<bits/stdc++.h>, якщо немає обмежень по використанню пам’яті.
Також потрібно записати «using-директиву» using namespace std; за допомогою якої ми підключаємо всі імена з простору імен std. Простір імен (namespace) – це оголошувана область, яка необхідна для того, щоб уникнути конфліктів імен ідентифікаторів.
початок і завершення стандартної програми мовою С++
return – повертає результат виконання головної функції main, число 0 означає, що виконання програми було успішним і завершено без помилок |
#include <bits/stdc++.h> // підключення бібліотек using namespace std; // підключення простору імен std int main() { … // тіло програми return 0; // оператор, що завершує програму } |
введення даних з клавіатури |
cin >> … ; cin >> … >> … >> … ; |
виведення даних на екран |
cout << … ; cout << … << … << … ; |
перехід на новий рядок перехід на новий рядок (інший спосіб) |
cout << endl; // end line cout << "\n"; |
спеціальні символи (беруть у подвійні лапки), переважно використовують в текстових рядках |
\n перехід на новий рядок \t символ горизонтальної табуляції (відступу) \\ символ «зворотний слеш» \? знак питання \' одинарні лапки \" подвійні лапки \0 нуль-термінатор (позначка кінця символьного масиву) |
приведення до типу int |
(int) x; |
приведення до типу double |
(double) x; |
модифікатор формату виведення setw, використовують для керування шириною поля, тобто регулювання кількості символів, що займе виведена змінна (потрібна бібліотека #include<iomanip>) |
cout << setw(5) << x; // для х ширина поля буде 5 |
фіксована кількість знаків після коми при виведенні числа (вказується в круглих дужках) |
double a; // оголошення змінної а a = 3.1415; // присвоєння значення cout << fixed << setprecision(2) << a; // 3.14 |
число пі |
M_PI // 3.141592 |
максимальне ціле (залежить від архітектури ПК)
|
INT_MAX // 2147483647 INT8_MAX // 127 INT16_MAX // 32767 INT32_MAX // 2147483647 INT64_MAX // 9223372036854775807 |
мінімальне ціле (залежить від архітектури ПК)
|
INT_MIN // -2147483648 INT8_MIN // -128 INT16_MIN // -32768 INT32_MIN // -2147483648 INT64_MIN // -9223372036854775808 |
при введенні та виведенні тексту українською мовою для коректного відображення літер кирилиці слід застосувати функцію setlocale(LC_ALL, "ukr"); але для посимвольної обробки кирилиці ця функція НЕ ДОПОМОЖЕ, тому при введенні тексту з клавіатури краще користуватись латиницею |
... setlocale(LC_ALL, "ukr"); cout << "Тарас Шевченко"; // буде виведено кирилицею ... |
|
|
приклад результату при застосуванні операції |
додавання |
+ |
// 2 + 3 = 5 |
віднімання |
- |
// 15 – 5 = 10 |
множення |
* |
// 3 * 9 = 27 |
ділення (якщо хоча б одне з чисел дійсне, результат - дійсне число) |
/ |
// 5.5 / 1.1 = 5.0 // 45 / 9.0 = 5.0 |
ділення націло (для цілих чисел, результат – ціле число, дробова частина відкидається) |
/ |
// 10 / 3 = 3 // 27 / 5 = 5 |
|
|
// 5 / 6 = 0 |
остача від ділення націло (використовується тільки для цілих чисел), можна використати для перевірки парності числа – якщо остача від ділення на 2 дорівнює 0, то число х парне і навпаки |
% |
// 10 % 3 = 1 // 5 % 6 = 5
// х % 2 = 0 або 1 |
інкремент (збільшення на 1) |
х++ або ++х |
або х = х + 1 |
декремент (зменшення на 1) |
х-- або --х |
або х = х - 1 |
команди присвоювання (варіанти запису) |
x = x + y |
або x += y |
x = x – y |
або x -= y |
|
x = x * y |
або x *= y |
|
x = x / y |
або x /= y |
|
x = x % y |
або x %= y |
|
побітовий зсув праворуч (x / 2y) |
x >> y |
// 17 >> 2 = 4 |
побітовий зсув ліворуч (x * 2y) |
x >> y |
// 5 << 2 = 20 |
Для використання математичних функцій потрібно підключити бібліотеку
#include<cmath>
модуль цілого числа x |
abs(x) |
cout << abs(-6); // 6 |
модуль дійсного числа x |
fabs(x) |
cout << fabs(-6.3); // 6.3 |
x в степені y (xy) |
pow(x, y) |
cout << pow(2, 3); // 8 |
квадратний корінь з х |
sqrt(х) |
cout << sqrt(9); // 3.0 |
округлення до найближчого цілого |
round(x) |
cout << round(-4.8); // -5 |
ціла частина числа, результат – дробовий |
int(x) |
cout << int(-4.8); // -4.0 |
ціла частина числа, результат – цілий |
trunc(x) |
cout << trunc(-4.8); // -4 |
дробова частина числа |
frac(x) |
cout << frac(-4.8); // -0.8 |
експонента (ех = 2.7х) |
exp(x) |
cout << exp(3); // 2.73 |
натуральний логарифм |
ln(x) |
cout << ln(5); // 1.61 |
синус кута в радіанах |
sin(x) |
cout << sin(10); // -0.54 |
косинус кута в радіанах |
cos(x) |
cout << cos(10); // -0.84 |
тангенс кута в радіанах |
tan(x) |
cout << tan(10); // 0.65 |
генерація псевдовипадкового числа (перед застосуванням функції необхідно використати оператор srand(time(0)); який створить «стартове» число послідовності, прив’язане до системного годинника, також потрібно підключити бібліотеки #include<ctime> та #include<cstdlib>) |
rand() |
генерується випадкове число в межах цілого типу даних від 0 до 2147483647 |
розмір змінної в пам’яті ПК (в байтах) |
sizeof(x) |
int x; cout << sizeof(x); // 4 |
обмін значень двох змінних (бібліотека #include<algorithm>) |
swap(x, y) |
int x = 5, y = 3; swap(x, y); // обмін cout << x << " " << y; // 3 5 |
ввести дані в змінну х |
cin >> x; |
ввести дані в змінні x, y, z |
cin >> x >> y >> z; |
вивести значення змінної x |
cout << x; |
вивести значення змінних x, y, z |
cout << x << y << z; |
вивести значення змінних x, y через пробіл |
cout << x << " " << y; |
вивести значення змінних x, y в стовпчик |
cout << x << endl << y; |
вивести результат обчислення виразу, наприклад, x + y |
cout << x + y; |
вивести число, наприклад, 5 |
cout << 5; |
вивести результат обчислення, наприклад, 2+3 |
cout << 2 + 3; |
вивести текстовий рядок, наприклад, Hello! |
cout << "Hello!"; |
Діапазони і розміри типів даних можуть варіюватися в залежності від компілятора і платформи, але вказані типи найчастіше використовуються на сучасних платформах з 32- і 64- бітною архітектурою.
Назва |
Позначення |
Діапазон значень |
Розмір, байт |
Цілочисельні типи |
|
||
Логічний (булевий) |
bool |
true (істина) або false (неправда або 0) |
1
|
Символьний (байт) |
char |
від –128 до +127 |
1 |
Символьний (байт без знаку) |
unsigned char |
від 0 до 255 |
1 |
Коротке ціле |
short |
від -32768 до 32767 |
2 |
Коротке ціле без знаку |
unsigned short |
від 0 до 65535 |
2 |
Ціле
|
int |
від – 2147483648 до + 2147483647 |
4
|
Ціле без знаку |
unsigned int |
від 0 до 4294967295 |
4 |
Довге ціле |
long |
від -2147483648 до 2147483647 (4 байт) |
4 |
Довге ціле без знаку |
unsigned long |
від 0 до 4294967295 |
4 |
Довге довге ціле |
long long |
від -9223372036854775808 до 9223372036854775807 |
8 |
Довге довге ціле без знаку |
unsigned long long |
від 0 до 8446744073709551615 |
8 |
Типи з плаваючою комою (крапкою) |
|
||
Дійсне число одинарної точності (число з плаваючою комою) |
float |
від ±2.9е-39 до ±1.7е+38 (7 значущих цифр) |
4
|
Дійсне число подвійної точності (число з плаваючою комою) |
double |
від ±5.0е-308 до ±1.7е+308 (15 значущих цифр) |
8 |
Дійсне число більшої точності |
long double |
від ±3.4e-4932 до ±1.1e+4932 |
10
|
Ключове слово typedef дозволяє програмісту створити псевдонім (інше ім’я) для будьякого типу даних і використовувати його замість фактичного імені типу. typedef не визначає новий тип даних, це просто псевдонім для вже існуючого типу. Його можна використовувати скрізь, де використовується звичайний тип.
Приклад:
...
typedef long long ll; // скрізь, де потрібно використати тип long long можна писати ll typedef double db; // замість double можна писати db;
int main() { ll number; // замість long long number db suma; // замість double suma;
... }
Починаючи з С++11 потрібно користуватись іншим виразом:
using db = double; // використовуємо db в якості псевдоніма для типа double Ці два способи функціонально еквівалентні.
Знаки порівняння:
> |
більше |
5 > 3 |
істина (true) |
< |
менше |
5 < 3 |
хиба (false) |
>= |
більше або дорівнює |
5 >= 3 |
істина (true) |
<= |
менше або дорівнює |
5 <=3 |
хиба (false) |
!= |
не дорівнює |
5 != 3 |
істина (true) |
== |
дорівнює |
5 == 3 |
хиба (false) |
Зауваження! Пробіл між подвійними знаками (наприклад, >=) ставити не можна, вони йдуть разом як
одне ціле! Два знака == це порівняння, один знак = це присвоєння значення змінній)
! – логічне НЕ (заперечення)
&& - логічне І (кон’юнкція)
| | - логічне АБО (диз’юнкція)
^ - виключне АБО
Таблиця логічних операцій (1 – true, 0 – false)
X |
Y |
X && Y |
X || Y |
X ^ Y |
!X |
1 |
1 |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
Умова може бути як простою, так і складеною. Складена умова будується з простих умов між якими стоять знаки логічних операцій.
Приклад 1: x = 5; y = 3;
(x < y) - проста умова, яка дає false (0), тому що вона не виконується, бо 5 > 3
(x > y) - проста умова, яка дає true (1), тому що вона виконується, бо 5 > 3
(x == y) - проста умова, яка дає false (0), тому що вона не виконується, бо 5 не дорівнює
3
(x != y) - проста умова, яка дає true (1), тому що вона виконується, бо 5 не дорівнює 3
Приклад 2: x = 5; y = 3;
(x > y) && !(y > 0) – складена умова, яка дає результуючий false (0), тому що кон’юнкція передбачає true для обох виразів, (x > y) – true, (y > 0) – true, !(y > 0) – false.
1. Практикум програмування Python/C++ на e-olymp.com (збірник задач з рекомендаціями до їх розв’язання)/ С.В.Матвійчук, С.С.Жуковський – Житомир: Вид. О. О. Євенок, 2019. – 232с.
2. Сайт https://acode.com.ua/uroki-po-cpp/
3. Сайт https://cherto4ka.xyz/category/програмування-c/
4. Сайт https://basecamp.eolymp.com/uk
5. Встановлення Visual Studio Community 2022
1.3. КОРОТКІ ПОЯСНЕННЯ ДО НАПИСАННЯ ПРОГРАМ........................................ 3
2.2. ЗАВДАННЯ ДЛЯ САМОСТІЙНОГО ВИКОНАННЯ............................................. 5
3.5. ПРИКЛАДИ ПРОГРАМ З РОЗГАЛУЖЕННЯМИ.................................................. 11
3.6. ЗАВДАННЯ ДЛЯ САМОСТІЙНОГО ВИКОНАННЯ........................................... 13
4.1. ЦИКЛ З ПЕРЕДУМОВОЮ (ЦИКЛ WHILE)........................................................ 15
4.2. ЦИКЛ З ПІСЛЯУМОВОЮ (ЦИКЛ DO-WHILE).................................................. 16
4.5. ЗАВДАННЯ ДЛЯ САМОСТІЙНОГО ВИКОНАННЯ........................................... 21
5.1. СПОСОБИ СТВОРЕННЯ ОДНОВИМІРНОГО МАСИВУ................................... 24
5.2. ВИВЕДЕННЯ ЕЛЕМЕНТІВ ОДНОВИМІРНОГО МАСИВУ............................... 25
5.3. КЛАСИЧНІ АЛГОРИТМИ РОБОТИ З МАСИВАМИ........................................... 25
5.4. ПРИКЛАДИ ПРОГРАМ З МАСИВАМИ................................................................ 27
5.5. ЗАВДАННЯ ДЛЯ САМОСТІЙНОГО ВИКОНАННЯ........................................... 31
6. ПРОГРАМИ З СИМВОЛАМИ ТА РЯДКАМИ............................................................. 32
6.3. ОСНОВНІ ФУНКЦІЇ ДЛЯ РОБОТИ З СИМВОЛАМИ ТА СИМВОЛЬНИМИ .....
6.6. ПРИКЛАДИ ПРОГРАМ З СИМВОЛАМИ ТА РЯДКАМИ................................... 38
6.7. ЗАВДАННЯ ДЛЯ САМОСТІЙНОГО ВИКОНАННЯ........................................... 42
7.3. ПЕРЕВАГИ ВИКОРИСТАННЯ ФУНКЦІЙ............................................................ 46
7.5. ПРИКЛАДИ ПРОГРАМ З ВИКОРИСТАННЯМ ФУНКЦІЙ................................ 50
7.6. ЗАВДАННЯ ДЛЯ САМОСТІЙНОГО ВИКОНАННЯ........................................... 54
8.3. ОСНОВНІ КОМАНДИ В ЛІНІЙНИХ ПРОГРАМАХ............................................ 59
8.5. ОСНОВИ РОБОТИ З УМОВАМИ ТА УМОВНИМИ ВИРАЗАМИ..................... 60