Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архив WinRAR / 2_Посібник_С_002.doc
Скачиваний:
39
Добавлен:
17.05.2015
Размер:
2.7 Mб
Скачать

6.3 Порожній тип void

Визначення функції починається з типу даних значення, яке буде повертатися функцією. Але, якщо не потрібно повертати жодного значення, то використовується порожній тип void.

Наприклад, потрібно створити функцію, яка виводитиме повідомлення на екран. Такій функції не потрібно повертати жодного значення.

Приклад 6.3.Використання порожнього типу void.

#include <stdio.h>

#include <stdlib.h>

void message ()/*функція яка не повертає значення*/

{

printf( "THIS IS SPARTA!!!\n ");

}

int main ()

{

message ();

system("PAUSE");

return 0;

}

Результат роботи програми:

В списку параметрів функції також може використовуватися void, для показу того, що функція не має параметрів при виклику. Наприклад, функціяmessageмогла бути визначена як:

void message ( void )

{

printf("THIS IS SPARTA!!!\n");

}

Хоча не обов'язково вказувати voidв списку параметрів. У мові C, список параметрів може бути порожнім, якщо не потребує жодних параметрів. Необхідно писати дужки, навіть за відсутності параметрів:

message();

Наявність дужок вказує на те, що це виклик функції, а не ім'я змінної або інший оператор мови C. Наступний виклик був би неправильний:

message;

6.4 Передача аргументів у функцію

Аргументи у функцію можуть бути передані за значенням (by value).

Приклад 6.4.Передача параметрів за значенням.

int x=7, y=4, t;

t = add( x , y );

У функцію addпередаються значення змінниххіу, тобто 7 і 4 відповідно (рис. 6.3).

Рисунок 6.3 – Передача параметрів у функцію за значенням.

При виклику функції add, у локальні змінніaіbкопіюються значення зміннихxіy. Тому будь-яказміна значеньaабоbв межах функціїadd, не вплине на значення змінниххіу.

6.5 Рекурсивні функції

Рекурсивна функція – це функція, яка викликає саму себе. За допомогою рекурсії легко вирішуються такі завдання як сортування або обчислення факторіала числа.

Факторіал цілого невід'ємного числа n, записується як n!, і обчислюється за формулою:

n! = n * (n-1) * (n-2) * (n-3) * ... * 1

Наприклад, 5!, тобто факторіал п'яти, є добутком 5 * 4 * 3 * 2 * 1, який дорівнює 120.

Розглянемо рекурсивну функцію для обчислення факторіалу:

Приклад 6. Обчислення факторіалу.

#include <stdio.h>

#include <stdlib.h>

long fact(long a)

{

if (a>1)

return (a*fact(a-1));

else

return(1);

}

int main ()

{

long n;

printf("BBegiTb 4iCJlO: ");

scanf ("%i",&n);

printf(" %i! = %i ", n, fact(number));

system("PAUSE");

return 0;

}

Результат роботи програми:

Функція factвикликатиме сама себе, постійно зменшуючи аргумент наступного виклику на 1 до тих пір, поки аргумент не стане рівний 1. В цьому випадку функція поверне число 1(рис 6.5).

Рисунок 6.5 – Приклад обчислення 5! за допомогою рекурсивної функції.

6.6 Прототипи функцій

Прототип функції – це оголошення функції, яке не містить тіло функції і повідомляє компілятору:

- тип даних, який повертає функція;

- число, тип та порядок параметрів, які функція приймає.

Прототип дає можливість викликати функцію до моменту її оголошення.

Прототипи функцій використовуються для перевірки коректності виклику функцій. Виникає помилка на етапі компіляції у випадку не узгодження прототипу функції та її визначення.

Синтаксис оголошення прототипу функції наступний:

<тип> <ім’я функції> (параметр1, параметр2,…);

Цей синтаксис ідентичний визначенню функції, за винятком того що він не включає тіло самої функції, а в кінці ставиться крапка з комою (;).

Компілятор ігнорує імена змінних вказаних в прототипі функції, тобто при оголошенні прототипу достатньо вказати лише типи параметрів.

Приклад 7. Використання прототипу функції без вказання імен змінних у прототипі.

#include <stdio.h>

int function(int, int, int); /*оголошення прототипу функції*/

int main(void) /*головна програма*/

{

printf ("suma = %d \n", function (4, 5, 6));

return 0;

}

int function(int a, int b, int c) /*визначення функції*/

{

return a+b+c;

}

Приклад 7.Використання прототипів функцій.

#include <stdio.h>

#include <stdlib.h>

void nap(int a); /*оголошення прототипу функції nap*/

void Henap(int a); /*оголошення прототипу функції Henap*/

int main ()

{

int i;

do {

printf( " BBegiTb 4iCJlO(Buxig - 0): ");

scanf ("%i",& i);

nap(i);

} while (i!=0);

system("PAUSE");

return 0;

}

void nap (int a) /*визначення функції nap*/

{

if ((a%2)!=0)

printf( "napHe.\n ");

else Henap(a);

}

void Henap (int a) /*визначення функції Henap*/

{

if ((a%2)==0)

printf( "HenapHe.\n ");

else nap(a);

}

Результат роботи програми:

У прикладі 7.1 показано випадок у якому необхідно використовувати прототипи функцій.

На початку програми оголошуються прототипи функцій napіHenap:

void nap (int a);

void Henap (int a);

Прототипи дозволяють викликати функції до моменту їх визначення. На рисунку 6.5 зображено структури програм з використанням прототипу функції та без нього.

Рисунок 6.5 – Cтруктура програми з прототипом функції та без нього

У програмі з прикладу 7.1 неможливо обійтись без прототипів, так як існує потреба взаємного виклику двох функцій (функція nap викликає функцію Henap, яка в свою чергу викливає функцію nap). Якщо не використовувати прототипи, то компілятор видаватиме помилку, так як функція описана в програмі першою, викликатиме функцію, яка не описувалась в програмі раніше.

Соседние файлы в папке Архив WinRAR