Лабораторна робота 1

Розробка алгоритмів

1 Завдання на лабораторну роботу

1.1 Реалізація алгоритму з розгалуженням

Реалізувати у вигляді діаграми діяльності алгоритм розв'язання квадратного рівняння. Алгоритм повинен включати всі можливі варіанти вихідних даних. Зокрема, слід перевіряти дискримінант, а також передбачити перевірку, чи рівняння є квадратним. Якщо рівняння виродилося в лінійне, слід передбачити знаходження кореня цього лінійного рівняння, або встановити наявність безлічі розв'язків (відсутності розв'язків).

1.2 Реалізація циклічного алгоритму

Реалізувати у вигляді діаграми діяльності алгоритм обчислення виразу:

y = 1/(x + 2) + 2/(x + 4) + ... + (k - 1)/(x + 2(k - 1)) + (k + 1)/(x + 2(k + 1)) + ... + n/(x + 2n)

Забезпечити перевірку можливих помилок.

1.3 Індивідуальне завдання

Розробити алгоритм програми, яка обчислює значення функції в заданому діапазоні. Програма повинна прочитати значення початку і кінця інтервалу, крок збільшення аргументу і значення n.

Алгоритм повинен бути представлений з використанням UML-діаграми діяльності. Алгоритм повинен містити такі частини:

  • зчитування даних
  • основний цикл, у якому встановлюється нове значення аргументу, розраховується значення функції, виводяться на екран значення аргументу і функції та здійснюється збільшення значення аргументу на величину кроку.

Конкретна функція визначається відповідно до номеру в списку студентів у групах (номер варіанту).

2 Методичні вказівки

2.1 Основні поняття інформатики

2.1.1 Системи числення

Система числення – це сукупність правил і знаків, за допомогою яких можна представити (закодувати) будь-яке число. Найбільш поширені позиційні системи числення – системи, в яких одна і та ж цифра в запису числа має різні значення залежно від позиції, в якій вона розташована.

У позиційній системі числення присутнє поняття основи системи числення. Будь-яке число може бути подане як сума ступенів основи, помножених на значення відповідних цифр. Значення основи дорівнює кількості цифр, які використовуються для запису числа. За основу системи числення можна прийняти будь-яке число, не менше, ніж 2. Найменування системи числення відповідає її основі (десяткова, двійкова, вісімкова, шістнадцяткова тощо). У повсякденній практиці використовують десяткову систему числення.

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

  • для представлення одиниці використовується електронний сигнал (рівень напруги), відмінний від нуля; оскільки амплітуда сигналу не має значення, це істотно підвищує надійність зберігання і передачі даних;
  • правила виконання арифметичних операцій дуже прості й легко можуть бути реалізовані апаратно.

До недоліків двійкової системи можна віднести громіздкість запису чисел і недостатню наочність. У тих випадках, коли для роботи важливо саме двійкове подання числа, використовують системи числення з основою – ступенем двох. Раніше була поширена вісімкова система, в цей час найбільш часто використовують шістнадцяткову систему числення. Як шістнадцяткові цифри заведено використовувати десять десяткових цифр і букви A (10), B (11), C (12), D (13), E (14) і F (15).

У наведеній нижче таблиці подане десяткове, двійкове та шістнадцяткове представлення чисел від 1 до 32:

Десяткове Двійкове Шістнадцяткове Десяткове Двійкове Шістнадцяткове
1 00000001 1 17 00010001 11
2 00000010 2 18 00010010 12
3 00000011 3 19 00010011 13
4 00000100 4 20 00010100 14
5 00000101 5 21 00010101 15
6 00000110 6 22 00010110 16
7 00000111 7 23 00010111 17
8 00001000 8 24 00011000 18
9 00001001 9 25 00011001 19
10 00001010 A 26 00011010 1A
11 00001011 B 27 00011011 1B
12 00001100 C 28 00011100 1C
13 00001101 D 29 00011101 1D
14 00001110 E 30 00011110 1E
15 00001111 F 31 00011111 1F
16 00010000 10 32 00100000 20

Формально зазвичай вказують основу як індекс числа. Наприклад,

2710 = 110112 = 1B16

Існує декілька способів отримання представлення чисел в різних системах числення. Найбільш розповсюджений спосіб перетворення в інші системи числення з десяткової – багаторазове ділення вихідного числа та проміжних результатів на основу системи числення з отриманням цілої частини від ділення і подальшим діленням. При цьому останній результат і отримані залишки переписуються в зворотному порядку. Наприклад, в такий спосіб можна отримати двійкове представлення числа 25:

Записавши останній результат і залишки від ділення, отримаємо

2510 = 110012

Зворотне перетворення здійснюється шляхом знаходження суми добутків цифр і послідовних за зменшенням степенів основи:

110012 = 1 × 24 + 1 × 23 + 0 × 22 + 0 × 21 + 1 × 20 = 2510

Для переведення із двійкової системи числення в шістнадцяткову кожні чотири двійкових розряди, починаючи справа, замінюють однією шістнадцятковою цифрою. Зворотний переклад аналогічний – кожна шістнадцяткова цифра замінюється чотирма двійковими.

2.1.2 Програмне забезпечення

Термін "програма" використовують у двох значеннях:

  • для опису послідовності інструкцій, які написані програмістом (сирцевого коду);
  • для опису одиниці програмного забезпечення, яка може бути виконана на комп'ютері.

Апаратне забезпечення – це фізичні, матеріальні частини комп'ютера чи іншої системи.

Програмне забезпечення (ПЗ, software) – це сукупність програм і програмних документів, необхідних для експлуатації цих програм. Загальноприйнятою є така класифікація програмного забезпечення:

  • системне ПЗ – програми, що забезпечують управління компонентами комп'ютерної системи; до системного ПЗ можна віднести:
    • операційні системи (operating systems);
    • системні утиліти (utilities);
    • СУБД (системи управління базами даних, database management systems)
    • драйвери пристроїв (device drivers);
  • прикладне ПЗ – програми і пакети програм, призначені для розв'язання задач користувачів у конкретних предметних галузях; до прикладного програмного забезпечення відносять текстові процесори, графічні редактори, поліграфічні системи, програми для виконання наукових і технічних розрахунків, ігри тощо;
  • інструментальні засоби – програмне забезпечення, призначене для створення іншого програмного забезпечення; до інструментальних засобів відносять компілятори та інші утиліти для збирання й зневадження, а також інтегровані середовища розробки (IDE, Integrated Development Environment) і CASE-системи (Computer-Aided Software Engineering).

Застосунок (додаток, застосування, application) – це синонім прикладної комп'ютерної програми. Однак під застосунком розуміють будь-яку програму, яка не є частиною операційної системи.

2.1.3 Операційні системи

Операційна система – це сукупність програмних засобів, що забезпечують управління всіма ресурсами і процесами обчислювальної системи. Під ресурсами розуміють процесор, пам'ять, дисплей, а також периферійні (зовнішні) пристрої. Процеси – це окремі програми, що отримали необхідні ресурси й запущені на виконання.

У складі операційної системи виділяють три групи компонентів:

  • ядро (планувальник, драйвери пристроїв, підтримка мережі, файлова система);
  • системні бібліотеки;
  • набір утиліт.

Приклади операційних систем – MS-DOS, OS/2, Mac OS, MS Windows різних версій, UNIX, Linux, Solaris, Google Android і багато інших.

2.1.4 Файлова система

Файлова система (file system) – це спосіб і правила організації та зберігання каталогів і файлів на зовнішньому пристрої. Іноді під файловою системою також розуміють сукупність файлів і каталогів на конкретному пристрої.

За структурою і організацією доступу до файлів розрізняють ієрархічні файлові системи (файли і підкаталоги довільної вкладеності) і плоскі файлові системи (набір файлів без підкаталогів). Ієрархічні файлові системи зараз є найбільш поширеними. Існують спеціальні види файлових систем:

  • кластерні файлові системи дозволяють розподіляти файли між декількома однотипними фізичними пристроями одного комп'ютера;
  • мережеві файлові системи забезпечують механізми доступу до файлів одного комп'ютера з інших комп'ютерів мережі;
  • розподілені файлові системи забезпечують зберігання файлів шляхом їх розподілу між декількома комп'ютерами мережі.

Файлову систему зазвичай розглядають як частину операційної системи. Кожна операційна система надає свій набір файлових систем. Наприклад, файлові системи FAT 16, FAT 32, NTFS пов'язані з Windows, Ext2, Ext3, Ext4 використовують в Linux.

2.1.5 Текстові та бінарні файли

Незалежно від файлової системи, всі файли можна поділити на текстові та бінарні (двійкові).

Текстовий файл (text file) – це комп'ютерний файл, в якому вся інформація представлена у вигляді символів визначеної кодової таблиці. Послідовність символів розділена на рядки. Для відокремлення рядків один від одного використовують роздільники – один або більше спеціальних символів. Приклади текстових файлів – прості документи, створені за допомогою блокнота (*.txt), сирцевий код (вихідні тексти) програм мовами високого рівня (*.pas, *.c, *.cpp, *.cs, *.java тощо), файли розмітки гіпертексту (*.htm, *.html), форматовані документи (*.rtf) тощо. Підготовка та редагування текстових файлів, незалежно від їх спеціального формату і призначення, може бути здійснена універсальними текстовими редакторами, наприклад, блокнотом.

Двійковий файл (бінарний файл, binary file) – це комп'ютерний файл, в якому числова інформація подана двійковими числами, відповідно до внутрішнього представлення в пам'яті комп'ютера (а не символами, як в текстових файлах). Кожен окремий формат двійкового файлу вимагає спеціального програмного забезпечення. Приклади двійкових файлів – файли, які містять команди для виконання процесором (executables) під усіма операційними системами, растрові зображення (*.tif, *.jpeg, *.png, *.gif тощо), архіви (*.zip, *.rar тощо), аудіофайли, відеофайли всіх форматів, файли з двійковим кодом (*.obj, *.class тощо), а також численні спеціальні формати пакетів прикладних програм.

2.2 Основні поняття програмування

2.2.1 Мови програмування

Мова програмування – це спеціальна нотація, за допомогою якої можуть бути записані інструкції, що забезпечують керування роботою комп'ютера. Мови програмування поділяють на низькорівневі та високорівневі.

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

Мови високого рівня поділяють на основні групи:

  • процедурні (FORTRAN, ALGOL-60, BASIC, ALGOL-68, PASCAL, C, Modula-2 тощо);
  • об'єктно-орієнтовані (Simula-67, Smalltalk-80, C++, ADA, Object Pascal, OBERON, Java, C# тощо).

Існують також мови функціонального (логічного), декларативного та інших форм програмування.

2.2.2 Інтерпретатори і компілятори. Етапи розробки програми

Інструкції високорівневої мови програмування повинні бути переведені (трансльовані) у машинний код за допомогою спеціальної програми, яка має назву транслятора (translator). Транслятори бувають двох типів – інтерпретатори й компілятори.

  • Інтерпретатор (interpreter) транслює програму рядок за рядком і одразу ж виконує інструкції, зазначені в цих рядках; як приклади можна навести інтерпретатори BASIC, JavaScript; інтерпретатори забезпечують гнучкість і створюють ефект миттєвого виконання, але необхідність багаторазової трансляції раніше інтерпретованих рядків під час виконання істотно знижує ефективність програми;
  • Компілятор (compiler) транслює весь код у набір команд, які може виконати процесор (віртуальна машина). Програми, написані мовами Pascal, C++, C# та багатьма іншими, завжди оброблюються компіляторами.

Типовими етапами розробки програми є такі:

  • сирцевий програмний код (вихідний текст, source code) програми готується за допомогою текстового редактора;
  • сирцевий код перетворюється в набір двійкових інструкцій (binary code); це може бути машинний код, як у C++, або проміжний двійковий код, як у Java;
  • скомпільований код збирається з окремих частин (компонування, linking) і виконується.

У випадку виникнення помилок на різних етапах розробки, послідовність кроків повторюється. Виконання програми з метою виявлення помилок і перевірки відповідності алгоритму має назву зневадження (debug).

2.2.3 Типи застосунків

Прикладні програми (застосунки, додатки, applications), які створюють у сучасних середовищах програмування, з точки зору взаємодії з користувачем можна розділити на дві основні групи:

  • консольні застосунки (console applications);
  • застосунки графічного інтерфейсу користувача (graphical user interface applications, GUI applications).

Консольні застосунки виконуються в спеціальному консольному вікні, або в повноекранному режимі. Для введення даних використовують клавіатуру (стандартний пристрій введення). Дані вводяться або як аргументи командного рядка (після імені програми), або під час виконання програми.

Для створення консольних застосунків традиційно застосовують концепцію (парадигму) програмування, керованого даними. Загальна структура програми включає введення вихідних даних, обчислення та виведення результатів. Під час обчислення, залежно від вихідних даних та проміжних результатів, може здійснюватися розгалуження, виконання циклічних операцій, виклик підпрограм тощо.

Програми графічного інтерфейсу користувача передбачають взаємодію користувача з застосунком через графічні елементи управління (кнопки, позиції меню, елементи списків, лінійки прокрутки тощо) та різноманітні технічні пристрої введення і позиціювання (клавіатура, маніпулятор "миша", джойстик та інші). Виведення результатів також може здійснюватись у діалогові вікна, у вигляді тексту, графіків тощо.

Складна логіка взаємодії користувача з програмою унеможливлює застосування методів програмування, керованого даними. В теперішній час для програмування застосунків графічного інтерфейсу користувача використовують парадигму програмування, керованого подіями. Уся програма складається з ініціалізації (реєстрації візуальних елементів управління) та основного циклу отримання та обробки подій. Події – це переміщення або натискання кнопок миші, клавіатурне введення тощо. Кожний зареєстрований візуальний елемент управління може отримувати події, які до нього стосуються, та виконувати функції обробки цих подій. У разі необхідності він може надсилати події іншим зареєстрованим компонентам.

У типовому випадку здійснюється створення одного, або декількох вікон, після чого до них додаються візуальні елементи управління. Для цих елементів створюються та реєструються функції обробки певних подій. Основний цикл отримання та обробки подій здійснюється стандартними засобами – за допомогою каркасу застосунку (framework). Розробникові конкретної програми тільки треба додати необхідні елементи та написати функції обробки подій.

2.3 Алгоритми

2.3.1 Загальні концепції. Графічне подання алгоритмів

Алгоритм (algorithm) – це детальний опис послідовності дій, спрямованих на розв'язання визначеної задачі. Мета алгоритму повинна бути досягнута за скінчену кількість кроків. Алгоритми зазвичай поділяють на лінійні, алгоритми з розгалуженням і циклічні.

Є декілька способів опису алгоритмів:

  • вербальний спосіб;
  • псевдокод (штучна алгоритмічна мова);
  • графічний спосіб.

Найбільш наочним є графічний опис. Є дві загальноприйняті форми графічного зображення алгоритмів – традиційна блок-схема та діаграма діяльності. Остання форма є частиною так званої Уніфікованої мови моделювання.

Уніфікована мова моделювання (Unіfіed Modeling Language, UML) – це графічна нотація для визначення, опису, проєктування та документування програмних систем, бізнес-систем і інших систем різної природи, в першу чергу пов'язаних з програмним забезпеченням. UML включає низку діаграм для моделювання і проєктування складних систем.

Діаграма діяльності (Activity diagram) – одна зі стандартних діаграм UML. Цей вид діаграм може бути використаний для зображення алгоритмів. У цьому випадку використовують такі елементи діаграми:

  • початковий стан (initial state);
  • діяльність (activity);
  • перехід (transition);
  • символ перевірки умови (decision);
  • кінцевий стан (end state).

На кожній діаграмі діяльності може бути присутнім тільки один початковий стан:

Будь-яка діяльність (введення / виведення, обчислення та ін.) на діаграмі представляється овалом:

Діяльності зв'язуються одна з одною переходами у вигляді стрілок:

Символ перевірки умови (decision) зображують у вигляді ромба. Умови переходу записують у квадратних дужках:

Кінцевих станів може бути декілька. Вони зображуються в такому вигляді:

З початкового стану виходить одна і тільки одна стрілка. Елемент "діяльність" вимагає, щоб у нього входила одна стрілка, а одна виходила. Не повинно бути діяльностей без вхідної, або без вихідної стрілки. Декілька стрілок може виходити тільки із символу перевірки умови.

2.3.1 Класифікація алгоритмів

Більшість задач алгоритмізації розв'язується за допомогою трьох найпростіших типів алгоритмів:

  • лінійні алгоритми;
  • алгоритми з розгалуженням;
  • циклічні алгоритми.

Існують також більш складні алгоритми, пов'язані з використанням підпрограм, наприклад, рекурсивні.

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

Реалізація алгоритму обчислення зворотної величини вимагає перевірки можливості ділення (аргумент не може приймати значення 0). Це приклад алгоритму з розгалуженням:

Циклічний алгоритм передбачає виконання певних обчислень декілька разів. Сукупність таких дій, що циклічно повторюються, має назву тіла циклу. До початку виконання тіла циклу або після завершення дій у тілі циклу слід здійснювати перевірку необхідності повторного входу в цикл. Наведений нижче алгоритм описує дії, пов'язані з уведенням цілого n та знаходженням степенів числа 2 – від першого до n-го:

Під час створення алгоритмів за допомогою діаграм діяльності окремі повідомлення можна виводити будь-якими мовами (наприклад, "Print x", "Друкувати x" тощо), оскільки діаграма не пов'язана з певною мовою програмування та її програмна реалізація виконується вручну. Головне – діаграма повинна бути зрозумілою виконавцеві.

2.4 Основні характеристики мови програмування C++

Мова програмування C++ була створена в 1983 році данським дослідником Б'ярном Страуструпом.

Базовою мовою для C++ було обрано С – багатоцільову, лаконічну і відносно низькорівневу мову програмування. Мова C зберігається як підмножина. Основними особливостями C++ у порівнянні з С є такі:

    строга типізація; підтримка об'єктно-орієнтованого програмування; підтримка шаблонів і узагальненого програмування;
  • розширені можливості процедурного програмування.

Мова C++ поєднує в собі можливості представлення складних структур даних і написання ефективних низькорівневих програм. На базі синтаксису C++ згодом були створені нові об'єктно-орієнтовані мови. Насамперед, це Java і C#.

У серпні 1998 року був ратифікований стандарт мови C++. Стандарт C++ – це документ, який повністю описує синтаксис мови і його можливе використання. Крім базових засобів мови програмування C++, в стандарт увійшла так звана Стандартна бібліотека (Standard C++ Library). Всі останні версії компіляторів на C++ зобов'язані підтримувати стандарт мови. Деякі компанії пропонують спеціальні пакети, які перевіряють "стандартність" реалізації C++. Стандарт оновлювався у 2003, 2011 і 2014 роках.

2.5 Етапи розробки програми мовою C++

Є кілька типових кроків розробки програми мовою C++:

  • сирцевий код готується та зберігається за допомогою будь-якого текстового редактора;
  • здійснюється препроцесування (preprocessing) сирцевого коду і створюється одиниця трансляції; в більшості випадків препроцесування об'єднане з компіляцією;
  • здійснюється компіляція створеної одиниці трансляції; якщо компіляція неможлива через наявність помилок компіляції (compiler errors) , виводиться список цих помилок; якщо синтаксичних помилок немає, створюється так званий об'єктний модуль – файл з машинним кодом, який містить посилання на функції, відсутні в цьому модулі; найчастіше об'єктний модуль – це файл з розширенням .obj.
  • здійснюється редагування невирішених зв'язків за допомогою так званого лінкера (linker, компонувач, редактор зв'язків) – спеціальної підпрограми, яка зв'язує декілька об'єктних модулів, а також додає скомпільовані функції зі стандартних бібліотек – файлів з розширенням lib; крім того, з коду видаляються функції, на які немає посилань; результат роботи лінкера – файл, готовий до виконання (*.exe) або бібліотека.

