ФУНКЦИИ


Функция – это фрагмент программы со своим именем, к которому можно обратиться для выполнения необходимых действий.
Функция содержит как данные, так и операции над этими данными. Если для объекта имя ссылается на область памяти, где он хранится, то и имя функции ссылается на начало кода этой функции.
Функции бывают библиотечные и пользовательские. Для использования библиотечных функций нужно указать заголовочный файл, в которых они объявлены. (директива #include).

Cоздание и использование пользовательских функций

Весь принцип программирования на Си основан на понятии функции. Выполнение программы начинается с команд, содержащихся в функции main(), затем из неё вызываются другие функции: printf, scanf(), getchar(), putchar(). Это библиотечные функции языка Си.
Как же создать свои функции?
Функции в Си играют ту же роль что и функции, программы, процедуры в других языках.
— они освобождают от повторного программирования, если конкретную задачу нужно решать в программе несколько раз.
— повышают уровень модульности программы, облегчают её чтение, внесение изменений, коррекцию ошибок.
main (){
float list[50];
read list (list); // ввод набора чисел
sort list (list); // сортировка
average (list); // поиск среднего
bargaph (list); // печать графика
}
Созданные функции можно использовать и в других программах.
До определенного момента функция рассматривается как «чёрный ящик», пока не нужно писать программу, реализующую данную функцию.
Нужно знать как определить функцию и как к ней обращаться. Различают 3 момента работы с функцией:
1. Объявление функции или декларация.
2. Вызов функции.
3. Определение функции или дифиниция.

//Задача. Напечатать титульный бланк организации.
#inсlude <stdio.h>
void starbar (void); //объявление функции
void main (void) {
starbar (); // вызов функции
printf («ПГУ»);
printf («им.Т.Г.Шевченко»);
printf («25 октября, 200»);
starbar(); — вызов функции
}
void starbar (void) { //определение функции
int count;
for (count=1; count<=65; count++)
putchar (‘*’);
putchar (‘\n’);
}
При написании функции starbar() используются те же правила, что и при создании main(): имя, фигурные скобки.
Объявление функции должно быть обязательно, если функция определена ниже ее вызова. Объявлять можно в начале модуля в заголовке программы, тогда функция доступна в любой другой функции, или в функции, где она вызывается, тогда область ее видимости ограничена этой функцией.
Определять функцию можно в любом месте программы. Единственное ограничение – нельзя определить функцию внутри определения другой функции.
Аргументы функции

Вернёмся к рассмотренной задаче. Пусть функция starbar() печатает любой символ, указанный в вызывающей программе. Он передается в функцию как аргумент.
#inсlude <stdio.h>
void starbar (char);
void main (void) {
starbar (‘_’); — вызов функции
printf («ПГУ»);
printf («им.Т.Г.Шевченко»);
printf («25 октября, 200»);
starbar(‘#’); — вызов функции
}
void starbar (char x) { — определение функции
int count;
for (count=1; count<=65; count++)
putchar (x);
putchar (‘\n’);
}

Определение функции начинается с void starbar (char x). Запись char x является аргументом функции. Аргумент описывается перед {, которая отмечает тело функции. Можно записать и в таком виде:
void starbar (x)
char x;{
Переменная x — является формальным аргументом. Это новая переменная и под нее должна быть выделена отдельная ячейка памяти. При вызове функции мы присваиваем формальному аргументу значение фактического аргумента.
starbar (‘-‘); x = ‘-‘;
Фактический аргумент может быть константой, переменной или сложным выражением. Независимо от типа фактического аргумента он вначале вычисляется, а затем его величина передается функции.
Можно передавать в функцию несколько фактических аргументов, разделенных запятыми.
printnum (int i, int j)
{
printf («Первый аргумент %d, второй аргумент %d\n», i, j);
}
Возвращение значения функцией

Создадим функцию определяющую max числа из двух. На входе в эту функцию будут передаваться два числа, а на выходе возвращаться одно, то которое больше. Для возврата используется ключевое слово return.

void main (void){
int a=5, b=10, c=15, d=-10;
int e,f;
e=max(a, b);
f=max(c, d);
}
int max (int i, int j)
{
int y;
y=i>j ? i:j;
return(y);
}
Оператор return прекращает работу функции и передает уравнение следующему оператору в вызывающей функции, даже если он не является последним оператором в функции. Количество операторов return не ограничено. Возвращаемое значение присваивается переменной по выходу из функции. Переменная у является внутренним объектом функции max, но значение у передается в вызывающую программу с помощью оператора return.

Inline-функции

Перед определением функции может быть использован спецификатор inline для того, чтобы компилятор помещал код функции непосредственно в место вызова функции.

#include <stdio.h>
#include <conio.h>
#include <dos.h>
inline void isinline(void) { };
void main(void)
{
printf(«Starting isinline\n»);
for(long index=1; index<=5000000; index++)
isinline();
}

Это увеличивает код программы, но ведет к увеличению быстродействия работы программы. Inline-функции не должны содержать сложные программные конструкции.

Значение формальных параметров функции по умолчанию

Формальный параметр может иметь значение по умолчанию. Все параметры, стоящие справа от него тоже должны иметь значения по умолчанию. Эти значения передаются в функцию, если при вызове данные параметры не указаны.

#include <stdio.h>
void noName1 (float x, int y, char z=’b’)
{
printf(«x = %0.1f y = %d, z = %d \n», x,y, (int)z);
}
void noName2 (float x, int y=16, char z=’a’)
{
printf(«x = %0.1f y = %d, z = %d \n», x,y, (int)z);
}
void noName3 (float x=1.3, int y=4, char z=’c’)
{
printf(«x = %0.1f y = %d, z = %d \n», x,y, (int)z);
}

void main(void)
{
noName1(1.0,2);
noName2(100.0);
noName3();
}

Перегрузка функций.

Имена функций могут быть перегружены в пределах одной области видимости. Компилятор отличает одну функцию от другой по сигнатуре. Сигнатура задается числом, порядком следования и типами ее параметров.

#include <stdio.h>
#include <string.h>
int noName (int first)
{
return first*first;
}
int noName (unsigned first)
{
return first*first;
}
char noName (char first)
{
return first*first;
}
int noName (int first,char *second)
{
return first*strlen(second);
}

float noName (float r)
{
return r*r;
}
double noName (double r)
{
return r*r;
}
void main(void)
{
printf(«%d\n», noName(4));
printf(«%d\n», noName((unsigned)4));
printf(«%c\n», noName(‘c’));
printf(«%d\n», noName(4,»cлово»));
printf(«%0.2f\n», noName((float)1.2));
printf(«%0.2lf\n», noName((double)1.2));}

Загрузка...