Функции в програмирането на C с примери: рекурсивни и вградени
Какво е функция в C?
Функция в програмирането на C е многократно използваем блок от код, който прави програмата по-лесна за разбиране, тестване и може лесно да се модифицира, без да се променя извикващата програма. Функциите разделят кода и модулират програмата за по-добри и ефективни резултати. Накратко, по-голямата програма е разделена на различни подпрограми, които се наричат функции
Когато разделите голяма програма на различни функции, става лесно да управлявате всяка функция поотделно. Всеки път, когато възникне грешка в програмата, можете лесно да проучите дефектните функции и да коригирате само тези грешки. Можете лесно да извиквате и използвате функции, когато са необходими, което автоматично води до спестяване на време и пространство.
Библиотека Vs. Дефинирани от потребителя функции
Всяка "C" програма има поне една функция, която е основната функция, но една програма може да има произволен брой функции. Функцията main () в C е начална точка на програма.
В програмирането на C функциите са разделени на два типа:
- Функции на библиотеката
- Дефинирани от потребителя функции
Разликата между библиотеката и дефинираните от потребителя функции в C е, че не е необходимо да пишем код за библиотечна функция. Той вече присъства в заглавния файл, който винаги включваме в началото на програмата. Просто трябва да въведете името на функция и да го използвате заедно с правилния синтаксис. Printf, scanf са примерите за библиотечна функция.
Като има предвид, че дефинираната от потребителя функция е вид функция, в която трябва да напишем тяло на функция и да извикаме функцията винаги, когато изискваме функцията да извърши някаква операция в нашата програма.
Дефинирана от потребителя функция в C винаги се пише от потребителя, но по-късно може да бъде част от библиотеката на C. Това е основно предимство на програмирането на C.
Функциите за програмиране на C са разделени на три дейности като,
- Декларация за функция
- Определение на функцията
- Извикване на функция
Декларация за функция
Декларирането на функция означава писане на име на програма. Това е задължителна част за използване на функции в кода. В декларация на функция ние просто указваме името на функция, която ще използваме в нашата програма като декларация на променлива. Не можем да използваме функция, освен ако не е декларирана в програма. Декларацията на функция се нарича още „Функция прототип"
Декларациите на функцията (наречени прототип) обикновено се правят над функцията main () и приемат общата форма:
return_data_type function_name (data_type arguments);
- - върнат_тип_данни: е типът данни на функцията стойност, върната обратно към извикващия оператор.
- - име на функция: последвано от скоби
- Аргументи имената с техните декларации за тип данни по избор се поставят в скобите.
Разглеждаме следната програма, която показва как да декларираме кубична функция за изчисляване на кубичната стойност на целочислена променлива
#include <stdio.h> /*Function declaration*/ int add(int a,b); /*End of Function declaration*/ int main() {
Имайте предвид, че функцията не връща непременно стойност. В този случай се използва ключовата дума void.
Например, декларацията на функцията output_message показва, че функцията не връща стойност: void output_message();
Определение на функцията
Дефинирането на функция означава просто да напишете тялото на функция. Тялото на функция се състои от изрази, които ще изпълнят конкретна задача. Тялото на функцията се състои от единичен или блок от изрази. Освен това е задължителна част от функцията.
int add(int a,int b) //function body { int c; c=a+b; return c; }
Извикване на функция
Извикването на функция означава извикване на функция винаги, когато е необходимо в дадена програма. Всеки път, когато извикаме функция, тя изпълнява операция, за която е проектирана. Извикването на функция е незадължителна част от програма.
result = add(4,5);
Ето пълния код:
#include <stdio.h> int add(int a, int b); //function declaration int main() { int a=10,b=20; int c=add(10,20); //function call printf("Addition:%d\n",c); getch(); } int add(int a,int b) //function body { int c; c=a+b; return c; }
Изход:
Addition:30
Функционални аргументи
Аргументите на функцията се използват за получаване на необходимите стойности чрез извикването на функцията. Те са съгласувани по позиция; първият аргумент се предава на първия параметър, вторият на втория параметър и т.н.
По подразбиране аргументите се предават по стойност в който се дава копие на данните на извиканата функция. Действително предадената променлива няма да се промени.
Разглеждаме следната програма, която демонстрира параметри, предавани по стойност:
int add (int x, int y); int main() { int a, b, result; a = 5; b = 10; result = add(a, b); printf("%d + %d\ = %d\n", a, b, result); return 0;} int add (int x, int y) { x += y; return(x);}
Резултатът от програмата е:
5 + 10 = 15
Имайте предвид, че стойностите на a и b, предадени на функцията за добавяне, не бяха променени, защото само нейната стойност беше предадена в параметъра x.
Променлив обхват
Обхватът на променливите означава видимостта на променливите в кода на програмата.
В C променливите, които са декларирани във функция, са локални за този блок от код и не могат да бъдат препращани извън функцията. Въпреки това променливите, които са декларирани извън всички функции, са глобални и достъпни от цялата програма. Константи, декларирани с a #дефинирайте в горната част на програма са достъпни от цялата програма. Разглеждаме следната програма, която отпечатва стойността на глобалната променлива както от основна, така и от дефинирана от потребителя функция:
#include <stdio.h> int global = 1348; void test(); int main() { printf("from the main function : global =%d \n", global); test () ; return 0;} void test (){ printf("from user defined function : global =%d \n", global);}
Резултат:
from the main function : global =1348 from user defined function : global =1348
Обсъждаме подробностите по програмата:
- Декларираме целочислена глобална променлива с 1348 като начална стойност.
- Ние декларираме и дефинираме функция test(), която нито приема аргументи, нито връща стойност. Тази функция отпечатва само стойността на глобалната променлива, за да покаже, че глобалните променливи могат да бъдат достъпни навсякъде в програмата.
- Отпечатваме глобалната променлива в основната функция.
- Извикваме тестовата функция, за да отпечатаме стойността на глобалната променлива.
В C, когато аргументите се подават към параметрите на функцията, параметрите действат като локални променливи, които ще бъдат унищожени при излизане от функцията.
Когато използвате глобални променливи, използвайте ги с повишено внимание, защото могат да доведат до грешки и могат да се променят навсякъде в програмата. Те трябва да бъдат инициализирани преди употреба.
Статични променливи
Статичните променливи имат локален обхват. Те обаче не се унищожават при излизане от функцията. Следователно статичната променлива запазва стойността си завинаги и може да бъде достъпна, когато функцията бъде въведена отново. Статичната променлива се инициализира, когато се декларира и се нуждае от префикс static.
Следната програма използва статична променлива:
#include <stdio.h> void say_hi(); int main() { int i; for (i = 0; i < 5; i++) { say_hi();} return 0;} void say_hi() { static int calls_number = 1; printf("Hi number %d\n", calls_number); calls_number ++; }
Програмата показва:
Hi number 1 Hi number 2 Hi number 3 Hi number 4 Hi number 5
Рекурсивни функции
Помислете за факториела на число, което се изчислява, както следва 6! =6* 5 * 4 * 3 * 2 * 1.
Това изчисление се извършва като многократно изчисляване на факт * (факт -1), докато факт стане равен на 1.
Рекурсивна функция е функция, която се извиква сама и включва условие за изход, за да завърши рекурсивните извиквания. В случай на изчисляване на факторно число, условието за излизане е факт равно на 1. Рекурсията работи чрез „подреждане“ на извиквания, докато условието за излизане стане вярно.
Например:
#include <stdio.h> int factorial(int number); int main() { int x = 6; printf("The factorial of %d is %d\n", x, factorial(x)); return 0;} int factorial(int number) { if (number == 1) return (1); /* exiting condition */ else return (number * factorial(number - 1)); }
Програмата показва:
The factorial of 6 is 720
Тук обсъждаме подробности за програмата:
- Ние декларираме нашата рекурсивна факторна функция, която приема целочислен параметър и връща факториела на този параметър. Тази функция ще се извика сама и ще намали броя до излизане или до достигане на основното състояние. Когато условието е вярно, генерираните преди това стойности ще бъдат умножени една по друга и се връща крайната факторна стойност.
- Ние декларираме и инициализираме целочислена променлива със стойност „6″ и след това отпечатваме нейната факторна стойност, като извикаме нашата факторна функция.
Разгледайте следната диаграма, за да разберете по-добре рекурсивния механизъм, който се състои в извикване на самата функция до достигане на основния случай или условието за спиране и след това събираме предишните стойности:
Вградени функции
Функцията в C програмирането се използва за съхраняване на най-често използваните инструкции. Използва се за модулиране на програмата.
Всеки път, когато се извика функция, показалецът на инструкцията прескача към дефиницията на функцията. След изпълнение на функция указателят на инструкция се връща обратно към оператора, откъдето е прескочил до дефиницията на функцията.
Винаги, когато използваме функции, ние изискваме допълнителна показалка глава, за да преминете към дефиницията на функцията и да се върнете към израза. За да елиминираме нуждата от такива глави на показалеца, ние използваме вградени функции.
Във вградена функция извикването на функция се заменя директно от действителен програмен код. Не прескача към нито един блок, защото всички операции се извършват вътре във вградената функция.
Вградените функции се използват най-вече за малки изчисления. Те не са подходящи, когато са включени големи изчисления.
Вградената функция е подобна на нормалната функция, с изключение на това, че ключовата дума inline се поставя преди името на функцията. Вградените функции се създават със следния синтаксис:
inline function_name () { //function definition }
Нека напишем програма за внедряване на вградена функция.
inline int add(int a, int b) //inline function declaration { return(a+b); } int main() { int c=add(10,20); printf("Addition:%d\n",c); getch(); }
Изход:
Addition: 30
Горната програма демонстрира използването на вградена функция за събиране на две числа. Както виждаме, върнахме събирането на две числа само във вградената функция, без да пишем допълнителни редове. По време на извикване на функция току-що сме предали стойности, върху които трябва да извършим събиране.
Oбобщение
- Функцията е минипрограма или подпрограма.
- Функциите се използват за модулиране на програмата.
- Библиотечните и дефинираните от потребителя са два вида функции.
- Функцията се състои от декларация, тяло на функция и част за извикване на функция.
- Декларацията на функцията и тялото са задължителни.
- Извикването на функция може да бъде незадължително в програма.
- C програмата има поне една функция; това е основната функция ().
- Всяка функция има име, тип данни за върната стойност или празнота, параметри.
- Всяка функция трябва да бъде дефинирана и декларирана във вашата C програма.
- Имайте предвид, че обикновените променливи в C функция се унищожават веднага щом излезем от извикването на функцията.
- Аргументите, предадени на функция, няма да бъдат променени, защото са предадени по стойност none по адрес.
- Обхватът на променливите се нарича видимост на променливите в програмата
- Има глобални и локални променливи в C програмиране