Програмування С, С++теорія та практика (частина 1)
1.16.2 Функції, що не повертають значення
Функції типу уоій (ті, що не повертають значення), подібні до процедур Паскаля. Вони можуть розглядатися як деякий різновид команд, реалізований особливими програмними операторами. Оператор /ипс(); виконує функцію уоій /ипс() , тобто передасть керування функції, доки не виконаються усі її оператори. Коли функція поверне керування в основну програму, тобто завершить свою роботу, програма продовжить своє виконання з того місця, де розташовується наступний оператор за оператором /ипс().
/♦демонстраційна програма*/
#іпс1игіе<8'Ьгііо. Ь>
Vоій. £ипс1 ^оій.) ;
Vоій. £ипс2 ^оій.) ; таіп()
{
£ипс1 () ;
£ипс2 () ; ге'Ьигп 0 ;
}
Vоій. £ипс1 ^оій.)
{
/* тіло */
}
Vоій. £ипс2 ^оій.)
/* тіло */
Звернемо увагу на те, що текст програми починається з оголошення прототипів функцій - схематичних записів, що повідомляють компілятору ім’я та форму кожної функції у програмі. Для чого використовуються прототипи? У великих програмах це правило примушує Вас планувати проекти функцій та реалізовувати їх таким чином, як вони були сплановані. Будь-яка невідповідність між прототипом (оголошенням) функції та її визначенням (заголовком) призведе до помилки компіляції. Кожна з оголошених функцій має бути визначена у програмі, тобто заповнена операторами, що її виконують. Спочатку йтиме заголовок функції, який повністю співпадає з оголошеним раніше прототипом функції, але без заключної крапки з комою. Фігурні дужки обмежують тіло функції. В середині функцій можливий виклик будь-яких інших функцій, але неможливо оголосити функцію в середині тіла іншої функції. Нагадаємо, що Паскаль дозволяє працювати із вкладеними процедурами та функціями.
Надалі розглянемо приклад програми, що розв’язує відоме тривіальне завдання - обчислює корені звичайного квадратного рівняння, проте із застосуванням функціонального підходу:
#іпс1ийе <з,Ьгііо.Ь>
#іпс1ийе <з,Ьгі1іЬ.Ь>
#іпс1ийе <сопіо.Ь>
#іпс1ийе <та'ЬЬ.Ь>
£1оа£ А ,В,С;
/♦функція прийому даних*/
Vоій. ЄеШа'ЬаО {
с1гзсг() ;
ргіп££("Іпри£ А,В,С:");
зсап£("%£%£%£",&А,&В,&С);
}
/♦функція запуску основних обчислень*/
Vоій. К.ип()
{
£1оа£ Б;
£1оа£ XI, Х2;
і£ ( (А==0) && (В!=0))
{
Х1 = (-С)/В;
ргіп'Ь£("\пКоо'Ь: %£",Х1);
ехі£(0);
}
Б = В*В - 4*А*С;
і£ (Б<0) ргіп'ЬЕСХгіИо гоо'Ьз..."); і£ (Б==0)
{
Х1=(-В) / (2*А) ;
ргіп^£("\пТмо едиаі гоо£з: Х1=Х2=%£",Х1);
}
і£ (Б>0)
{
Х1 = (-В+здг^(Б))/(2*А);
Х2 = (-В-здг^(Б))/(2*А);
ргіп'Ь£("\пКоо'Ь Х1: %£\пКоо'Ь Х2: %£",Х1,Х2);
}
}
/♦головна функція програми/
Vоій. таіп ()
{
Єе'ЬБа'Ьа () ;
Кип () ;
}
Якщо в описі функції не вказується її тип, то по замовчуванню він приймається як тип іпі. У даному випадку обидві функції описані як уоій, що не повертають значення. Якщо ж вказано, що функція повертає значення типу уоій, то її виклик слід організовувати таким чином, аби значення, що повертається, не використовувалося б.
Просто кажучи, таку функцію неможливо використовувати у правій частині виразу. В якості результату функції остання не може повертати масив, але може повертати покажчик на масив. У тілі будь- якої функції може бути присутнім вираз геіигп; який не повертає значення. І, насамкінець, усі програмні системи, написані за допомогою мови Сі , повинні містити функцію таіп(), що є вхідною точкою будь-якої системи. Якщо вона буде відсутня, завантажувач не зможе зібрати програму, про що буде отримано відповідне повідомлення.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