Під час роботи виникають помилки часу виконання (runtime errors), які відображаються в окремих діалогових вікнах, а також логічні помилки (logical errors, програма виконує неочікувані дії і ми не отримуємо результату). Виправлення цих помилок вимагає повторного редагування коду, компіляції, компонування та завантаження скорегованої програми на виконання.

2.6 Середовище програмування Visual Studio

2.6.1 Інсталяція програми і створення нового проєкту

Visual Studio – це комплект (suіte) засобів розробки, що включає розробку багатьма мовами, зокрема, Visual Basic .NET, C, C++, F++, C#, а також підтримку Web-програмування. Мови розробки використовують загальне інтегроване середовище розробки (Integrated Development Environment, IDE). Інтегроване середовище розробки дозволяє програмісту створювати проєкти, здійснювати доступ до файлів допомоги, редагувати й компілювати код, виправити помилки компіляції та компонування.

Завантажити IDE можна зі сторінки https://visualstudio.microsoft.com/downloads. Обираємо варіант Community і натискаемо на кнопку Free download. Завантажується програма встановлення Visual Studio Installer. Натиснувши на кнопку Continue, починаємо процес інсталяції. У вікні "Installer - Visual Studio Community" серед різних можливостей обираємо Desktop development with C++ і натискаємо Install. На наступній сторінці можна все залишити без змін.

