Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпори частина 1.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
248.38 Кб
Скачать
  1. Класи пам’яті у С++. Порівняльна характеристика статичного та динамічного класів пам’яті. Кожна змінна і функція, описана в програмі мовою С++, належить до якогось класу пам’яті. Клас пам’яті змінної визначає час її існування (час життя об’єкта), область видимості й місце, де об’єкт розташовується Область видимості — це область початкового коду програми, з якого можливий коректний доступ до пам’яті або функції з використанням ідентифікатора. Час життя визначає час існування змінної в процесі виконання програми. З погляду часу життя об’єкта розрізнюють три типи об’єктів: статичні, локальні та динамічні. Об’єкти зі статичною тривалістю життя отримують розподіл пам’яті на початку виконання програми — такий розподіл пам’яті зберігається до виходу з програми, розміщується в сегменті даних. Статичний клас памяті мають змінні з глобальним часом життя.

Об’єкти з динамічною тривалістю життя створюються і знищуються спеціальними функціями керування пам’яттю, розміщуються в купі.

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

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

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

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

  1. Поняття рекурсії. Рекурсія у С++.

Рекурсія - звернення до самого себе.

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

n х (n–1) х (n–2) х. .. х 3 х 2 х 1,

причому за визначенням факторіал 1! і 0! дорівнює 1. Факторіал числа дорівнює добутку попередніх щодо нього послідовностей чисел, тобто n! = nx(n–1)!. Якщо обчислення факторіала оформити у виді рекурсивної функції, то програма може бути подана в ось якому вигляді:

// Обчислення факторіала #include <iostream.h> unsigned long factorial (unsigned int);void main( ) { int i; unsigned int n;

 cout << endl << "Введіть ціле додатне число";  cin >> n;  for (i = 0; i< = n; i++)  cout << endl << " Факторіал " << i << "!=" << factorial(i);  return; } unsigned long factorial (unsigned int num); {if (n = = 1 ¦¦ n = = 0) return 1; else  return (num*factorial(num-1)); }

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

  1. Особливості використання рекурсивних функцій у С++.

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

+ 2ге птитання

  1. Вбудовані функції. Мета застосування. Правила створення.

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

#include <iostream.h> inline int min (int xl, int yl) {if(xl<yl) return (xl); Else return (yl); } void main() { int x, y, z; { cout« endl « "Введіть два цілих числа "; сіn » х » у; z = mіn(х, у);cout« endl « " Мінімальним з " « х « " і" « у « " є " « z; }

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

Компілятор може ігнорувати модифікатор inline, якщо вбудо­ваний код надто великий, компілятор згенерує звичайний виклик функції.

  1. Препроцесор. Директива включення.

Препроцесор — програма, що вико­ристовується для обробки початкового файла на нульовій фазі компіляції і замінює символічні абревіатури в програмі на від­повідні директиви. Він відшукує інші файли, необхідні для ви­конання програми, і може змінити умови компіляції. Основна мета препроцесора — закінчити остаточний текст програми на С++. Потім остаточний текст програми зазнає компіляції. Ди­рективи препроцесора — інструкції, записані в початковому тексті програми мовою C++ і призначені для виконання препроцесором мови C++. Препроцесор мови аналізує програму до компілятора і заміщує символічні абревіатури у програмі на відповідні директиви. Директиви препроцесора називають ще командними рядками, вони починаються зі спеціального знака #, що вміщується в першій позиції рядка.

Директива #include відшукує наступне за ключовим словом #include ім'я файла і включає його в текст початкової програми.

Формат директиви є таким:

#include <ім'я файла>

#include "ім'я файла"

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

Директива #include не обмежується лише включенням заголов­ного файла. За допомогою #include можна підключати С-модулі, які необхідно компілювати сумісно з початковою програмою. Як­що, наприклад, окремий модуль вашої програми має ім'я sort.cpp, то можна, використовуючи директиву #include "sort.cpp", компі­лювати її спільно з основною програмою.

  1. Препроцесор. Створення символічних констант та макросів.

Препроцесор — програма, що вико­ристовується для обробки початкового файла на нульовій фазі компіляції і замінює символічні абревіатури в програмі на від­повідні директиви. Він відшукує інші файли, необхідні для ви­конання програми, і може змінити умови компіляції. Основна мета препроцесора — закінчити остаточний текст програми на С++. Потім остаточний текст програми зазнає компіляції. Ди­рективи препроцесора — інструкції, записані в початковому тексті програми мовою C++ і призначені для виконання препроцесором мови C++. Препроцесор мови аналізує програму до компілятора і заміщує символічні абревіатури у програмі на відповідні директиви. Директиви препроцесора називають ще командними рядками, вони починаються зі спеціального знака #, що вміщується в першій позиції рядка.

Найчастіше використовуються директиви препроцесора #define та Mnclude.

#define — може бути записана в будь-якому місці програми і має силу від місця появи до кінця файла. Директива використо­вується для визначення символічних констант. Формат директи­ви є таким:

#define <макровизначення> <рядок заміщення>

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

Схема дій директив така: щойно в тексті програми зустрінеть­ся макровизначення, воно тут же замінюється «рядком заміщен­ня». Наприклад,

#define k 10

#define pr "значення результату = %d\n" if (i<k)m = m+ 1; printf (pr, m);

Для скасування директиви #define існує директива #undefine. Вона має ось який вигляд:

#undef <макровизначення>

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]