You are on page 1of 88

Питання бажано брати з лекцій Курочкіна, групи в телеграмі, classroom або

з власного конспекту.
силка на програми тут
Вох 52,50,18,17,32, 26
Гордєєв 11, 37, 27, 39, 35, 40, 38, 36, 15, 20, 21, 34, 19
Котов 1, 5, 9, 12, 22, 24, 25, 41, 43
Лащ 54,56,57,53
Лукащук 6,13,33,48,51,47,46,45,55
Рижко 4, 3,10
Складанюк 14
Слуковський 2,16,28,29,30
Янович 49,23,44,42,8,14,31

А степарук пеніс(͡° ͜ʖ ͡°)


     .,,..;~`''''    `''''<``彡 }
  _...:=,`'    ︵  т ︵  X彡-J
<` 彡 /  ミ  ,_人_. *彡 `~
  `~=::              Y
    i.             .:
   .\       ,。---.,,  ./
    ヽ /゙''```\;.{    \/
     Y   `J..r_.彳   |
     {   ``  `   i
     \         \   ..︵︵.
     `\         ``ゞ.,/` oQ o`)
      `i,          Y  ω /
       `i,      .    »   /
      `iミ           ,,ノ
       ︵Y..︵.,,     ,,+..__ノ``
     (,`, З о    ,.ノ川彡ゞ彡  *
Екзаменаційні питання.
1. Архітектура Фон-Неймана. Етапи розв’язку задач на ПЕОМ.

Архітектура Фон-Неймана – архітектура електронних обчислювальних


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

Основними принципами архітектури Фон-Неймана є:

1. Принцип двійкового кодування


2. Принцип однорідності пам'яті - спільне зберігання даних у комірках
однієї і тієї ж пам'яті
3. Принцип адресності
4. Принцип програмного управління - говорить про те, що кожну
задачу можна розв'язати за допомогою алгоритма.

Етапи розв’язку ПЕОМ:


1-Постановка задачі.
2- розробка математичної моделі.

3-Вибір методу розв’язку.

4-Розробка алгоритму.
5-Написання програми.
2
6-Налагодження програми.

7-Створення документації до програми.


8-Впровадження.
9-Супровід, модернізація.
2. Визначення алгоритму. Основні властивості алгоритмів.

3. Способи представлення алгоритмів.

Спочатку під алгоритмом розуміли тільки правила виконання чотирьох


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

При розробці алгоритма (програми) застосовуються різні методи.


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

Запис алгоритму повинен проводитися для практичного використання ,


найчастіше використовують такі способи алгоритмую: Словесно ,
Словесно-формульний , Графічне , псевдокоди , програмно , Блок -схема.

4. Основна теорема програмування. Базові алгоритмічні структури.


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

● Мова програмування – це штучна мова, створена для передачі


команд машинам, зокрема комп'ютерами.
● Інтегроване середовище розробки – це комплексне програмне
рішення для розробки програмного забезпечення. Зазвичай,
складається з редактора початкового коду, інструментів для
автоматизації складання та відлагодження програм. Більшість
сучасних середовищ розробки мають можливість автодоповнення
коду.
● Інтерпретатор - програма чи технічні засоби, необхідні для
виконання інших програм, виду транслятора, який здійснює
построкову обробку, перетворення у машинні коди та виконання
програми або запиту .
● Компілятор - це програма, призначена для перекладу програми,
написаної на якій-небудь мові, в програму в машинному коді.
● Компонувальник – це програма, яка виконує компонування ,
приймає на вхід один або кілька об'єктних модулів і збирає їх в один
виконуваний модуль.
6. Логічні вирази. Правила складання та розрахунку логічних виразів.

Логічний вираз – це алгоритм для операції розгалуження або запису умови


циклу.

Логічні вирази можуть бути: простими та складеними.

Простий л.в – порівнює 2-і велечини або арефметичні вирази з використ


1-го із знаків (<;>;=>;<= )

Складеним логічним виразом називається вираз, в якому


використовуються логічні операції and, or, not.

Значення будь якого л.в. можуть бути або істина , або хибне (true or false).

A B A and (&&)B A or ( || ) B

0 0 0 0

0 1 0 1

1 0 0 1

1 1 1 1

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

- В першу чергу розраховується значення арефметичних виразів

- Розраховується значення операції відношення

- Виконуються всі операції заперечення.

7. Методологічні основи програмування. Основні парадигми


програмування.
Методологія програмування – об’єднана єдиним філософським підходом сукупність
методів, які застосовуються при процесі створення програми.
З кожною методологією пов’язані:
- парадигма програмування
- множина методів
- концепція

Метод – сукупність теоретичних принципів і практичних прийомів, які потрібно


застосовувати для виконання певної задачі: метод управління, метод потоку.
Парадигма програмування – це підхід до побудови програми, в основі якої лежить
використання концептуально узгодженої сукупності ідей і понять, що визначають
певний стиль написання програми.
Основні парадигми програмування:
- Імперативне(Неструктурне, Процедурне, Модульне, Збіркове, Структурне),
- Об’єктно-орієнтоване(На класах Delphi, C++, На класах Java),
- Декларативне(Функціональне, Логічне, В обмеженнях, Доказове,
Документно-орієнтоване(HTML, SQL)).
8. Методології імперативного програмування.

9. Структурне програмування. Прийоми та методи структурного


програмування.

Методологія структурного програмування – це сукупність методів


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

- структурного кодування
- низхідного програмування
- блочного програмування
- паралельного документування

Для перетворення неструктурованих програм в структуровані


використовують наступні методи:
10. Технології програмування.

Як і будь-яка інша технологія, технологія програмування являє собою


набір технологічних інструкцій, що включають:

● вказівку ​послідовності виконання технологічних операцій;


● перерахування умов, при яких виконується та чи інша операція;
● описи самих операцій, де для кожної операції визначені вихідні дані,
результати, а також інструкції, нормативи, стандарти, критерії та
методи оцінки і т. п.

Структурний підхід до програмування являє собою сукупність


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

1. постановка задачі;
2. її формалізація;
3. вибір методу вирішення задачі;
4. розробка алгоритму програми;
5. розробка тексту програми;
6. тестування і налагодження програми.

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


визначенні її вхідних і вихідних даних, а також форми видачі результатів.
Для цього треба дати відповіді на питання:
● Що дано?
● Які дані допустимі ?
● Які результати і у якому вигляді повинні бути отримані ?
● За яких умов можливе одержання необхідних результатів, а за яких –
ні ?
● Які результати будуть вважатися правильними ?

Так як задача формулюється в термінах предметної області, її необхідно


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

Постановка задачі завершується створенням технічного завдання (ТЗ), а


потім зовнішньої специфікації програми, що включає в себе:

● опис вихідних даних і результатів (типи, формати, точність, спосіб


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

Таким чином, програма розглядається як чорний ящик, для якого визначені


функція і вхідні і вихідні дані.

Формалізація задачі. На цьому етапі розгорнутий опис задачі


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

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


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

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


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

Велике значення при розробці програмного забезпечення має правильний


вибір мови програмування. При цьому слід враховувати наступні чинники:

● функціональне призначення системи;


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

Головний критерій вибору мови програмування — скорочення терміну


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

Розробка алгоритму програми. Неформально алгоритмом називається опис


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

Алгоритм може представляти собою деяку послідовність обчислень, а


може - послідовність дій не математичного характеру. Але в кожному
випадку повинні бути визначені початкові умови і те, що потрібно
отримати.
Алгоритм розв'язання задачі розбивається на декілька більш простих
частин (підзадач). Їх виділяють таким чином, щоб програмування підзадач
було незалежним. Складається блок-схема програми, де виділяють головну
і підлеглі підзадачі і зв'язки між ними. Тут же встановлюють, які початкові
дані отримує кожна підзадача і які результати вона видає.

Розробка тексту програми. Для опису алгоритмів на зрозумілій ПК мові,


використовують мови програмування.

Етап розробки тексту програми саме і полягає у кодуванні алгоритму на


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

Тестування і налагодження програми. Частину синтаксичних помилок,


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

Даний етап передбачає багаторазове виконання програми з різними


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

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


процес. Він займає в загальній роботі майже половину часу.

З розвитком ООП, а також засобів графічного інтерфейсу на ПК, виникла


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

Не слід також плутати технологію програмування з методологією


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

1Стиль програмування являє собою сукупність правил, яких необхідно


дотримуватися при написанні програми.

2 Повідомлення — це запит на виконання дії, доповнений набором


аргументів які можуть знадобитися при її виконанні

3 Композиція (суперпозиція) функцій — це взяття функції від функції.


Наприклад, якщо у = f(x) = x2, а z = g(y) = sin(y), тоді суперпозиція z = g(
f(x) ) = (g o f)(x) = sin(x2).

4 Логіка предикатів - розділ математичної логіки, що вивчає процес


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

5 Предикат - це логічна функція від одного або декількох аргументів


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

6 Коррадо Бом і Джузеппе Якопіні - італійські математики

7 Декомпозиція - розбиття на частини.

11. Історія створення мови програмування С/С++. Особливості мови С.


Історія С/С++
Мова С++ розвинулася із В, яка у свою чергу була створена на основі
двох попередніх мов - ВCPL і В. Мова ВCPL була створена в 1967 році
Мартіном Річардом як мова для написання компіляторів і програмного
забезпечення операційних систем. Кен Томпсон передбачив багато
можливостей в своїй мові В - дублікаті ВCPL і використовував В для
створення ранніх версій операційної системи UNIX в Bell Laboratories в
1970 р. I BCPL, і В були “нетиповими” мовами - кожен елемент даних
займав одне “слово” в пам`яті і тягар обробки елементу даних, наприклад,
як цілого ібо дійсного числа падало на плечі програміста.
Мова С була розвинена з В Деннісом Рітчи в Bell Laboratories і
реалізована на комп'ютері Dac РDP 11 в 1972 році. С використовує багато
важливих концепцій ВСРL, і В, а також додає типів даних і інші
властивості. Спочатку С придбав широку популярність як мова розробки
операційної системи UNIX. Сьогодні фактично всі нові операційні системи
написані на С або на C++. Протягом двох останніх десятиліть С став
доступним для більшості комп'ютерів. С незалежний від апаратних засобів.
При ретельній розробці на С можна написати мобільні програми,
переносимі на більшість комп'ютерів.
В кінці 70-х років С розвинувся в те, що тепер відносять до
«традиційного С», «класичного С» або «С Кернігана і Рітчи». Публікація
видавництвом Prentive-Hall книги Кернігана і Рітчи «Мова програмування
С» привернула широку увагу до цієї мови. Ця публікація стала однією з
найбільш вдалих книг по обчислювальній техніці за весь час.
Широке поширення С на різних типах комп'ютерів (інколи званих
апаратними платформами) привело, на жаль, до багатьох варіацій мови.
Вони були схожі, але несумісні одина з іншою. Це було серйозною
проблемою для розробників програм, що потребували написання сумісних
програм, які можна було б виконувати на декількох платформах. Стало
ясно, що необхідна стандартна версія С. В 1983 році при Американському
Національному Комітеті Стандартів в області обчислювальної техніки і
обробки інформації був створений технічний комітет ХЗj11, аби
«забезпечити недвозначне і машинно-незалежне визначення мови». У 1989
році стандарт був затверджений. АNSI скооперувався з Міжнародною
Організацією Стандартів (International Standart Organization — ISO), аби
стандартизувати С у світовому масштабі; спільний стандарт був
опублікований в 1990 році і названий ANSI/ISO 9899: 1990. Друге видання
книги Кернігана і Рітчи, що вийшло в 1988 році, відображає цю версію,
звану ANSI С; ця версія мови використовується тепер повсюдно.
C++ — розширення С — був розроблений Бьерном Строустропом на
початку 80-х років в Bell Laboratories. C++ забезпечує ряд властивостей,
які «упорядковують» мову С, але, що важливіше, він забезпечує
можливість об'єктно-орієнтованого програмування. Це з'явилося
революційною ідеєю в світі програмного забезпечення. Швидке, коректне і
економне створення програмного забезпечення залишається ілюзорною
мрією і це в той час, коли потрібне проектування нового і усе більш
потужного програмного забезпечення. Об'єкти — це ефективні повторно
використовувані компоненть програмного забезпечення, що моделюють
елементи реального світу. Розробники програмного забезпечення
виявляють, що використання досягнень модульного,
об'єктно-орієнтованого проектування може значно підвищити
продуктивність груп розробки в порівнянні з попередньою популярною
технологією програмування, такий, як структурне програмування.
Об'єктно-орієнтовані програми легко розуміти, коректувати і модифікувати

12. Множини символів. Поняття ідентифікатора. Ключові слова мови


C++.

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

З символів алфавіту формуються лексеми мови:


- ідентифікатори
- ключові слова
- знаки операцій
- константи
- роздільники(дужки, крапка, кома)

Ідентифікатори – це ім’я програмного об’єкту. У ідентифікаторі можуть


використовуватись латинські букви, цифри і знак підкреслення. Прописні і
рядкові букви розрізняються, наприклад, sysop, SySoP, SYSOP – три різні
імені. Першим символом ідентифікатора може бути буква або знак
підкреслення, але не цифра. Пропуски усередині імені не допускаються.
При виборі ідентифікатора необхідно мати на увазі наступне:

-ідентифікатор не повинен збігатися з ключовими словами і іменами


використовуваних стандартних об’єктів мови.

- не рекомендується починати ідентифікатори з символу підкреслення.


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

Ключові слова – це зарезервовані ідентифікатори, які мають спеціальне


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

13. Управляючі послідовності мови С++.Використання коментарів в


програмі мови С++.
Управляючі послідовності
14. Порядок оголошення змінних в програмі С++.
15. Концепція типів даних. Типи даних мови програмування С++.
16. Цілочисельні типи даних в С++. Діапазони значень. Представлення
цілочисельних типів. Операції з цілочисельними типами.

До цілочисельних типів належать: int, unsigned int, short int, long int і т.д.

Розмір типу int не визначається стандартом, а залежить від комп’ютера і


компілятора.

Для 16-розрядного процесора під величини цього типу відводиться 2


байти, для 32-бітного – 4 байти.

Специфікатор short перед ім’ям типу указує компілятору, що під число


потрібно відвести 2 байти незалежно від розрядності процесора.
Специфікатор long означає, що ціла величина займатиме 4 байти.
Внутрішнє представлення величини цілого типу – ціле число в двійковому
коді. При використанні специфікатора signed старший біт числа
інтерпретується як знаковий. Специфікатор unsigned дозволяє
представляти тільки додатні числа, оскільки старший розряд розглядається
як частина коду числа. Таким чином, діапазон значень типу int залежить
від специфікаторів.
17. Типи з плаваючою точкою в С++. Діапазони значень
Представлення дійсних типів.
IEC 60559:1989, Binary floating-point arithmetic for microprocessor
systems. Двійкова арифметика с плаваючою точкою для мікропроцесорних
систем.
У IBM-PC сумісних комп’ютерах величини типу float займають 4 байти, з
яких один двійковий розряд відводиться під знак мантиси, 8 розрядів під
порядок і 23 під мантису. Мантиса – це число, більше 1.0, але менше 2.0.
Оскільки старша цифра мантиси завжди рівна 1, вона не зберігається.

Для величин типу double, що займають 8 байт, під порядок і мантису


відводиться 11 і 52 розряди відповідно. Довжина мантиси визначає
точність числа, а довжина порядку – його діапазон.
Стандарт визначає чотири формату представлення чисел з плаваючою
точкою:
з одинарної точністю (single-precision) 32 біта
з подвійною точністю (double-precision) 64 біта
з одинарної розширеної точністю (single-extended precision)> = 43 біт
(рідко використовується)
з подвійною розширеної точністю (double-extended precision)> = 79 біт
(зазвичай використовують 80 біт)
Типи з плаваючою комою:
float (дійсний одинарної точності);
double (дійсний з подвійною точністю).
Діапазон значень:

18. Алгоритм формування машинного представлення дійсних типів.


Операції з дійсними типами
Значення дійсних типів визначає число лише з деякою кінцевою точністю,
яка залежить від внутрішнього формату дійсного числа.
Стандарт C++ визначає три типи даних для зберігання дійсних значень:
float, double і long double.
19. Символьний та логічний тип даних. Представлення символьних та
логічних типів. Операції з символьними та логічними типами.
Під величину символьного типу відводиться кількість байт, достатня для розміщення
будь-якого символу з набору символів для даного комп’ютера, що і зумовило назву
типу. Як правило – це 1 байт. Тип char, як і інші цілі типи, може бути зі знаком і без
знаку. У величинах із знаком можна зберігати значення в діапазоні від -128 до 127. При
використанні специфікатора unsigned значення можуть знаходитися в межах від 0 до
255.
Тип wchar_t призначений для роботи з набором символів, для кодування яких
недостатньо 1 байта, наприклад, Unicode. Розмір цього типу залежить від реалізації: як
правило, він відповідає типу short. Рядкові константи типу wchar_t записуються з
префіксом L, наприклад L”Gates”.
Величини логічного типу можуть приймати тільки значення true і false, що є
зарезервованими словами. Внутрішня форма представлення слова false – 0. Будь-яке
інше значення інтерпретується як true. При перетворенні до цілого типу true має
значення 1.
20. Поняття виразу мови С++. Правила складання арифметичних
виразів.
21. Унарні операції мови С++ формат їх запису.
22. Бінарні операції мови С++ формат їх запису.
Бінарними називаються оператори, які мають два аргументи.
Найпоширенішими бінарними операторами є прості математичні операції:
оператори множення, ділення, ділення по модулю, додавання і віднімання
мають вигляд звичайних математичних операцій. Так вони і працюють, як
відповідні їм арифметичні операції:
int main()
{
setlocale(0, ".1251");
int x = 10, y = 2;
int S, D, P, A, Ost;
S = x + y;
D = x - y;
A = x / y;
Ost = x % y;
cout << "Сума = " << S << endl;
cout << "Різниця = " << D << endl;
cout << "Частка = " << A << endl;
cout << "Остача від ділення = " << Ost << endl;
system("pause");
}
23. Тернарна операція в С++, пріоритет операцій.

Тернарна умовна операція — в багатьох мовах програмування операція,


яка повертає свій другий або третій операнд в залежності від значення
логічного виразу, заданого першим операндом. Як можна судити із назви,
тернарна операція приймає всього три вказаних операнда. Аналогом
тернарної умовної операції в математичній логіці і булевій алгебрі є
умовна диз'юнкція, яка записується у вигляді [p, q, r] і реалізує алгоритм:
«Якщо p, то q, інакше r», що можно переписати як «q або r, в залежності
від p або не p».

Тернарна умовна операція використовується у виразах для отримання


одного з двох варіантів залежно від умови.
Форма запису тернарної операції в C
"умова" ? "вираз 1" : "вираз 2";
Якщо умова істинна, то виконується вираз 1, інакше (умова помилково)
виконується вираз 2.
Приклад:

a > b ? cout << a : cout << b; // если а > b, то виконується cout << a, інакше
виконується cout << b

24. Структура програми мови С. Етапи формування виконуваного


машинного коду.
Основними частинами типової структури програми на С++ є такі:
1. директиви препроцесорної обробки;
2. опис зовнішніх змінних (вихідних даних і результатів) та
функцій;
3. функції програми;
4. головна функція — програми main().

#include <iostream.h> #include <соnio.h> //директивы препроцессора


const int n=20;
void main(){
float mas[n]; //описание одномерного массива
//....................ввод элементов массива
for (int i=0; i < n; i++)
cin >> mas[i];
//........... выполнение преобразований
//.......вывод преобразованного массива
for(int i=0; i < n; i++)
cout << " " << mas[i] << " ";
getch (); // задержка результата на экране
}

Директива препроцесора #include<iostream.h> забезпечує підключення до


програми засобів зв’язку зі стандартними потоками введення-виведення
даних. Ці засоби знаходяться у заголовному файлі iostream.h, де і (input)
— введення, о (output) виведення, stream — поток, h (head) — заголовок.
Враховуючи те, що середовище Borland C++ не забезпечує затримку
результатів на екрані, у текстах програм посібника з цією метою
використано стандартний потік введення сіn (бібліотека iostream.h),
функцію введення getch() (бібліотека conio.h) тощо.
При створенні програми враховують такі основні вимоги:
● усі використанні константи, змінні, функції та нестандартні типи
повинні бути оголошеними (описаними) до їхнього першого
використання, і ці оголошення можна розміщувати в будь-якому
місці програми;
● кожний оператор мови закінчується символом «;»;
● фігурні дужки (« { » та « } ») виділяють складений оператор і все, що
подано між такими дужками, синтаксично сприймається як один
оператор;
● вкладені блоки повинні мати відступ у 3-4 символи, при цьому блоки
одного рівня вкладеності слід вирівняти за вертикаллю.

Етапи формування виконуваного машинного коду.

Розглянемо, як реалізується процес перекладу програми з мови високого


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

Розрізняють транслятори двох типів: інтерпретатори і компілятори.

Інтерпретатори призначені для послідовного пооператорного


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

Процес трансляції складається з трьох етапів -


1. лексичного аналізу
2. синтаксичного аналізу
3. генерації коду

1. Лексичний аналіз - це процес виділення окремих символьних рядків з


тексту вихідної програми. Наприклад, символи «153» мають
інтерпретуватися транслятором не як сукупність цифр, що складається
з одиниці, п'ятірки і трійки, а як єдине числове значення, яке дорівнює
ста п'ятдесяти трьом

Таким чином, лексичний аналізатор символ за символом зчитує текст


вихідної програми, визначаючи, які групи символів утворюють
самостійні одиниці тексту. Потім ці одиниці класифікуються, щоб
з'ясувати, що вони собою являють - числа, слова, арифметичні
оператори тощо. Як тільки одиницю тексту класифіковано, лексичний
аналізатор генерує її бітовий образ, що зветься лексемою і передає його
синтаксичному аналізатору.

2. Синтаксичний аналізатор аналізує програму в термінах лексичних


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

3. Генерація кодів - процес створення команд машинної мови, що


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

Об'єктний код програми, отриманий у результаті її трансляції, хоча й


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

Пов'язування об'єктного коду програми з іншими модулями виконує


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

Щоб виконати відтрансльовану програму, її завантажувальний модуль має


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

Завантажувач є частиною програми-планувальника операційної системи.


Важливість цього етапу є особливо великою в багатозадачних системах. У
подібних системах будь-яка програма змушена використовувати пам'ять
разом з іншими паралельно виконуваними процесами, причому набір
паралельно виконуваних процесів змінюється при кожному виконанні
програми. Тому точне розташування виділеної для певної програми
ділянки пам'яті залишається невідомим, аж до її виклику на виконання.

Отже, підготовка програми мовою програмування високого рівня


складається з трьох послідовних етапів: трансляції, зв'язування і
завантаження

Після виконання трансляції і зв'язування програму можна повторно


завантажувати і виконувати без звертання до її вихідного тексту.

25. Час життя та області видимості об’єктів.


При оголошенні змінних у програмі велике значення має те місце, де вони
оголошені. Від того, де оголошена змінна, залежать можливість її
використання.
У С++ можливі три місця оголошення змінних.
1. По-перше, поза будь-яких функцій, у тому числі і головної функції
main(). Така змінна називається глобальною і є видимою від місця
оголошення до кінця файлу.
2. По-друге, змінна може бути оголошена всередині блоку, у тому числі
й всередині тіла функції. Оголошена в такий спосіб змінна
називається локальною і є видимою до кінця блоку. Така змінна
поза блоком, у якому вона оголошена, невідома.
3. По-третє, змінна може бути оголошена як параметр функції. Крім
спеціального призначення, а саме для передачі даних у функцію,
параметр по відношенню до функції слід розглядати як її локальну
змінну.
Таким чином, в С++ існують 2 області видимості (2 контексти
видимості) змінних: блок і файл.
Якщо глобальна і локальна змінні мають одне і теж ім'я, тоді вважається,
що оголошені дві різні змінні зі своїми областями використання. При
цьому локальна змінна буде видима в тій функції, де вона оголошена, а
глобальна у всій програмі за виключенням функції, у якій оголошена
локальна змінна.
Об'єкт створюється, коли зустрічається його визначення і знищується, коли
його ім'я виходить із області видимості.
Оголошення використовуються для визначення інтерпретації, що надається
кожному ідентифікатору (імені). Це означає, що потрібно задати тип
ідентифікатора щоб повідомити компілятор, до якого виду об'єктів
відноситься ім'я.
Глобальні змінні створюються та ініціалізуються (тільки) один раз й
"живуть" до завершення програми (час життя глобальної змінної – до
кінця роботи програми). Об'єкти, визначені описом із ключовим словом
static, поводяться так само.
Не ініціалізована явно статична (static) змінна неявно ініціалізується
нулем.
Час життя локальної змінної – до виходу з блоку.
Часом життя і областю видимості змінних можна керувати двома
шляхами:
1) місцем оголошення змінної у програмі;
2) використанням модифікаторів auto, register, static, extern.
Автоматична (auto) змінна або константа має локальну область дії і
відома тільки всередині блоку, у якому вона визначена. Для автоматичної
змінної виділяється тимчасова пам'ять (стек). Пам'ять виділяється при
вході в блок. При виході з цього блоку пам'ять, виділена для змінної, стає
знову вільною. Якщо специфікатор класу пам'яті не визначений, то зміна
вважається автоматичною.
Регістрова (register) змінна відрізняється від автоматичної лише
пам'яттю, що виділяється для її збереження. Регістрова змінна зберігається
в регістрі процесора, і, відповідно, доступ до цієї змінної набагато
швидший, ніж до змінної, яка зберігається в оперативній пам'яті (auto). У
випадку відсутності вільних регістрів регістрова змінна стає
автоматичною.
Зовнішня (extern) змінна є глобальною змінною. Специфікатор extern
інформує компілятор, що змінна буде оголошена (без extern) в іншому
файлі, де їй і буде виділена пам'ять.
Статичній (static) змінній (константі) пам'ять виділяється після її
оголошення і зберігається до кінця виконання програми. Статичні змінні
при оголошенні ініціалізуються нульовими (логічні, цілі і дійсні)
порожніми значеннями.
Час життя змінної (глобальної або локальної) визначається за
наступними правилами.
1. Змінна, оголошена глобально (тобто поза всіма блоками), існує протягом
усього часу виконання програми.
2. Локальні змінні (тобто оголошені усередині блоку) із класом пам'яті
register або auto, мають час життя тільки на період виконання того блоку, у
якому вони оголошені. Якщо локальна змінна оголошена із класом пам'яті
static або extern, то вона має час життя на період виконання всієї програми.
Видимість змінних і функцій у програмі визначається наступними
правилами.
1. Змінна, оголошена або визначена глобально, видима від точки
оголошення або визначення до кінця вихідного файлу. Можна зробити
змінну видимою й в інших вихідних файлах, для чого в цих файлах треба її
оголосити із класом пам'яті extern.
2. Змінна, оголошена або визначена локально, видима від точки
оголошення або визначення до кінця поточного блоку. Така змінна
називається локальною.
3. Змінні з осяжних блоків, включаючи змінні, оголошені на глобальному
рівні, видимі у внутрішніх блоках. Цю видимість називають вкладеною.
Якщо змінна, оголошена усередині блоку, має то ж ім'я, що й змінна,
оголошена в осяжному блоці, то це різні змінні, і змінна з осяжного блоку
у внутрішньому блоці буде невидимою.
4. Функції із класом пам'яті static видимі тільки у вихідному файлі, у якому
вони визначені. Усякі інші функції видимі у всій програмі.
Мітки у функціях видимі протягом всієї функції.
Імена формальних параметрів, оголошені в списку параметрів
прототипу функції, видимі тільки від крапки оголошення параметра до
кінця оголошення функції.

26. Глобальні та локальні змінні.


Змінні можуть бути оголошені як усередині тіла якої-небудь функції, так і
за межами кожної з них. Змінні, оголошені усередині тіла функції,
називаються локальними. Такі змінні розміщаються в стеці програми й
діють тільки усередині тієї функції, у якій оголошені. Як тільки керування
вертається функції, що викликала дану функцію, пам'ять, виділена під
локальні змінні, звільняється.
Кожна змінна характеризується областю дії, областю видимості й часом
життя.
Під областю дії змінної розуміють область програми, у якій змінна
доступна для використання.
Із цим поняттям тісно зв'язане поняття, області видимості змінної. Якщо
змінна виходить із області дії, вона стає невидимою. З іншого боку, змінна
може перебувати в області дії, але бути невидимої. Змінна перебуває в
області видимості, якщо до неї можна одержати доступ ( за допомогою
операції дозволу видимості, у тому випадку, якщо вона безпосередньо не
видима).
Часом життя змінної називається інтервал виконання програми, протягом
якого вона існує.
Локальні змінні мають своєю областю видимості функцію або блок, у яких
вони оголошені. У той же час область дії локальної змінної може
виключати внутрішній блок, якщо в ньому оголошена змінна з тим же
іменем. Час життя локальному змінної визначається часом виконання
блоку або функції, у якій вона оголошена.
Це означає, наприклад, що в різних функціях можуть використовуватися
змінні з однаковими іменами зовсім незалежно друг від друга.
У розглянутому нижче прикладі змінні з іменем х визначені відразу у двох
функціях - в main і в Sum, що, однак, не заважає компіляторові розрізняти
їх між собою:
int Sum ( int, int ) ; // прототип функції Sum
void main ()
{
int х = 2, y = 4 ; // локальні змінні
cout << Sum ( x, у) ;
}
int Sum ( int a, int b ) // заголовок функції
{
int х = а + b ; // локальна змінна х видна тільки в тілі функції Sum
return х;
}
У програмі здійснюється обчислення суми двох цілочисельних змінних за
допомогою виклику функції Sum.
Глобальні змінні, як вказувалося раніше, оголошуються поза тілом
який-небудь із функцій і діють протягом виконання всієї програми. Такі
змінні доступні в кожній з функцій програми, яка описана після
оголошення глобальної змінної. Звідси випливає вивід, що імена локальних
і глобальних змінних не повинні збігатися. Якщо глобальна змінна не про
ініціалізована явно, вона ініціалізується значенням 0.
Область дії глобальної змінної збігається з областю видимості й
простирається від крапки її опису до кінця файлу, у якому вона оголошена.
Час життя глобальному змінної - постійне, тобто збігається із часом
виконання програми.
Загалом кажучи, на практиці програмісти намагаються уникати
використання глобальних змінних і застосовують їх тільки у випадку
крайньої необхідності, тому що вміст таких змінних може бути змінено у
середині тіла будь-якої функції, що чревате серйозними помилками при
роботі програми. Розглянемо приклад, що пояснює вищесказане:
int Test = 200; // оголошення глобальної змінної Test
void Printtest ( void ) ; // прототип функції Printtest
void main ()
{
int Test =10; // оголошення локальної змінної Test
Printtest () ; // вивід на друк Глобальна: 200
cout << "Локальна: " << Test << ' \n ' ; // вивід на друк Локальна: 10
}
void Printtest ( void ) // заголовок функції Printtest
{ cout << "Глобальна: " << Test << ' \n ' ; }
Спочатку оголошується глобальна змінна Test, якої присвоюється значення
200. Далі оголошується локальна змінна з тим же іменем Test, але зі
значенням 10. Виклик функції Printtest з main фактично здійснює
тимчасовий вихід з тіла головної функції. При цьому всі локальні змінні
стають недоступні, і Printtest виводить на друк глобальну змінну Test. Після
цього керування програмою вертається у функцію main, де конструкцією
cout виводиться на друк локальна змінна Test.
В C++ допускається оголошувати локальну змінну не тільки на початку
функції, а взагалі в будь-якому місці програми. Якщо оголошення
відбувається усередині якого-небудь блоку, змінна з таким же іменем,
оголошена поза тілом блоку, "ховається". Змінимо попередній приклад для
того, щоб продемонструвати процес приховання локальної змінної:
int Test = 200 ; // оголошення глобальної змінної Test
void Printtest ( void ) ; // прототип функції Printtest
int main()
{
int Test =10 ; // оголошення локальної змінної Test
Printtest () ; // вивід на друк Глобальна: 200
cout << "Локальна: " << Test << ' \n ' ; // вивід на друк Локальна: 10
{ // додаємо новий блок із ще однієї локальної змінної Test
int Test = 5;
cout << " Локальна: " << Test << ' \n '; // вивід на друк Локальна: 5
}
cout << " Локальна: " << Test << ' \n '; // вивід на друк Локальна: 10
}
void Printtest ( void ) // заголовок функції Printtest
{ cout << "Глобальна: " << Test << ' \n '; }
27. Порядок та формат написання команд printf(), scanf(). Параметри
команд та особливості їх застосування.
#include "stdafx.h"
#include<stdio.h>
#include<iostream>
#include <conio.h>
using namespace std;
void main()
{
int int1 = 45, int2 = 13;
float f = 3.621;
double db1 = 2.23;
char ch = 'z', *str = "Students P-112";
printf("intl = %d| int2 = %3d| int2 = %-4d|\n",int1,int2,int2);
printf ("intl = %X| int2 = %3x| int2 = %-4o|\n",int1,int2,int2);
printf("f = %f| f = %-4.2f| f = %6.1f|\n", f,f, f);
printf("f = %-8g| f = %-16e| f = %+E|\n", f,f, f);
printf("dbl = %-6.2f| db1 = %-14e| db1 = %-12.1G|\n",db1,db1,db1);
printf("ch = %c| ch = %-3c|\n", ch, ch);
printf("str = %17s|\nstr = %-17s|\nstr =%s|\n", str, str, str);
system("pause");
}
28. Правила і формат використання функції модуля math.h.
29. Оператор розгалуження if…else, особливості застосування.
30. Оператор switch особливості застосування.
31. Оператор циклу з параметром for особливості застосування.
32. Оператор циклу з передумовою while особливості застосування.
33. Оператор циклу з післяумовою do особливості застосування.

34. Оператори передачі управління goto, continue формат запису та


особливості застосування.
Використання оператора безумовного переходу goto в практиці
програмування на мові С настійно не рекомендується, так як він ускладнює
розуміння програм і можливість їх модифікацій.
Оператор goto передає управління на оператор, позначений міткою.
Приречений оператор повинен знаходитися в тій же функції, що і оператор
goto, а використовувана мітка повинна бути унікальною, тобто одне
ім'я-мітки не може бути використано для різних операторів програми.
Будь-який оператор у складеному операторі може мати свою мітку.
Використовуючи оператор goto, можна передавати управління всередину
складеного оператора. Але потрібно бути обережним при вході у
складений оператор, що містить оголошення змінних з ініціалізацією,
оскільки оголошення розташовуються перед виконуваними операторами і
значення оголошених змінних при такому переході будуть не визначені.
Оператор continue застосовується коли треба припинити або пропустити
наступну ітерацію. При його виконанні в циклі for відбувається зупинка
ітерації яка відбувається, а потім продовження роботи циклу.

35. Покажчики в мові програмування С/С++. Представлення


покажчиків. Ініціалізація покажчиків. Операції з покажчиками.
Посилання.
Присвоєння покажчику адреси існуючого об'єкту.
Надання порожнього значення:
Розадресація, або непряме звернення до об'єкту (*)
36. Загальні відомості про функції в мові програмування С++.
Стандартні функції.
37. Оголошення функцій в мові програмування С++. Значення, що
повертають функції. Механізм виклику функції в мові С++
Для створення функції її потрібно оголосити. Оголошення функції
здійснюється перед функцією main() за таким синтаксисом: /*Заголовок
функції*/ Тип_функції Назва_функції(Параметри_функції). Тип функції –
тип даних, значення якого дана функція повертає. Наприклад, якщо
функція обчислює факторіал числа n, то тип цієї функції int або long long.
Для виклику функції досить набрати її ім'я і в дужках перерахувати
аргументи:
38. Параметри функцій в мові С++, формальні і фактичні параметри.
Передача параметрів за значення і за посиланням
Параметр у програмуванні — змінна, значення якої встановлюється при
виклику функції і передається в функцію для використання в обчисленнях.
Формальний параметр — ідентифікатор або спеціальний символ мови
програмування, що використовується при описанні підпрограми
(процедури, функції). В описанні функції можуть бути вказані деякі
характеристики її параметрів. Фактичний параметр (в специфікації
окремих мов програмування також аргумент) — значення змінної або
константа, що заміщує формальний параметр при виклику функції. В
окремих мовах програмування фактичними параметрами можуть бути
вирази, рядки, ідентифікатори змінних, масивів, перемикачів, процедури та
функції тощо. Існує два способи передачі параметрів у функції - передача
за значенням і передача через посилання

39. Перевантаження функцій.


“Перевантаження” функції – це оголошення функції з тим же іменем
декілька разів. Таким чином, в деякій області видимості ім’я
“перевантажена” функція оголошується декілька разів. Щоб компілятор міг
відрізняти “перевантажені” функції, ці функції повинні відрізнятися між
собою списком вхідних параметрів. Перевантажені функції відрізняються
за списком параметрів. Списки параметрів перевантажених функцій мають
відрізнятися за такими ознаками:
· кількістю параметрів;
· якщо кількість параметрів однакова, то типами параметрів.
40. Вектори в мові С++. Логічна структура векторів, машинне
представлення, адресація елементів структур.
41. Алгоритми пошуку мінімума і максимума в одномірному масиві.
1. Беремо перший елемент і вважаємо що він мінімальний
2. Переміщуємо покажчик на наступний елемент, і якщо він менший за
мінімальний, присвоюємо мінімальному його значення
3. Повторюємо крок 2 до закінчення вектора.
4. Повертаємо мінімальне значення.
(Аналогічний алгоритм і для максимального елемента.)

42. Алгоритм знаходження суми елементів в одномірному масиві.

1. Спочатку необхідно оголосити масив.

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

3.Оголошуємо змінну для покрокового доступу до елементів одномірного


масиву починаючи з 0.

4.Виводимо на ектран елементи масива.


5.Послідовно зчитуємо елементи з масива і сумуємо їх.

6.Виводимо результат на екран.

43. Послідовний і бінарний пошук елементів вектора.

❖ Послідовний або лінійний пошук

Це самий простий вид пошуку деякого елемента серед інших, що


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

Перевагами такого пошуку є простота його реалізації, він не потребує


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

Також існує певний покращений послідовний алгоритм, який пришвидшує


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

❖ Бінарний або двійковий пошук

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


допомогою ділення деякої кількості раз цієї множини навпіл. Елемент,
який треба знайти, колись потрапить або не потрапить в одну з цих двох
частин. Бінарний пошук застосовується для відсортованих множин. Ідея
цього пошуку така: Пошук даного значення серед деякого масиву
починається, коли визначається центральний елемент цього масиву.
Значення цього елемента порівнюється зі значенням елемента, який треба
знайти. Якщо потрібне нам значення збігається з центральним, то пошук
завершено. Якщо воно або більше або менше, то створюється масив, який
складається з елементів, що знаходяться ліворуч або праворуч від
центрального значення і тепер пошук відбувається в цьому масиві.
Перевагами такого пошуку є швидкість пошуку, якщо порівнювати з
послідовним пошуком. Але є й такий недолік, що двійковий пошук може
використовуватись лише на упорядкованій множині.

44. Сортування елементів масивів. Метод прямого включення.

Один елемент завжди можна вважати відсортованим масивом довжини 1.


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

Приклад. Візьмемо кілька випадкових чисел:

45. Сортування елементів масивів. Метод прямого вибору.

Основна ідея методу полягає в тому, що на кожному кроці шукається


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

Якщо відшукано min, то він обмінюється значенням з першим елементом.

Потім операція повторюється для підмасиву a[2..n]:


46. Сортування елементів масивів. Метод “бульбашки”.

Це - найпростіший з методів сортування. Програма цього методу є


найкоротшою з усіх можливих.

Ідея полягає у тому, щоб на кожному кроці, порівнюючи сусідні елементи


між собою, міняти їх місцями, якщо вони стоять "не в тому порядку".

Таких проходів по масиву може знадобитися не менше, як (n-1), бо, якщо


найменший елемент стоїть на останньому місці, то він досягне свого
(першого) місця лише за n-1 крок сусідніх обмінів.

47. Сортування елементів масивів. Метод Шелла.

48. Масиви. Логічна і фізична структура масивів. Опис масивів в С++,


ввод вивод елементів масивів.

Логічна структура

Масив являє собою кінцеву іменовану послідовність величин одного типу,


які розрізняються за порядковим номером. Опис масивiв у програмі
відрізняється від опису простої змінної наявністю після імені квадратних
дужок «[ ]», в яких задається кількість елементів масиву (розмірність).

Фізична структура

Масив — впорядкований набір фіксованої кількості однотипних


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

Опис масивів

Загальна форма опису одновимірного масиву:

тип ім’я_масиву[розмір];

У вищенаведеному описі:
· тип – це тип елементів масиву. Він ще називається базовим типом.
Базовий тип визначає кількість даних кожного елементу, що складає
масив. Тип елементів масиву може бути як базовим типом так і
складеним (структура). Детально про базові типи даних C++
описується тут.
· розмір – кількість елементів в масиві;
· ім’я_масиву – безпосередньо ім’я масиву, за яким здійснюється
доступ до елементів масиву.

Після опису масиву, значення елементів масиву може бути нульовим або
невизначеним.
49. Поіменований тип даних (структури). Логічне і машинне
представлення. Опис структур. Опис змінних типу структура. Доступ
до полів структур.

Структура-це спеціальний тип даних, який створює користувач для


опрацювання інформації про об’єкти з деякої предметної області

Опис структури
Struct<назва типу структури>

<тип поля1><назва поля 1>;

……………………………………

<тип поля n><назва поля n>;

};

Опис обов’язково закінчується ‘;’

Доступ до конкретного поля змінної типу структура дає складене ім’я


вигляду

<назва змінної>. <назва поля>

Доступ до полів покажчика на структуру здійснюється дещо інакше

<назва вказівника>. <назва поля> || (*<назва вказівника>).<назва поля>

Поля структури розташовані в суміжних слотах пам’яті і зверт на кількох


комірок
50. Рядки символів. Введення, виведення рядків. Функції для роботи з
рядками.
51. Файли в мові С++. Файли послідовного доступу, особливості
організації текстових файлів. Команди обробки текстових файлів.
Файл – спосіб збереження інформації на фізичному пристрої.
В мовах С/С++ оператори для роботи з файлами відсутні, всі необхідні
функції включені до бібліотек. Ці функції дозволяють працювати з різними
пристроями, такими, як: Диск, Принтер, Комунікаційні канали.
Таке використання функцій можливе тому що файлова система перетворює
їх в єдинимй абстрактний логічний пристрій: потік.
Потік може бути двійковим(послідовність байтів) або
текстовим(послідовність символів).
Робота з файлами в С++ може бути організована за допомогою засобів
мови С або С++.
Засоби мови С:
File *<назва змінної>; - файлова змінна.
<назва змінної>.fopen(<Ім’я файлу>,<режим>);
Ім’я необхідно вказувати повне, інакше при роботі програми вона буде
намагатись звернутись до файлу з вказаним іменем у папці за
замовчуванням(тобто у папці, у якій розміщений виконуваний файл
програми).
Режими:
t – текстовий
b – бінарний
r – read (тільки читання)
w – write (тільки запис)
r+ - для читання і запису
a+ (append)- для дозаписування
Будь-який текстовий файл розгялається як послідовність символів, що
закінчуються термінатором eof (end of file). Кожен окремий рядок же
закінчується термінатором eol(end of line)
Фунція для запису:
Fwrite(<адреса змінної>, <розмір>,<кількість>,<ім’я файлу>);
Для визначення розміру варто скористатись оператором sizeof.
Для зчитування:
Fread(<адреса змінної>, <розмір>,<кількість>,<ім’я файлу>);
Для форматованого вводу/виводу варто використовувати fputs, fgets, fputc;

52. Файли в мові С++. Файли прямого доступу. Створення файлів


прямого доступу. Читання даних з файлів прямого доступу.
В С++ можлива робота як з текстовими, так і з двійковими (бінарними)
файлами.
Текстовий файл – файл, в якому кожний символ зберігається у вигляді
окремого байту.
Текстовий файл розбивається на рядки спеціальним символом «кінець
рядка \n» та завершується символом «кінець файлу EOF». EOF (end of file)
– відємним числом, як правило -1, що гарантує неспівпадіння із кодом
будь-якого іншого символу. Якщо в текстовому файлі
знаходяться числові дані, то після останнього числа не можуть стояти ні
пробіли, ні символ кінця рядка. Два числа в текстовому файлі вважаються
окремими, якщо вони розділені між собою хоча-б одним із наступних
символів: пробіл; символ табуляції; символ кінці рядка.
Операції з файлами в С++ можна здійснювати за допомогою файлових
вказівників та потокових операцій.
Стиль мови програмування С (файлові вказівники).
Для роботи із файлом необхідно:
1. описати вказівник на файлову змінну:
FILE *<імя файлової змінної>
2. відкрити файл за наступним синтаксисом:
FILE *fopen(filename, mode)
де:
filename – ім’я файлу, що відкривається. Файл повинен знаходитися у
папці, в якій міститься сама програма на С++, інакше необхідно задавати
повне ім’я файлу;
mode – режим відкриття файлу

При роботі із текстовими файлами в кінці специфікатора mode додається


символ t –
текстовий файл. Наприклад:
FILE *f;
if ((f=fopen("dani.in", "rt"))==NULL)
{
printf("Не можливо відкрити файл"\n);
return;
}
Тут файлова змінна f зв’язується із текстовим файлом dani.in, який
відкривається тільки для читання. В логічному операторі if виконується
перевірка успішності відкриття файлу. Якщо файл відкрити не вдалося
(==NULL), то на екран видається відповідне повідомлення і робота
програми завершується.
По завершенню роботи із файлом він повинен бути закритий функцією
fclose(). Так,
файл, відкритий у попередньому прикладі, буде закритий наступною
командою:
fclose(f)
Інформацію із текстового файлу можна читати декількома способами:
1. Посимвольно за допомогою функції putc() за наступним синтаксисом
(див приклад No1):
fputс(<імя файлової змінної>)
2. По рядках за допомогою функції fgets()за наступним синтаксисом (див
приклад No2.):
fgets(char s, int n, <імя файлової змінної>)
де:
char s – рядкова змінна, якій передається n зчитаних символів.
Зчитується або n-1 символ (n-тий символ – нульовий символ \0), або до
появи кінця рядка
(\n).
3. Читання текстового файлу за форматом здійснюється за допомогою
функції fscanf() (див
приклад No3.):
fscanf(<імя файлової змінної>, format,address)
де:
format – перелік форматів аргументів;
address char – перелік ідентифікаторів змінних, заданих своїми адресами.
При успішному читанні із файлу функція fscanf() повертає кількість
прочитаних полів,
тому організація перевірки правильності зчитування може виглядати
наступним чином (при
читанні двох даних із файлу f ):
if (fscanf(f,"%i%d",&i,&x)!=2)
{
printf("Помилка читання із файлу!");
};
Для перевірки умови досягнення кінця файлу служить функція feof().
Якщо зчитано
символ кінця файлу (EOF), то feof() повертає ненульове значення.
Для запису даних у файл використовуються функції fprintf(),fputc()та
fputs():
fprintf()аналогічна функції printf(), тільки першим аргуменом у ній є
посилання на файл,
у який виконується запис;
fputc() та fputs()аналогічні функціям putc()та puts() відповідно, тільки
першими
аргументами у них є посилання на файл, у який виконується запис.
Стиль мови програмування С++ (потокові операції).
В C++ робота із файлом здійснюється за допомогою функцій, що
знаходяться у
заготовочному файлі <fstream.h> .
Для запису даних у файл необхідно:
1. описати змінну типу ofstream за наступним синтаксисом:
ofstream <імя файлової змінної>
2. відкрити файл за допомогою функції open:
<імя файлової змінної>.open ("<імя файлу>", mode)
тут mode – задає режим відкриття файлу.
3. Записати інформацію у файл за наступним синтаксисом:
<імя файлової змінної> << <змінна>
тут <змінна> - ідентифікатор змінної, яка записується у файл.
4. Закрити файл командою <імя файлової змінної>.close().
Для читання даних з файлу необхідно:
1. описати змінну типу ifstream за наступним синтаксисом:
ifstream <імя файлової змінної>
2. відкрити файл за допомогою функції open:
<імя файлової змінної>.open ("<імя файлу>", mode)
тут mode – задає режим відкриття файлу.
3. Зчитати інформацію з файлу за наступним синтаксисом:
<імя файлової змінної> >> <змінна>
тут <змінна> – ідентифікатор змінної, якій присвоюється зчи-
тане із файлу значення.
4. Закрити файл командою <імя файлової змінної>.close().

P.S. Інформація з 13 практичної оп.


53. Динамічні структури даних. Динамічні змінні. Необхідність в
створенні динамічних змінних.

Черга. Система, що описує чергу заявок на обслуговування, має


підтримувати тип "черга", у якому елементи будуть дописуватися з однієї
сторони черги, а видалятися - з іншої. Довжина черги, її початок та кінець
є величинами змінними (FIFO - "first in - first out").

Стек. Частина операційної системи, що під час виконання програми


організовує систему викликів у деякий програмі, має організувати стек:
систему змінного об'єму, у яку заявки на виконання поступають у одній
послідовності, а виконуються у протилежній (LIFO - "last in - first out").

Дерево. Якщо у дереві кожна вершина відповідає деякому реальному


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

Послідовності. Їх ми вже розглядали, але це структури зі змінною


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

Арифметичний вираз(дерево). Для трансляції виразу, наприклад:

((x+y)*z)/(2*y-x)

транслятор розгортає дерево, що відображає структуру виразу


Динамічної змінної називається змінна, пам'ять для якої виділяється під
час роботи програми. Вони розташовуються в динамічній пам'яті, чи купі, і
видаляються з неї під час виконання програми. Для звертання до цих
змінних потрібні особливі засоби: вказівники і посилання. Динамічні
змінні створюються або оператором new, або стандартною функцією
(malloc(), calloc() чи realloc()). Знищення динамічних змінних здійснюється
оператором delete (після того, як пам’ять була виділена оператором new) чи
функцією free() (при використанні разом з ним функцій malloc() , calloc()
чи realloc()). Оператор виділення пам'яті new як операнд використовує ім'я
типу. Результатом цього оператора є вказівник на адресу динамічної
області пам’яті, що має тип операнда. Динамічна змінна зв'язується з
типом під час іляції, тому це зв'язування є статичним. Втім, динамічні
змінні зв'язуються з виділеною областю пам'яті в ході виконання програми,
тому цей вид зв'язування є динамічним.
54. Створення динамічних об’єктів. Звернення до динамічних об’єктів.
Знищення динамічних об’єктів.
Динамічне виділення пам‘яті. У цьому випадку використовується
комбінація операторів new і delete. Оператор new виділяє пам‘ять для
змінної (масиву) в спеціальній області пам‘яті, яка називається “купа”
(heap). Оператор delete звільняє виділену пам‘ять. Кожному оператору new
має відповідати свій оператор delete.

55. Створення динамічних структур типу список. Вставка та


вилучення елементів зі списку.

Списком називається впорядкована множина, що складається із змінного


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

Коли зв'язне представлення даних використовується для вирішення


прикладної задачі, для кінцевого користувача "видимим" робиться тільки
вміст інформаційного поля, а поле зв'язок використовується тільки
програмістом-розробником.

Для того, щоб додати елемент на кінець списку, необхідно покажчик на


наступний елемент (next) останнього елементу направити на новий
елемент.
Для вилучення елементу, необхідно, навпаки, перемістити покажчик
попереднього елементу на наступний(відносно даного).
56. Рекурсія. Пряма і непряма рекурсія. Глибина рекурсії. Рекурсивні
функції.
Рекурсивна функція - це функція, яка викликає саму себе. Це в разі прямої
рекурсії. Існує і непряма рекурсія - коли дві або більше функцій
викликають один одного. Коли функція викликає себе, в стеку створюється
копія значень її параметрів, після чого управління передається першому
виконуваного оператору функції. При повторному виклику процес
повторюється. Рекурсивні функції є альтернативою циклам. Прикладами
рекурсивних функцій може слугувати обчислення факторіалу.
Приклад коду:
int fact(int a){
if(a>1)a*=fact(a-1);
return a;
}
Кількість вкладених викликів функції чи процедури називається глибиною
рекурсії.
57. Шаблони функцій. Порядок задання шаблону функції.
Шаблони функцій, своїми словами,- це інструкції, згідно з якими
створюються локальні версії шаблованої функції для певного набору
параметрів і типів даних.
Насправді, шаблони функцій -це потужний інструмент у С , який значно
спрощує роботу програміста. Наприклад, нам потрібно запрограмувати
функцію, яка виводила б на екран елементи масиву. Завдання не складне!
Але, щоб написати таку функцію, ми повинні знати тип даних масиву, який
будемо виводити на екран. І тут нам говорять – тип даних не один, ми
хочемо, щоб функція виводила масиви типу int, double, float і char.
Всі шаблони функцій починаються зі слова template, після якого йдуть
кутові дужки, в яких перераховується список параметрів. Кожному
параметру повинно передувати зарезервоване слово class або typename.
Ключове слово typename говорить про те, що в шаблоні буде
використовуватися вбудований тип даних, такий як: int, double, float, char і
т. д. А ключове слово class повідомляє компілятору, що в шаблоні функції
як параметр будуть використовуватися для користувача типи даних, тобто
класи.
Приклад функції виведення масивів будь-яких типів:
template <typename T>
void printArray( T * array, int count)
{
for (int ix = 0; ix < count; ix++)
cout << array[ix] << " ";
cout << endl;
}

You might also like