Після встановлення нам пропонують увійти в систему або зареєструватися. Можна прибрати відповідну опцію і натиснути на посилання Not now, maybe later. На наступній сторінці можна вибрати бажану тему – Blue, Blue (Extra Contrast), Dark або Light і натиснути Start Visual Studio.

Після першого завантаження ІDE з'являється стартова сторінка, на якій, зокрема, можна знайти кнопки "Відкрити проєкт або рішення " (Open project or solution) і "Створити новий проєкт" (Create a new Project). Можна здійснити створення нового проєкту.

Примітка: якщо рішення вже створене, новий проєкт може бути створений з використанням головного меню File | New | Project... або клавішною комбінацією Ctrl+Shif+N.

Проєкт (project) є ключовим поняттям розробки програми у Visual Studio. Проєкт – це набір взаємозалежних вихідних файлів, компіляція і компонування яких дозволяє створити програму або DLL (Dynamic link library). Файли проєкту зазвичай зберігаються в окремій теці. Всередині проєкту можна створювати декілька конфігурацій – узгодженого набору налаштувань, зв'язаних з певною метою діяльності. Кожен проєкт містить щонайменше дві конфігурації – конфігурацію зневадження (debug configuration) і конфігурацію релізу (release configuration).

У майстрі нового проєкту слід виконати такі дії:

  • серед встановлених типів проєктів обираємо Empty Project;
  • уводимо ім'я проєкту в полі Name; усталене місце розташування для нового проєкту (Location) визначається автоматично, але в більшості випадків слід змінити диск і теку;
  • обираємо ім'я рішення, яке для простих проєктів збігається з ім'ям проєкту; для простих проєктів також доцільно вибрати опцію Place solution and project in the same directory;
  • натискаємо ОК і порожній проєкт створений.

