Какво е функция в C?
Функцията в програмирането на C е многократно използван блок код, който прави програмата по-лесна за разбиране, тестване и може лесно да бъде модифицирана, без да се променя извикващата програма. Функциите разделят кода и модулират програмата за по-добри и ефективни резултати. Накратко, по-голяма програма е разделена на различни подпрограми, които се наричат функции
Когато разделите голяма програма на различни функции, става лесно да управлявате всяка функция поотделно. Всеки път, когато възникне грешка в програмата, можете лесно да разследвате дефектни функции и да коригирате само тези грешки. Можете лесно да се обаждате и да използвате функции, когато са необходими, което автоматично води до спестяване на време и място.
В този урок ще научите -
- Библиотека Vs. Потребителски дефинирани функции
- Декларация за функцията
- Определение на функцията
- Извикване на функция
- Функционални аргументи
- Променлив обхват
- Статични променливи
- Рекурсивни функции
- Вградени функции
Библиотека Vs. Потребителски дефинирани функции
Всяка програма "C" има поне една функция, която е основната функция, но програмата може да има произволен брой функции. Функцията main () в C е начална точка на програма.
При програмирането на 'C' функциите са разделени на два типа:
- Библиотечни функции
- Дефинирани от потребителя функции
Разликата между библиотеката и дефинираните от потребителя функции в C е, че не е необходимо да пишем код за функция на библиотеката. Той вече присъства в заглавния файл, който винаги включваме в началото на програмата. Трябва само да въведете името на функция и да я използвате заедно с правилния синтаксис. Printf, scanf са примерите за библиотечна функция.
Докато дефинираната от потребителя функция е вид функция, при която трябва да напишем тяло на функция и да извикаме функцията, когато изискваме функцията да извърши някаква операция в нашата програма.
Потребителска функция в C винаги се записва от потребителя, но по-късно тя може да бъде част от библиотеката 'C'. Това е основно предимство на програмирането на C.
Функциите за програмиране C са разделени на три дейности като,
- Декларация за функция
- Определение на функцията
- Извикване на функция
Декларация за функцията
Декларация за функция означава писане на име на програма. Това е задължителна част за използване на функции в кода. В декларация за функция просто посочваме името на функция, която ще използваме в нашата програма като декларация на променлива. Не можем да използваме функция, освен ако тя не е декларирана в програма. Декларацията за функция се нарича още „ Прототип на функция “.
Декларациите за функции (наречени прототип) обикновено се правят над функцията main () и приемат общата форма:
return_data_type function_name (data_type arguments);
- В return_data_type : е типа данни на функцията стойност, върната обратно към наричайки изявлението.
- Името на функцията : е последвано от скоби
- Имената на аргументите с техните декларации за тип данни по избор се поставят в скобите.
Ние разглеждаме следната програма, която показва как да декларираме функция на куба, за да изчислим стойността на куба на целочислена променлива
#include/*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);
Ето го пълен код:
#includeint add(int a, int b); //function declarationint main(){int a=10,b=20;int c=add(10,20); //function callprintf("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 променливите, които са декларирани във функция, са локални за този блок от код и не могат да бъдат препращани извън функцията. Обаче променливите, които са декларирани извън всички функции, са глобални и достъпни от цялата програма. Константите, декларирани с #define в горната част на програма, са достъпни от цялата програма. Ние разглеждаме следната програма, която отпечатва стойността на глобалната променлива както от основната, така и от дефинираната от потребителя функция:
#includeint 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 =1348from user defined function : global =1348
Обсъждаме подробностите за програмата:
- Декларираме глобална променлива с цяло число с 1348 като начална стойност.
- Декларираме и дефинираме функция test (), която нито взема аргументи, нито връща стойност. Тази функция отпечатва само стойността на глобалната променлива, за да демонстрира, че глобалните променливи могат да бъдат достъпни навсякъде в програмата.
- Ние отпечатваме глобалната променлива в рамките на основната функция.
- Извикваме тестовата функция в orde, за да отпечата глобалната променлива стойност.
В C, когато аргументите се предават на параметрите на функцията, параметрите действат като локални променливи, които ще бъдат унищожени при излизане от функцията.
Когато използвате глобални променливи, използвайте ги с повишено внимание, защото това може да доведе до грешки и те могат да се променят навсякъде в програмата. Те трябва да бъдат инициализирани преди да се използват.
Статични променливи
Статичните променливи имат локален обхват. Те обаче не се унищожават при излизане от функцията. Следователно статичната променлива запазва стойността си завинаги и може да бъде достъпна при повторно въвеждане на функцията. Статичната променлива се инициализира, когато е декларирана и се нуждае от префикса static.
Следващата програма използва статична променлива:
#includevoid 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 1Hi number 2Hi number 3Hi number 4Hi number 5
Рекурсивни функции
Помислете за факториала на число, което се изчислява, както следва 6! = 6 * 5 * 4 * 3 * 2 * 1.
Това изчисление се извършва като многократно изчисляване на факт * (факт -1), докато фактът е равен на 1.
Рекурсивната функция е функция, която се извиква и включва условие за изход, за да завърши рекурсивните повиквания. В случай на изчисляване на факториално число, условието за излизане е факт, равен на 1. Рекурсията работи чрез "подреждане" на повиквания, докато условието за излизане е вярно.
Например:
#includeint 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 */elsereturn (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
Горната програма демонстрира използването на вградена функция за добавяне на две числа. Както виждаме, върнахме добавянето на две числа в рамките на вградената функция, без да пишем допълнителни редове. По време на извикване на функция току-що сме предали стойности, върху които трябва да извършим добавяне.
Обобщение
- Функцията е мини програма или подпрограма.
- Функциите се използват за модулиране на програмата.
- Библиотеката и дефинираните от потребителя са два типа функции.
- Функцията се състои от декларация, тяло на функцията и част от извикване на функция.
- Декларацията за функция и тялото са задължителни.
- Функционално повикване може да бъде по избор в програма.
- C програмата има поне една функция; това е основната функция ().
- Всяка функция има име, тип данни с върната стойност или празнота, параметри.
- Всяка функция трябва да бъде дефинирана и декларирана във вашата програма C.
- Имайте предвид, че обикновените променливи във функция C се унищожават веднага щом излезем от извикването на функцията.
- Аргументите, предадени на функция, няма да бъдат променени, защото те са предадени по стойност нито по адрес.
- Обхватът на променливата се нарича видимост на променливите в рамките на програма
- В програмирането на C има глобални и локални променливи