Начала программирования на языке Си, страница 14

История создания подпрограмм восходит к первым языкам программирования, например к ФОРТРАНу. Если, разрабатывая разные программы, приходится выполнять набор одинаковых действий или решать  одинаковые задачи (например, во многих программах может потребоваться решение квадратного уравнения или дифференциальных уравнений), то конечно лучше чтобы эти алгоритмы могли быть доступны из других программ. Так появились библиотечные подпрограммы или стандартные подпрограммы-функции, с ними имеем дело в каждой программе и подключаем их через команды препроцессора. Кроме таких готовых программ, программист может создавать свои собственные библиотеки подпрограмм и подключать их по мере необходимости к своей программе.  Подпрограммы могут также описываться  и применяться внутри программы, в этом случае в языке Си они носят название функций.

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

10.1. Объявление функций

Функции, как и другие «действующие лица» программы должны быть объявлены до первого обращения к ним. Наиболее принятым, в настоящее время, способом объявления функций является следующий. После директив препроцессору и перед объявлением главной функции размещаются прототипы функций. То есть компилятору посылается сообщение о возвращаемом значении функции, ее имени и о типах и именах переменных функции.

Синтаксис прототипа функции имеет вид:

тип_результата имя_функции(тип_аргумента_1 имя_аргумента_1, тип_аргумента_2 имя_аргумента_2,..., тип_аргумента_N имя_аргумента_N);

Пример:

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

Решение:

#include<stdio.h>

int sum(int a , int b); /* прототип функции sum, возвращающей целочисленное значение, аргументы  a и b – также целые */

void main()

{

int S,x,y;

scanf(“%i%i”,&x,&y);

S=sum(x,y); /* здесь производится вызов функции sum, в качестве аргументов используются целочисленные значения х и у*/

printf(“S=%3d”,S);

}

int sum(int a , int b)   /*здесь начинается описание функции.

Обратите внимание на отсутствие  точки с запятой в конце строки*/

{  int z; /*описание локальной переменй*/

z=a+b;

return(z);   }   /*возвращаемое значение функции z – целое число*/

10.2. Локальные и глобальные переменные функций

В приведенном выше примере в функции используются три переменные a,b,z, причем, a и b описаны в головке функции, а z  внутри тела функции.

Здесь a и b это так называемые глобальные переменные они «видны», то есть могут быть использованы в любом месте  программы. а z – локальная переменная, она может быть использована только внутри функции sum.

10.3. Возвращаемые значения функций. Оператор RETURN

10.3.1. Тип результата  void

Если у функции такой возвращаемый тип,  то это означает, , что результатом ее работы является не какое-либо данное, описываемое ранее каким-либо типом и именем, а просто выполнение какой-либо последовательности операторов.

Пример:

Написать программу вычисления синуса угла .

…………………..

void si182(void); //прототип функции si182

void main()

{ si182(); } //вся программа состоит из вызова функции si182

void si182(void) // сама функция

{double x,y;

x=182*3.14/180   //перевод из градусной в радианную меру

y=sin(x);

printf(“sin 182=%5.4f”,y);}

Та же  программа для вычисления синуса любого угла  имеет вид:

…………………………..

void si(int x); //прототип функции si

void main()

{ int alfa;

puts(“ введите целочисленное значение угла в градусах”);

scanf(“%i”,&alfa);

si(alfa);   }

void si(int x)

{ float  y;

y=x*3.14/180   //перевод из градусной в радианную меру

y=sin(x);

printf(“\nsin угла alfa =%d  равен %f”,x,y);}

10.3.2. Тип результата char