Примітка: можна також скористатися шаблоном Console App, але потім треба буде вручну видаляти зайві коментарі та твердження на кшталт виведення повідомлення "Hello World!".

Щоб створити новий файл з сирцевим кодом, слід виконати такі дії:

  • в меню Project обираємо функцію Add New Item... (або Add | New Item... в контекстному меню пункту провідника рішень проєкту);
  • обираємо тип файлу: C++ File. Рекомендується ввести ім'я файлу в полі Name; в іншому випадку ім'я буде встановлено в Source.cpp;
  • натискаємо OK, після чого в панелі редактора відкривається порожній файл.

Тепер можна ввести та зберегти текст програми. Для виконання програми можна використовувати клавішну комбінацію Ctrl-F5 (Start Without Debugging).

2.6.2 Зневадження програми

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

Крім автоматичного виконання програми з метою зневадження передбачений покроковий режим. До тексту програми необхідно додати принаймні одну точку переривання (breakpoint). Це можна зробити за допомогою клавіші F9, коли курсор знаходиться в необхідному рядку. Коли програма виконується в режимі зневадження, точка переривання обумовлює тимчасову зупинку програми. Далі можна зняти програму з використання, або виконувати звичайне чи покрокове виконання.

Після встановлення точок переривання можна завантажити програму в режимі зневадження (Debug | Start Debugging або F5). Після зупинки в точці переривання можна здійснювати покрокове виконання або продовжити виконання далі (до кінця або до наступної точки переривання). Для продовження в звичайному (не покроковому) режимі використовують F5. Покрокове виконання програми може відбуватися з заходженням у підпрограми (Debug | Step Into, функціональна клавіша F11) і з пропуском (не покроковим виконанням) підпрограм (Debug | Step Over, функціональна клавіша F10).

