
- •Як описуються цілі числа?
- •Порядкове читання вводу.
- •Що робить функція-член get ()?
- •Клас string.
- •Створення структури.
- •Що робить оператор enum?
- •Як робиться перерахування значень?
- •1. Змінна і змінна показника.
- •Копіювання рядка із масиву.
- •Використання операцій new та delete.
- •13. Отримання простору пам’яті.
- •Комбіновані операції присвоювання
- •Вирази відношень
- •Аналіз умови циклу:
- •Логічні оператори.
- •Простий файловий ввід-вивід символьної інформації.
- •Деякі основні факти, що використовують cout у консольному виводі.
- •Файловий ввід.
- •Як вказати діапазон елементів у масиві?
- •Як зробити передачу адреси замість передачі самої структури?
- •Використання посилальних аргументів.
- •Аргументи, що визначаємо за замовчуванням.
- •Перевантаження функції.
- •Моделі пам’яті і простір імен - Окрема компіляція програм
- •Директива #include.
- •Об’ява структур.
- •Довгочасність існування області зберігання, області видимості та компоновки.
- •Область видимості і зв’язування.
- •Автоматична довгочасність збереження.
- •Автоматичні змінні та стек.
- •Регістрові змінні.
- •П’ять видів змінних
- •Мовне зв’язування, котре дотикається функції.
Як зробити передачу адреси замість передачі самої структури?
Для того, що зробити передачу адреси замість передачі самої структури, потрібно переписати функції так, щоб вони використовувалися в якості аргументів показника на структури. По-першому, роздивимося, як можна переписати функцію show_polar (). Для цього потрібно внести три зміни:
При виклику функції передати ій адресу структури (&pplace) замість самої структури (pplace).
Визначити формальний параметр як показник на структуру polar – це є polar*. Оскільки функція не повинна модифікувати структуру, то додаткова використовується модифікатор const.
Оскільки формальний параметр зараз буде показником на структуру замість самої структури, використовують операцію –> замість операції точки.
Після внесення цих змін функція буде виглядати таким чином:
//відображаючи полярні координати, перетворюємо кут у градуси
void show_polar (const polar * pda)
{
using namespace std;
const double Rad_to_deg = 57.295777951;
cout << “відстань = ” << pda->angle * Rad_to_deg;
cout << “, кут = ” << pda->angle * Rad_to_deg;
cout << “, градусів\n”;
}
Як зробити, передаючи функції два показника на структуру?
Зараз змінюємо rect_to_polar (). Це можна зробити, передаючи функції два показника на структуру, що містить результат перетворення. Замість повернення нової структури функція модернізує існуючу структуру у викликаної функції. Тому, хоча перший аргумент – константний показник, другий – не константний. У всьому іншому застосовують ті ж принципи, що використовувалися для переводу show_polar() до аргументів показників.
Функції та об’єкти класу string.
Хоча рядки у стилі С і клас string слугують одним й тим же цілям, клас string більш похожий на структуру, чим на масив. Наприклад, можна присвоїти структуру іншій структурі і об’єкт – іншому об’єкту. Можна передати структур як єдине ціле функції, і точно так же передати об’єкт. Коли потрібно декілька рядків, то можна об’явити одновимірний масив об’єктів string замість двовимірного масиву char.
Програма сприймає об’єкти string як будь-який вбудований тип аналогічно int.
Коли не приймати до уваги getline (), то ця програма сприймає об’єкти string як будь-який вбудований тип аналогічно int. Коли потрібний масив string, то використовується звичайний формат об’яви масиву:
string list [SIZE]; //масив із 5 елементів string
Кожний елемент масиву list – це об’єкт string, котрий можна використовувати наступним чином:
getline (cin, list [i]);
Аналогічно, формальний аргумент sa – показник на об’єкт string , тому sa[i] – об’єкт типу string, і він може використовуватися відповідно:
cout << i + 1 << “: “ << sa[i] << end1;
Рекурсія.
Рекурсія з одиночним рекурсивним викликом
Функції С++ можуть викликати самі себе. Ця можливість називається рекурсією. Рекурсія – важливий інструмент для деяких областей програмування, таких як штучний інтелект.
Звичайний метод у тому, що рекурсивний виклик полягає в операторі if. Наприклад, рекурсивна функція типу void за ім’ям recurs () може мати наступну форму:
void recurs (список Аргументів)
{
оператори1
if (перевірка)
recurs (Аргументи)
оператори2
}
Коли перевірка повертає false, то ланцюг викликів зупиняється. До тих пір, поки умова оператора if остається істинною, кожний виклик recurs () виконує оператори1 і потім викликає нове втілення recurs (), не досягаючи конструкції оператори2. Потім, коли поточний виклик завершається, управління повертається попередньому екземпляру recurs (), котрий викликав його. Цій екземпляр виконує свій розділ оператори2 і припиняється, повертаючи управління попередньому виклику, і так далі.
Таким чином, коли відбувається 5 вбудованих викликів recurs (), то перший розділ оператори1 виконується 5 разів у тому порядку, в якому відбулися виклики, а потім 5 разів в зворотному порядку відбувається розділ оператори2. Після входу у 5 рівнів рекурсії програма повинна пройти знову ці 5 рівнів. Наступна програма демонструє описану поведінку рекурсії.
Рекурсія зручна тоді, коли потрібно викликати повторюване поділення задачі на дві різні схожі під задачі. Безперервна подвоєння кількості викликів функції, а разом з ними і кількості змінних, що зберігаються, робить таку форму рекурсії поганим рішенням при достатньо великому числі рівнів.
ЛЕКЦІЯ 25.
Показники на функції.
Функції, як і елементи даних, мають адреси. Адрес функції – це адреса у пам’яті. Знати цій адрес іноді корисно для програми. Наприклад, можна написати функцію, котра приймає адресу іншої функції в якості аргументу. Це дозволяє першій функції знайти другу функцію та запустити її. Щоб це робити потрібно виконати наступне:
Отримати адресу функції.
Оголосити показник на функцію.
Використати показник на функцію для її виклику.
Отримання адреси функції.
Для отримання адреси функції треба використовувати ім’я функції без дужок. Але коли треба передати функцію в якості аргументу, то передається її ім’я. Для наочності розглянемо це на прикладах.
process (think); //передача адреси think () функції process ()
thought (think ()); //передача значення think (), що повертається, функції thought ()
Оголошення показника на функцію.
Щоб об’явити показник на тип даних, потрібно явно специфікувати тип, на котрій буде вказувати цій показник. Аналогічно, показник на функцію повинний явно специфікувати, на функцію якого типу він буде вказувати. Це позначає, що оголошення повинно ідентифікувати тип повернення функції і її сигнатуру (список аргументів). Оголошення повинно надавати ту ж інформацію про функцію, котру надає і його прототип. Розглянемо функцію з наступним прототипом:
double pam (int); //прототип
Ось як повинна виглядати об’ява відповідного типа показника:
double (*pf) (int); // pf вказує на функцію, котра приймає один аргумент
//типу int і повертає тип double
Оскільки pam – функція, тотеж саме представляє собою (*pf). Коли (*pf) – функція, то pf – показник на неї. Псля вірного оголошення pf можна привласнювати адресу підходящої функції:
double pam (int); //прототип
double (*pf) (int);
pf = pam; // pf зараз вказує на функцію pam ()
Припустимо, що застосуємо функцію estimate (), яка приймає кількість рядків коду, котрий потрібно написати і адресу алгоритму оцінки – функції, такої як pam (). Тоді вона повинна мати наступний прототип:
void estimate (int line, double (*pf) (int));
Це оголошення повідомляє, що другий аргумент є показником на функцію, яка приймає аргумент int і повертає значення double.
Щоб змусити estimate () використовувати функцію pam (), то їй передається адреса pam.
estimate (50, pam); //виклик повідомляє estimate (), що вона повинна
//використовувати pam ()
Використання показника для виклику функції.
Розглянемо, що дозволяє використовувати показник для виклику функції, що вказана. Для цього зробимо використання (*pf), як б це було ім’я функції:
double pam (int); //прототип
double (*pf) (int);
pf = pam; // pf зараз вказує на функцію pam ()
double х = pam (4); //викликати pam (), використовуючи її ім’я
double у = (*pf) (5); //викликати pam (), використовуючи показник pf
С++ дозволяє застосовувати, як ім’я функції.
double у = pf (5); //викликати pam (), використовуючи показник pf.
Функції у С++.
Функції – це програмні модулі С++. Щоб застосовувати функцію, то повинні представити її визначення і прототип, після чого її можна викликати.
Визначення функції – це код, який реалізує її алгоритм. Прототип функції описує її інтерфейс: скільки вона приймає параметрів і якого типу, а також який тип повертає його значення, коли воно є.
Вбудовані функції С++.
Коли у програмі зустрічається команда виклику функції, програма зберігає адресу команди, яка слідує відразу після виклику функції, копіює аргументи функції у стек (блок пам’яті), переходить до комірки пам’яті, яка позначає початок функції, виконує код функції (можливо, розміщуючи повертаємо значення у регістр), а потім переходить до команди, адреса котрої збережена. Переходи і запам’ятовування відповідних адрес тягне за собою додаткові витрати часу, що зв’язані з використанням функції.
Вбудовані функції С++ є цьому альтернативою. Компілятор підставляє замість виклику функції її код. Таким чином, вбудовані функції виконуються швидше, чим звичайні, але за це потрібно платити додатковою пам’яттю. Коли у 19 різних місцях програма виконує виклик однієї й тій самій вбудованої функції. то її код буде містити 10 копій цієї функції.
Щоб скористатися вбудованою функцією, потрібно хоча б одне із наступних дій:
Випередити об’яву функції ключовим словом inline.
Випередити визначення функції ключовим словом inline.
Загально прийнято розміщувати повний опис (заголовок і увесь код функції) туди, де зазвичай знаходиться прототип.
Посилальні змінні.
Посилання – це ім’я, що є псевдонімом, або альтернативним ім’ям, для раніш оголошеної змінної. Основне призначення посилань – їх використання в якості аргументів функцій. Посилання відаграють важливу роль при створенні класів.
Символ & використовується для визначення адреси змінної. С++ додає символу & додатковий сенс і використає його для об’яви посилань. Наприклад, щоб rodents стало альтернативним ім’ям для змінної rats, потрібно написати наступне6:
int rats;
int & rodents = rats; // rodents стає псевдонімом імені rats
У цьому випадку операція сприймається як частина ідентифікатора типа даних. Вираз int & являє собою посилання на int. Об’ява посилання дозволяє взаємозаміняемо використовувати ідентифікатори rats і rodents. Вони посилаються на одне й теж значення, а також на одну адресу пам’яті.
Найчастіше посилання використовуються в якості функції, при цьому ім’я змінної у функції стає псевдонімом змінної із програми, що викликається. Такий метод передачі аргументів називається передачею за посиланням. Передача параметрів за посиланням дозволяє функції, що викликається, отримати доступ до змінних у функції, що викликається.
ЛЕКЦІЯ 26.