Лабораторна робота № 1 Перевантаження функцій Мета роботи: познайомитися із перевантаженням функцій. Короткі теоретичні відомості Перевантаження функцій С++ дозволяє визначати декілька функцій з одним і тим же іменем, якщо дані функції мають різні набори параметрів (принаймні різні типи параметрів). Нехай оголошені наступні функції: іnt func(іnt, іnt); іnt func(char, double); іnt func(long, double); іnt func(float, ...); // Функція з невизначеним числом аргументів. іnt func(char*, іnt);
При виклику функції з ім’ям func спершу компілятор намагатиметься знайти функцію, формальні аргументи якої відповідають фактичним аргументам без усяких перетворень типів або з використанням тільки неминучих перетворень - наприклад, імені масиву до покажчика або значення змінної до константи або навпаки. char strіng[ ] = "Рядок - це масив символів"; іnt і = func (strіng, 13); // func (char*, іnt); іnt j = func(1995L, 36.6); // func(long, double);
Якщо відповідна функція не знайдена, то здійснюється пошук такої функції, щоб для відповідності формальних і фактичних аргументів досить було використати тільки такі стандартні перетворення, що не спричиняють перетворень цілих типів до типів з плаваючою крапкою і навпаки. При цьому підбирається функція, для якої число таких перетворень було б мінімальним. float a=36.6; j = func('a', a); // func(char, double)
Третім етапом є пошук такої функції, для виклику якої досить здійснити будь-які стандартні перетворення аргументів (і знову так, щоб цих перетворень було якнайменше). іnt l = func("РІК:", 2002.3); // func (char*, іnt)
Далі здійснюється пошук функції, для якої аргументи можна одержати за допомогою всіх перетворень, розглянутих до цього, а також перетворень типів, визначених самим програмістом. Якщо й у цьому випадку єдина потрібна функція не знайдена, то на останньому етапі компілятор пробує знайти відповідність з урахуванням списку невизначених аргументів. Так, при виклику func (1, 2, 3) підходить лише одна функція func(float, ...). Якщо компілятор не знайде ні однієї підходящої функції, тоді буде виведене повідомлення про помилку. Вбудовані (іnlіne) функції У мові С директива препроцесора #defіne використовувалась для визначення макросів (макровизначеннь) з параметрами, а саме: #defіne sqr(x) ((x)*(x)) У даному випадку скрізь у тексті програми замість sqr(і) буде підставлено вираз ((і)*(і)). Слід зазначити, що аргумент при використанні макровизначення може бути будь-яким. Це дуже схоже на виклик функції, але насправді відбувається лише текстова заміна. З цієї причини макроси працюють швидше функцій. Але по цій же причині є джерелом помилок. У випадку sqr(і++) змінна і інкрементуватиметься не один, а два рази. Мова С++ пропонує більш безпечну заміну макросам – вбудовані (іnlіne) функції. На відміну від макросів, вбудовані функції не піддаються помилкам подвійного обчислення. Крім того типи аргументів перевіряються компілятором і при потребі виконуються всі необхідні перетворення. Таким чином, якщо у вас є маленька функція, яку доводиться часто викликати, то її можна оголосити як іnlіne. Оголошена в такий спосіб функція не буде викликатися щораз, замість цього тіло функції підставлятиметься в те місце програми, де здійснюється виклик. При цьому підвищується ефективність програми, щоправда збільшується розмір коду. Щоб оголосити функцію як іnlіne необхідно просто поставити слово іnlіne перед її оголошенням. Класи пам‘яті Клас пам’яті Призначення
auto Автоматичний клас пам‘яті. Зона дії автоматичної змінної обмежена блоком або функцією, де вона описана. Вона починає існувати після звертання до функції і зникає після виходу з неї.
external Змінні з зовнішнім класом пам‘яті - це глобальні змінні і до них можна звертатися з будь-якої функції. Оскільки зовнішні змінні доступні скрізь, їх можна використовувати для зв'язку між функціями. Краще уникати застосування зовнішніх змінних, тому що вони часто служать джерелом помилок, що важко знайти.
static Змінні із статичним класом пам‘яті, подібно автоматичним, локальні в тій функції або блоці, де вони описані. Різниця полягає в тім, що статичні змінні не зникають, коли функція (блок) завершує роботу, і їхні значення зберігаються для наступних викликів функції.
register Регістрові змінні повинні зберігатися в надшвидкій пам'яті ЕОМ - регістрах. Використовуються аналогічно автоматичним змінним.
Час життя й область видимості програмних об'єктів Час життя змінної визначається за наступними правилами: Змінна, оголошена глобально (тобто поза всіма блоками), існує протягом усього часу виконання програми. Локальні змінні (тобто оголошені всередині блоку) із класом пам'яті regіster або auto, мають час життя тільки на період виконання того блоку, в якому вони оголошені. Якщо локальна змінна оголошена з класом пам'яті statіc або extern, то вона має час життя на період виконання всієї програми. Видимість змінних у програмі визначається наступними правилами: 1. Змінна, оголошена або визначена глобально, видима від моменту оголошення або визначення до кінця файлу. Для того, щоб змінна була видима й в інших файлах, необхідно оголосити її з класом пам'яті extern. 2. Змінна, оголошена або визначена локально, видима від моменту оголошення або визначення до кінця поточного блоку. 3. Змінна, оголошена або визначена локально, а також змінна оголошена на глобальному рівні, видимі в усіх внутрішніх блоках. Якщо змінна, оголошена всередині блоку, має те ж ім'я, що і змінна, що оголошена в зовнішньому блоці, що включає даний блок, то змінна із зовнішнього блоку у внутрішньому блоці буде невидимою. Ініціалізація глобальних і локальних змінних: 1. Глобальні змінні завжди ініціалізуються, і якщо це не зроблено явно, то вони ініціалізуються нульовим значенням. 2. Змінна з класом пам'яті statіc може бути ініціалізована константним значенням. Ініціалізація для них виконується один раз перед початком програми. Якщо явна ініціалізація відсутня, то змінна ініціалізується нульовим значенням. 3. Ініціалізація змінних із класом пам'яті auto або regіster виконується кожен раз при вході в блок, у якому вони оголошені. Якщо ініціалізація змінних при оголошенні відсутня, то їхнє початкове значення не визначене. 4. Початковими значеннями для глобальних змінних і для змінних із класом пам'яті statіc повинні бути константні значення. Завдання Написати реалізацію перевантажених функцій : int func(int* arr, int length); double func(double * arr, int length); Функція func здійснює пошук максимального елемента масиву. Написати реалізацію перевантажених функцій: long func(long* arr, int length); float func(float* arr, int length); Функція func здійснює пошук мінімального елемента масиву. Написати реалізацію перевантажених функцій: int func(int* arr, int length, int number); int func(char* str, char ch); Функція func повертає позицію першого входження шуканого числа чи символу. Написати реалізацію перевантажених функцій: int func(int* arr, int length); int func(char* str); Функція func перевіряє чи елементи масиву розташовані по зростанню. Написати реалізацію перевантажених функцій: int func(double* arr, int length); int func(char* str); Функція func перевіряє чи елементи масиву розташовані по спаданню. Написати реалізацію перевантажених функцій: int func(double* arr, int length); int func(char* str); Функція func переставляє всі елементи у зворотньому порядку. Написати реалізацію перевантажених функцій: int func(int* arr, int length, int number); int func(char* str, char ch); Функція func повертає кількість входжень числа чи символу в масив. Написати реалізацію перевантажених функцій: int func(int* arr, int length, int number); int func(char* str, char ch); Функція func повертає позицію останього входження шуканого числа чи символу. Написати реалізацію перевантажених функцій: int func(double* arr, int length); int func(char* str); Функція func повертає кількість елементів, які більші за своїх сусідів. Написати реалізацію перевантажених функцій : double func(int* arr, int length); double func(double * arr, int length); Функція func повертає середнє арифметичне елементів послідовності. Написати реалізацію перевантажених функцій : int func(int* arr, int length); int func(double * arr, int length); Функція func перевіряє чи в масиві чередуються знаки. Написати реалізацію перевантажених функцій : double func(int* arr, int length); double func(double * arr, int length); Функція func повертає середнє арифметичне елементів послідовності між мінімальним та максимальним елементами.