Якщо під час зневадження помістити курсор миші на змінну, її значення можна подивитись у маленькому віконці. Можна також скористатися засобами відображення та редагування в спеціальних підвікнах.

Підвікно Find Symbol Results містить такі закладки:

  • закладка Autos відображає інформацію про змінні, які вживані в поточному та попередньому твердженнях;
  • закладка Locals відображає інформацію про змінні, які є локальними всередині поточної функції;
  • закладка Watch 1 дозволяє дивитися і редагувати значення, які зберігаються в змінних.

Якщо у вікні Locals відображається масив, об'єкт класу або структура, поруч з ім'ям змінної з'являється кнопка. Натиснувши на кнопку, можна розширити або звузити перегляд змінної. Кнопка відображається зі знаком плюс (+), якщо змінна відображається в скороченому вигляді, і зі знаком мінус (-), коли вона відображається в розгорнутому вигляді.

Достроково припинити виконання можна за допомогою функції DEBUG | Stop Debugging (Shift-F5). Можна також зупинити програму з одночасним завантаженням і виконанням з початку (Debug | Restart або Ctrl-Shif-F5).

У прикладах 3.7 і 3.8 наводяться програми, які можна відтворити в середовищі Visual Studio. Номери рядків в наведених нижче прикладах програм не є частиною коду. Ці числа можуть бути видалені разом з коментарями, в яких вони розташовані. Синтаксичні конструкції, вживані в прикладах, будуть детально роз'яснені в наступних темах.

