Функції, що не повертають значення
Функції типу void (ті, що не повертають значення) можуть розглядатися як деякий різновид команд, реалізований особливими програмними операторами. Оператор func() виконує функцію void func() , тобто передасть керування функції, доки не виконаються усі її оператори. Коли функція поверне керування в основну програму, тобто завершить свою роботу, програма продовжить своє виконання з того місця, де розташовується наступний оператор за оператором func().
Приклад 8.
#include<iostream.h>
void func1(void);
void func2(void);
main()
{
func1();
func2();
return 0;
}
void func1(void)
{
/* тіло */
}
void func2(void)
{
/* тіло */
}
Звернемо увагу на те, що текст програми починається з оголошення прототипів функцій - схематичних записів, що повідомляють компілятору ім'я та форму кожної функції у програмі. Для чого використовуються прототипи? У великих програмах це правило примушує Вас планувати проекти функцій та реалізовувати їх таким чином, як вони були сплановані. Будь-яка невідповідність між прототипом (оголошенням) функції та її визначенням (заголовком) призведе до помилки компіляції. Кожна з оголошених функцій має бути визначена у програмі, тобто заповнена операторами, що її виконують. Спочатку йтиме заголовок функції, який повністю співпадає з оголошеним раніше прототипом функції, але без заключної крапки з комою. Фігурні дужки обмежують тіло функції. В середині функцій можливий виклик будь-яких інших функцій, але неможливо оголосити функцію в середині тіла іншої функції.
Приклад 9. Програма, що розв'язує відоме тривіальне завдання - обчислює корені звичайного квадратного рівняння, проте із застосуванням функціонального підходу.
#include <iostream.h>
#include <stdlib.h>
#include <math.h>
float A,B,C;
//функція прийому даних
void GetData()
{
cout<<"Input A,B,C:";
cin>>A>>B>>C;
}
//функція запуску основних обчислень
void Run()
{
float D;
float X1, X2;
if ((A==0) && (B!=0))
{
X1 = (-C)/B;
cout<<"\nRoot: "<<X1;
exit(0);
}
D = B*B - 4*A*C;
if (D<0) cout<<"\nNo roots...";
if (D==0)
{
X1=(-B)/(2*A);
cout<<"\nTwo equal roots: X1=X2="<<X1;
}
if (D>0)
{
X1 = (-B+sqrt(D))/(2*A);
X2 = (-B-sqrt(D))/(2*A);
cout<<"\nRoot X1:"<<X1<<"\nRoot X2:"<<X2;
}
}
//головна функція програми
void main()
{
GetData();
Run();
}
Якщо в описі функції не вказується її тип, то по замовчуванню він приймається як тип int. У даному випадку обидві функції описані як void, що не повертають значення. Якщо ж вказано, що функція повертає значення типу void, то її виклик слід організовувати таким чином, аби значення, що повертається, не використовувалося б.
Просто кажучи, таку функцію неможливо використовувати у правій частині виразу. В якості результату функції остання не може повертати масив, але може повертати покажчик на масив. У тілі будь-якої функції може бути присутнім вираз return; який не повертає значення. І, насамкінець, усі програмні системи, написані за допомогою мови Сі , повинні містити функцію main(), що є вхідною точкою будь-якої системи. Якщо вона буде відсутня, завантажувач не зможе зібрати програму, про що буде отримано відповідне повідомлення.