Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







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





 

Весь принцип программирования на Си основан на понятии функции. Выполнение программы начинается с команд, содержащихся в функции main(), затем из неё вызываются другие функции: printf, scanf(), getchar(), putchar(). Это библиотечные функции языка Си.

 

Как же создать свои функции?

void main (void){

float list[50];

read list (list); // ввод набора чисел

sort list (list); // сортировка

average (list); // поиск среднего

bargaph (list); // печать графика

}

Созданные функции можно использовать и в других программах.

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

Нужно знать, как определить функцию и как к ней обратиться. Различают 3 основных момента работы с функцией:

1. Объявление функции или декларация. Если функция вызывается до своего определения, её необходимо объявить. Объявление функции представляет собой заголовок функции после которого ставится “;”. Объявить функцию можно вне main( ) или внутри какой-либо другой функции, но обязательно до вызова объявляемой функции. При объявлении функции вне {…}, они доступны везде, при объявлении внутри какой-либо другой функции, они доступны тошько в этой функции. Можно создавать свои собственные заголовочные файлы и подключать их директивой include.

2. Вызов функции – это обращение к функции для выполнения действий, описанных в ней.

3. Определение функции или дифиниция – запись тела функции. Определять функцию можно в любом месте программы и поэтому, если функция уже определена до вызова, то объявлять её не надо.

 

Тип функции определяется типом возвращаемого ею значения, а не типом аргументов! По умолчанию тип функции int. Функцию необходимо описать: а) в её определении; б) в вызывающей программе (то есть где она используется). Типичное определение функции:



Имя(список аргументов)

Описание аргументов

Тело функции

 

//Задача. Напечатать титульный бланк организации.

#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) {

Переменная 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 не ограничено. Возвращаемое значение присваивается переменной по выходу из функции.

 

 

С++

Inline-функции

 

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

 

Пример:

//расчет площади круга

inline float Circle(float)

void main ( ) {

float S; float R=10.5;

S= CircleR;

printf ………

} // далее тело функции:

float Circle(float r){

return 3.14*r*r;

}

 

Пример:

#include <stdio.h>

#include <conio.h>

#include <dos.h>

 

void notinline(void) { };

inline void isinline(void) { };

void PrintTime(void);

void main(void)

{

long index;

printf("Starting notinline\n");

PrintTime();

for( index=1; index<=5000000; index++)

notinline();

PrintTime();

printf("Starting isinline\n");

for( index=1; index<=5000000; index++)

isinline();

PrintTime();

}

void PrintTime(void)

{

struct time t;

gettime(&t);

printf("Сейчас: %2d:%02d:%02d.%02d\n",

t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund);

}

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

Функция PrintTime() печатает на экране системное время, используя структуру,

описанную в заголовочном файле dos.h.

 

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

 

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

 

#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));

}

 

Рекурсия

Действие, состоящее в том, что функция вызывает сама себя, называется рекурсией. Когда функция вызывает сама себя, не происходит передачи управления на её начало. Вместо этого на памяти машины создаются копии всего набора переменных функции. Адреса этих переменных не изменяются от итерации к итерации. Если же рассматривать цикл, о в нем адрес используемой переменой меняется, поскольку при каждом выполнении тела цикла создается новая копия переменной, каждая из которых будет носить одно и тоже имя, но иметь свой собственный адрес.

 









Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2018 zdamsam.ru Размещенные материалы защищены законодательством РФ.