2.7 Перша програма мовою C++

Вивчення мови програмування традиційно починають зі створення програми "Hello, World!". Для створення такої програми мовою C++ нам необхідно підготувати новий порожній проєкт у Visual Studio. Нехай цей проєкт матиме назву Hello. Додаємо порожній файл Source.cpp для сирцевого коду. В цьому файлі ми розташуємо нашу програму в найпростішому варіанті:

#include <iostream>

void main()
{
    std::cout << "Hello, World!";
}

Перший рядок коду – директива препроцесору, яка обумовлює підключення у відповідному місці тексту стандартного заголовного файлу iostream. Цей файл містить оголошення необхідних об'єктів, зокрема об'єкту std::cout, який використовують для виведення результату в консольне вікно. Далі розташовано заголовок функції main(), з якої починається виконання програми. Далі у фігурних дужках міститься тіло функції з одним твердженням. Здійснюється виведення рядка вітання у стандартний потік виведення.

Для того, щоб після виведення тексту "Hello, World!" здійснювався перехід курсору на новий рядок, слід змінити рядок, у якому здійснюється виведення, в такий спосіб:

std::cout << "Hello, World!" << std::endl;

Додавання маніпулятору std::endl в потік забезпечує перехід на новий рядок. Для того, щоб не вживати двічі префікс std (ім'я простору імен), до програми можна додати директиву підключення простору імен (після директиви препроцесора #include <iostream>):

using namespace std;

Тепер рядок, в якому здійснюється виведення результатів буде таким:

cout << "Hello, World!" << endl;

Для того, щоб компілятор не генерував попередження (warning) "return type of 'main' should be 'int' instead of 'void'" слід змінити тип результату функції main(). Якщо замість void використати int, можна буде здійснювати аналіз успішності виконання програми на рівні операційної системи. Тепер наша програма виглядатиме так:

#include <iostream>

using namespace std;

int main()
{
    cout << "Hello, World!" << endl;
    return 0;
}

Після завантаження програми на виконання (Debug | Start Without Debugging) текст вітання з'явиться у спеціально створеному консольному вікні.

3 Приклади алгоритмів і програм

3.1 Лінійне рівняння

Приклад алгоритму з розгалуженням (без циклів) – алгоритм розв'язання лінійного рівняння:

ax + b = 0

Якщо a не дорівнює нулю,

x = –b / a

Якщо і a, і b є нулями, будь-яке значення можна розглядати як корінь рівняння. Якщо b ненульове значення, а a ні, рівняння неможливо розв'язати. Це слід зобразити на схемі алгоритму:

3.2 Обчислення суми

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

y = 12 + 22 + 32 + ... + n2

Алгоритм обчислення суми може виглядати так:

Як видно з алгоритму, спочатку ми присвоюємо 0 результату, а потім на кожному кроці додаємо наступний доданок.

3.3 Обчислення добутку

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

p = x(x – 1)(x + 2)(x – 3) ... (x + (–1)n n)

Додаткова проблема – переміжні знаки в співмножниках. Для розв'язання таких задач можна запропонувати спеціальний спосіб: створити спеціальний додатковий коефіцієнт (наприклад, k), який послідовно дорівнює 1 або –1. Обчислення степенів числа –1 не має сенсу в будь-якому випадку. Алгоритм може бути таким:

Наведена вище діаграма містить так звану анотацію – довільний текст з поясненням, який можна зв'язати з певним елементом.

3.4 Сума добутків

Іноді під час розв'язання задач виникає необхідність реалізації вкладених циклів. Наприклад, коли необхідно обійти всі комірки прямокутної таблиці або обчислити суму добутків, суму сум, добуток добутків тощо.

Припустимо, необхідно ввести значення n і обчислити y за формулою

Почати слід з аналізу задачі. Можна представити формулу в більш зручній формі:

у = (1 + 12)(1 + 22)...(1 + (n – 1)2) + (2 + 12)(2 + 22)...(2 + (n – 1)2) + ... + ((n – 1) + 12)((n – 1) + 22)...((n – 1) + (n – 1)2)

Наприклад, для випадку n = 4 отримуємо:

у = (1 + 12)(1 + 22)(1 + 32) + (2 + 12)(2 + 22)(2 + 32) + (3 + 12)(3 + 22)(3 + 32) = 634

Схема алгоритму може бути такою:

Важливо ініціалізувати внутрішній добуток початковим значенням (1) на кожному кроці зовнішнього циклу.

3.5 Добуток сум

Інший приклад реалізації алгоритму з вкладеними циклами – обчислення добутку сум. Необхідно ввести значення n, обчислити y за формулою

та вивести результат.

Як і в попередньому прикладі, представляємо формулу в більш зручній формі:

До початку обчислення необхідно переконатися, що число n, яке ввів користувач, більше або дорівнює 2, інакше формула втрачає сенс і слід виводити повідомлення про помилку. Схема алгоритму може бути такою:

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

3.6 Загальний алгоритм індивідуального завдання

Відповідно до індивідуального завдання, необхідно створити алгоритм програми обчислення значень функції в заданому діапазоні. Загальний каркас алгоритму може бути таким:

Під час виконання слід більш детально описати можливі варіанти некоректних даних, а також забезпечити відповідність перевірки умови порівняння з нулем індивідуальному завданню.

3.7 Середня швидкість

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

/* 01 */  // Середня швидкість
/* 02 */  #include <iostream>
/* 03 */  using namespace std;

/* 04 */  int main(int argc, char* argv[])
/* 05 */  {
/* 06 */      setlocale(LC_ALL,"UKRAINIAN");
/* 07 */      float s, t;
/* 08 */      cout << "Уведiть вiдстань i час:" << endl;
/* 09 */      cin >> s >> t;
/* 10 */      float v = s / t;
/* 11 */      cout << "Швидкiсть: " << v << endl;
/* 12 */      return 0;
/* 13 */  }

Рядок 01 містить коментар – деякий пояснювальний текст всередині тексту програми; коментар призначений для того, щоб допомогти людині зрозуміти програмний код. Коментарі – це просто текст, який ігнорується компілятором.

Рядок 02 – це так звана директива препроцесору. Препроцесор – це підпрограма, яка обробляє сирцевий код відповідно до її директив і створює так звану одиницю трансляції (translation unit). Виконуючи директиву include, препроцесор вставляє текст вказаного заголовного файлу в одиницю трансляції. Стандартний заголовний файл iostream містить, зокрема, оголошення стандартного потоку введення cin (клавіатура), стандартного потоку виведення cout (консольне вікно), і так званого маніпулятора endl (кінець рядка).

У рядку 03 здійснюється підключення так званого простору імен. У цьому випадку підключається простір імен std. Таке підключення забезпечує можливість використовувати в тексті імена cin, cout і endl безпосередньо, а не std::cin, std::cout і std::endl.

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

Рядок 04 містить заголовок функції main(). Виконання будь-якої програми починається з першого твердження функції з ім'ям main(). Дужки охоплюють список аргументів. Цілий аргумент argc представляє кількість параметрів командного рядка. Аргумент argc – це вказівник на масив параметрів командного рядка. Якщо ми не бажаємо обробляти аргументи командного рядка, функцію main() можна визначити без аргументів:

int main()
{

}

Фігурні дужки в рядках 05 і 13 охоплюють програмний блок функції main(). Програмний блок містить твердження, які будуть виконані.

У рядку 06 ми викликаємо стандартну функцію setlocale(LC_ALL,"UKRAINIAN"), яка забезпечує використання відповідної кодової таблиці під час консольного виведення.

Примітка: навіть, якщо правильно вказати локалізацію, можуть виникнути проблеми з відтворенням української літери і. В усіх прикладах замість української літери доводиться вживати відповідну літеру латинської абетки.

Твердження в рядку 07 – це визначення двох змінних типу float. Цей тип використовують для представлення дійсних даних. Змінна s зберігатиме відстань, а t – час.

У рядку 08 послідовність символів у подвійних лапках "Уведiть вiдстань i час:" записується в стандартний вихідний потік виведення cout. Під час виконання твердження на екран виводиться текст рядка (без лапок). Занесення в потік виведення маніпулятора endl забезпечує перехід курсору на новий рядок.

У рядку 09 представлена операція читання значень s і t зі стандартного потоку введення cin (у нашому випадку – з клавіатури). У рядку 10 визначення змінної v об'єднане з обчисленням виразу s / t. У рядку 11 на екран виводиться константа "Швидкiсть: " та значення змінної v.

Значення, яке повертає функція main() у рядку 12, може бути використане операційною системою. Значення 0 свідчить про нормальне завершення.

Примітка. Якщо завантажити програму на виконання без зневадження (Ctrl-F5), після її завершення у консольному вікні з'явиться додатковий рядок "Press any key to continue . . .". Закінчити роботу можна, натиснувши будь-яку клавішу. Якщо рядок не з'являється, наприклад, через запуск зі зневадженням (F5), до програми можна додати виклик функції, яка очікує на натиснення будь-якої клавіші перед виходом з функції:

system("pause"); // З'явиться "Press any key to continue . . ." 
return 0;

3.8 Цілий степінь

Наведена нижче програма передбачає введення основи степеня і цілого показника степеня, обчислення і виведення степеня (циклічний алгоритм, аналогічний наведеному на рис. 2.8):

/* 01 */  // Цілий степінь
/* 02 */  #include <iostream>
/* 03 */  using namespace std;

/* 04 */  int main()
/* 05 */  {
/* 06 */      setlocale(LC_ALL,"UKRAINIAN");
/* 07 */      float x;
/* 08 */      int n;
/* 09 */      cout << "Уведiть основу степеня i показник степеня:" << endl;
/* 10 */      cin >> x >> n;
/* 11 */      float power = 1;
/* 12 */      for (int i = 1; i <= n; i++)
/* 13 */          power *= x;
/* 14 */      cout << "Степiнь: " << power << endl;
/* 15 */      return 0;
/* 16 */  }

На відміну від основи степеня (x), показник степеня n визначається в рядку 08 як ціла змінна.

У рядку 11 визначається змінна power типу float і їй присвоюється значення 1. Це значення використовується як перше наближення результату.

Рядок 12 містить твердження циклу for – циклу з параметром. Параметр i визначається всередині циклу і зміняються від 1 (іnt і = 1) з кроком 1 (і++) поки виконується умова і <= n (менше або дорівнює). На кожному кроці циклу виконується твердження, що міститься безпосередньо після твердження for (...).

Рядок 13 є "тілом циклу". У ньому n разів здійснюється домноження значення змінної power на значення x (в комірку, що містить спочатку 1, n разів записується значення, рівне попередньому, помноженому на x).

4 Вправи для контролю

Вправи виконуються студентами, які бажають отримати відмінну оцінку. Програми створюються шляхом перероблення наведених вище прикладів.

Завдання 1

Розробити алгоритм програми, в якій здійснюється читання значення певної довжини в дюймах і обчислюється й виводиться значення цієї довжини в міліметрах (1 дюйм = 25,4 мм).

Завдання 2

Розробити алгоритм програми, в якій зчитують вісім значень і обчислюється середнє арифметичне.

Завдання 3

Розробити алгоритм програми, яка зчитує значення змінної n цілого типу й обчислює n!

5 Контрольні запитання

  1. Що таке позиційна система числення?
  2. Що таке основа системи числення?
  3. Які є недоліки й переваги двійкової системи числення?
  4. Для чого використовують шістнадцяткову систему числення?
  5. Визначте поняття програмного забезпечення.
  6. Як можна класифікувати програмне забезпечення?
  7. Що таке інструментальні засоби?
  8. Що таке застосунок (додаток)?
  9. Які функції виконує операційна система?
  10. Наведіть приклади операційних систем.
  11. Що таке файлова система?
  12. Чим текстові файли відрізняються від бінарних?
  13. Наведіть приклади текстових і бінарних файлів.
  14. Чим визначається "рівень" мови програмування?
  15. Як визначити поняття "комп'ютерна програма"?
  16. Які існують етапи розробки програми?
  17. Що таке зневадження?
  18. Що таке консольний застосунок і чим він відрізняється від інших видів застосунків?
  19. У чому переваги і недоліки інтерпретаторів і компіляторів?
  20. Що таке алгоритм?
  21. Які є способи подання алгоритму?
  22. Які є різні типи алгоритмів?
  23. Що таке UML?
  24. Що таке діаграма UML?
  25. У чому різниця між блок-схемою і діаграмою діяльності?
  26. У чому різниця між поданням умовних елементів в блок-схемі та діаграмі діяльності?
  27. У чому різниця між поданням виведення та розрахунків у нотації діаграм діяльності?
  28. Які є етапи розробки програми мовою C++?
  29. У чому різниця між компілятором і лінкером?
  30. Що таке інтегроване середовище розробки?
  31. Які мови програмування підтримує Visual Studio?
  32. Що таке зневадження?
  33. Як створити новий проєкт у Visual Studio?
  34. Як зневаджувати програми в Visual Studio?

 

up