Базовий курс програмування на С++. Урок 10. Функції і їхня необхідність. Глобальні і локальні змінні. |
Написав Joker | ||||||||||||||||||||||||||||||||||||||||||
Субота, 20 червня 2015 23:22 Переглядів: 7480
|
||||||||||||||||||||||||||||||||||||||||||
Я завжди буду шукати ліниву людину для роботи, Він знайде багато нових простіших способів Розв’язку поставленої задачі Білл Гейтс
Сьогодні ми вивчимо: 1. Розв’язок д/з минулого уроку. 2. Потрібність функцій, створення і виклик. 3. Return. 4. Передача аргументів. 5. Глобальні і локальні змінні. 6. Домашнє завдання.
Розв’язок д/з минулого уроку 1. Знайти суму всіх елементів.
2. Знайти максимальне і середнє значення
3. Знайти суму всіх елементів двовимірного масиву (3х7), якщо будь-який з індексів кратний 3.
Потрібність функцій, створення і виклик. Людина обирає професію, яка подобається їй. Оскільки я думаю, що дехто з вас планує або вже вибрав професію програміста, то це повинне вам подобатися. Але як і всюди, бувають такі завдання, які просто не хочеться виконувати, навіть якщо це не складно. У цьому є і ваша вина, прочитайте цитату до уроку знову і ви все зрозумієте. Все у ваших руках. Тепер ближче до теми. Інколи у програмі потрібно повторювати один і той самий код декілька разів, що призводить до багатьох недоліків. Для мене головним аргументом є те, що він засмічує код. Саме тут нам допоможуть функції. Вони виносяться за межі тіла функції main, мають власне ім’я за яким здійснюються виклики. Також функції використовуються при роботі з рекурсіями, але про це у наступних уроках. Є 2 способи створення функцій: 1. До функції main 2. За допомогою прототипа (вважається більш правильним і красивим) Хоча вважається правильним створювати функції другим способом, обидва є правильними і часто застосовуються. Давайте розберемо обидва способи. Синтаксис створення функції до main:
Давайте напишемо програму, яка виводить helloworld 10 разів на екран за допомогою функції. Ця сама програма, але тепер будемо використовувати прототипи. Також варто сказати: Заборонено створювати одну функцію в середині іншої. Але одна функція може викликати іншу.
Так, ми вже використовували це ключове слово, починаючи з першої програми. Але ми не пояснювали його роботу. Зараз саме час. Справа в тому, що функція будь-якого типу крім void повинна містити ключове слово return. Основна функція програми int main () має тип int, отже повинна містити return. У випадку з main все просто. Він сигналізує про нормальне завершення роботи програми. А у випадку з іншими функціями ми самі повинні це визначити. Розберемо це все на прикладі пошуку суму: Тепер пояснимо як працює наша програма. Спершу визначимо як наша програма повинна працювати. Ми повинні додати всі числа від 1 до n. Н-д: n=5, res= 1+2+3+4+5 = 15. Тепер прокоментуємо код. У 4 рядку створюється прототип функції, пам’ятайте про символ ; , він є обов’язковим. Далі змінна n слугує для того, щоб визначити верхню межу сумування. Починаючи з 21 рядка починається сама функція. Вона має тип int, оскільки ми сумуємо тільки цілі числа і результатом буде також ціле число. Ім’я функції я зробив використовуючи символи різним регістрів, бо це ім’я має бути унікальним. Поясню на прикладі. Нехай ми написали функцію для пошуку максимального числа і назвали її max. Але крім того ми підключили бібліотеку <algorithm> і у коді використали стандартну функцію із цієї бібліотеки теж max (ця функція також шукає максимум двох порівнянь). Тоді у нас виникає конфлікт функцій і компілятор може зрозуміти вас неправильно. Йдемо далі. У цьому ж рядку ми прописали один параметр, який також визначає верхню межу. Параметр створений з тієї причини, що змінна n прописана у функції main, а у функції SuM її просто не існує. І в кінці функції ми повертаємо у функцію main значення res. Здається пояснив все, не соромтесь задавати питання у коментарях. Передача аргументів. Давайте поговоримо про те, як комп’ютер опрацьовує наші змінні. Аргументи, що вказуються при створені функції називаються формальними. І місце у оперативній пам’яті для них створюється у момент виклику. А після виходу з функції вони видаляються. Також, з цим фактором зв’язана та властивість, що дві функції з однаковими аргументами є повністю коректними і це не призведе до будь-яких конфліктів. Давайте для кращого розуміння напишемо програму. Думаю, ви помітили, що у нас є дві пари змінних a і b. Проте жодних помилок чи попереджень і програма працює коректно. Давайте пояснимо чому так. У функцію Change (яка повинна поміняти значення змінних) насправді передаються не самі змінні a і b з функції main, а їхні копії. Для них окремо виділяється пам’ять. Далі функція міняє місцями значення двох змінних і виводить їх на екран. Після виходу з функції копії змінних видаляються, тому останній вивід нічим не відрізняється від першого. Але це тільки для змінних. При роботі з масивами, все зовсім не так. Всі зміни які були зроблені з масивом у функції збережуться і після виходу з неї. Тепер ще декілька нюансів при використанні масивів у функціях. Все це пов’язано з тим, що ім’я масива – адреса його першого елемента. Це призводить до того, що ми передаємо у функцію адресу першого елемента. Це дозволяє функції працювати зразу ж з масивом, а не з його копією. Крім цього не потрібно вказувати кількість елементів. Ось приклад такої програми: Зміни в масиві відбувалися тільки у функції, а обидва виводи у частині main. Тобто всі операції виконані з масивом у функції збереглися після виходу з функції. Також зверніть увагу на те, як ми прописали аргументи функції. Ми вказали пусті квадратні дужки ( int arr[] ). Це дає зрозуміти компілятору, що arr– масив, а не просто змінна. А уже при виклику функції change з функції main ми вказуємо просто arr.
Глобальні і локальні змінні. Спершу потрібно розібратися, що таке блок. Блок це частина програми (коду) прописаного між однією парою фігурних дужок. Наприклад, ми ставимо фігурні дужки для циклів. Це є блоком видимості для циклу. І тепер якщо ми створимо якусь змінну у цьому блоці, то після виходу з блоку (за межі циклу) ця змінна видалиться. Якщо ми створимо змінну у функції main, вона буде діяти і буде видимою тільки у функції main. І у всіх вкладених блоках які є у функції main. Це і є локальні і глобальні змінні. Локальні змінні створюються у певному блоці. Глобальні змінні створюються поза будь-якими блоками і є видимі у будь-якому місці програми. За замовчуванням глобальні змінні заповнюються нулем (з локальними змінними не так). Всі операції, що здійснюються з глобальними змінними у програмі зберігаються. Крім цього варто бути обережними, ви можете створити дві змінні з однаковим іменем (одну – глобальну, іншу - локальну). Це не призведе до помилки і компілятор вважає це коректною роботою. Але у такому випадку він буде опрацьовувати локальну змінну. Приклад:
Завдання для закріплення 1. Напишіть функцію для пошуку факторіалу. 2. Програму яка містить: - Функцію заповнення масиву з 5 елементів (заповнений рандомно від 0 до 10) - Функцію яка знаходить елемент, який повторюється найчастіше. 3. Функцію – конвертер валют. Функція має 2 аргументи. Перший аргумент – числове значення суми валюти. Якщо другий аргумент = 1, то перевести гривні у долари . Якщо другий елемент = 0, то перевести долари у гривні . Курс валют взяти за останній на момент написання д/з ( 6 Проголосувало ) Новіші матеріали:
Старіші матеріали:
3.26 Copyright (C) 2008 Compojoom.com / Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek Hliva. All rights reserved." |