Функції, області видимості змінних, рекурсія.
Функція - це самостійна одиниця програми, створена для вирішення конкретного завдання. Функція в мові С відіграє ту ж роль, що і підпрограми або процедури в інших мовах. Функціями зручно користуватися, наприклад, якщо необхідно обробити один і той же код програми. Як і змінні, функції треба оголошувати (declare). Функцію необхідно оголосити до її використання. Запам'ятайте це просте правило - спочатку оголоси, а потім використовуй.
Основна форма опису (definition) функції має вигляд:
тип <имя функции>(Список параметрів)
тіло функції
>
тип <имя функции>(Список параметрів);
Виклик функції робиться наступним чином:
При виконанні функції так само бути крапка з комою.
Чому треба оголошувати функцію до використання? Справа в тому, що для правильної роботи коду функції машині треба знати тип значення, кількість і типи аргументів. При виклику якої-небудь функції копії значень фактичних параметрів записуються в стек, відповідно до типів зазначеними в її прототипі. Потім відбувається перехід в функцію, що викликається.
Наведемо приклад виклику функції, яка буде друкувати рядок "Викликали функцію" на екран.
/ * Використовуємо свою функцію * /
function1 (); // Виклик функції
>
/ * Опис функції * /
void function1 (void) // Заголовок функції
> // Кінець тіла функції
Результатом роботи програми буде рядок надрукована на екрані.
Зверніть увагу на заголовок в описі функції! Після нього не ставиться крапка з комою.
Директива препроцесора (preprocessor directive) просто вставляє текстовий файл stdio.h в текст нашої програми. Причому вставляє туди де стоїть ця директива. Якщо ви приберете або закоментіруете рядок #include
Зверніть увагу ще на те, що тип значення у нашій функції void (порожньо). Це означає, що функція не повертатиме ніякого значення.
Функції повертають значення.
Давайте розглянемо приклад в якому опишемо дві функції, відповідно оголосимо їх і послідовно викличемо. Але в цьому прикладі для однієї функції ми вкажемо тип значення - int.
/ * Дві наших функції * /
int x; // Оголошуємо змінну x (глобальна змінна)
void main (void)
void function1 (void); // Оголошуємо функцію function1 ()
int function2 (); // function2 () буде повертати значення типу int
x = 10; // Надаємо змінної x значення 10
printf ( "До виклику функції function2 () x одно. \ n", x);
function1 (); // Викликаємо функцію function1 ()
x = function2 (); // Викликаємо функцію function2 ()
printf ( "Після виклику функції function2 () x одно. \ n", x);
>
/ * Опис наших функцій * /
void function1 (void)
printf ( "Зроблений виклик першої функції \ n");
>
int function2 (void)
int y; // Оголошуємо локальну змінну
y = x + 10;
return y; // Повертаємо значення y
>
Тепер давайте подивимося текст програми. Після рядка #include
У тілі main () ми оголошуємо дві функції, одна з яких може повертати значення типу int. Далі ми присвоюємо змінної x значення 10, так як x це глобальна змінна, то ця змінна буде видна функції main () тобто функція main () може використовувати цю змінну. Після цього присвоєння ми виводимо значення x на екран.
На екрані монітора з'явиться наступний рядок - "До виклику функції function2 () x дорівнює 10".
Зверніть увагу на виклик функції printf () -
printf ( "До виклику функції function2 () x одно. \ n", x);
У рядку після сиволов. варто символ \ n. \ N - керуючий символ він означає, що необхідно перейти на новий рядок.
Далі ми викликаємо функцію function1 (). Ця функція просто виводить рядок "Зроблений виклик першої функції \ n" на екран і так як в рядку стоїть \ n, то буде здійснено перехід на новий рядок.
У наступному рядку x = function2 (); змінна x набуває значення яке поверне функція function2 (). Подивіться на опис функції function2 (). У тілі цієї функції ми оголошуємо змінну y, а далі змінної y ми присвоюємо значення змінної x + 10. Так як x - глобальна змінна (вона видна для функції function2) все буде працювати.
Далі йде рядок return y; за допомогою оператора return ми повертаємо значення змінної y. Запам'ятайте, що якщо функція повертає значення, то в тілі цієї функції обов'язково повинен бути присутнім оператор return (він може бути і не один). Ну так от за допомогою оператора return ми повертаємо значення локальної змінної y в зухвалу функцію main ().
Тепер подивимося тіло функції main () Наступним рядком після x = function2 (); є рядок printf ( "Після виклику функції function2 () x одно. \ n", x); яка виводь значення зміненої змінної x;
На екрані з'явиться рядок - "Після виклику функції function2 () x дорівнює 20".
Функції з параметрами.
Функції мови С можуть мати параметри. Ці параметри передаються в функцію і там обробляються. Ще раз покажемо основну форму опису функції
тип <имя функции>(Список параметрів)
тіло функції
>
У списку параметрів для кожного параметра має бути вказаний тип.
Приклад правильного списку параметрів:
function (int x, char a, float z)
Приклад неправильного списку параметрів:
function (int x, a, float z)
Давайте розглянемо все це на прикладі. Нехай у нас буде функція у якій присутній один параметр x. Функція буде повертати квадрат значення x.
int square (int x)
x = x * x; // Символ * це операція множення
return x;
>
Тепер давайте розглянемо приклад функції, яка буде виводити значення змінної z типу float на екран.
void myout (float z) // Змінна z є формальним параметром.
printf ( "Z =% f", z); //% f - означає, що виводиться число з плаваючою точкою
>