Функции
Если переменные и константы хранят состояние программы, то функции определяют ее действия. Функцию можно представить, как именованный кусок кода, который можно многократно использовать в различных частях программы.
Определение функции
Формальное определение функции выглядит следующим образом:
тип <имя функции>(параметры)
{
выполняемые инструкции
}
Первая строка представляет заголовок или сигнатуру функции. Первым указывается тип данных, которые возвращает функция. Если функция ни чего не возвращает, то используется тип void. Затем идет имя функции, к которому применяются те же правила, что и к именованию переменных. После имени функции в круглых скобках перечисляются параметры. Функция может не иметь параметров, в этом случае указывается тип void или оставляют пустые скобки. После заголовка функции в фигурных скобках идет тело функции, которое содержит выполняемые выражения.
В предыдущих статьях многократно использовались различные функции, например, для вывода строки на консоль применялась функция printf()
.
Каждая программа на языке Си должна содержать главную функцию с фиксированным именем main(), являющуюся точкой входа - функцией с которой начинается выполнение программы.
Для примера, определим свою функцию:
#include <stdio.h>
void hello()
{
printf("Hello!\n");
}
int main(void)
{
return 0;
}
В данном коде, кроме стандартной функции main()
, определена функция hello()
, которая не имеет параметров и ничего не возвращает. Она просто выводит на консоль строку "Hello!". Если запустить этот код, то никаких строк на консоль не будет выведено, так как функция hello()
не выполняется. Что бы ее запустить необходимо ее вызвать, указав название и параметры:
имя_функции(аргументы);
Изменим код, что бы на конслоли выводилось нужно сообщение из функции:
#include <stdio.h>
void hello()
{
printf("Hello!\n");
}
int main(void)
{
hello(); // вызов функции
return 0;
}
Прототип или описание функции
При написании функции следует знать важный момент - компилятор должен узнать о функции до ее вызова. Сообщить компилятор о существовании функции можно двумя способами:
- определять функцию до ее использования, как это было сделано в коде выше.
- использовать прототип функции, до ее использования, а определение производить в любом другом месте.
Прототипом функции фактически является ее заголовок:
тип имя_функции(параметры);
Пример кода с прототипом:
#include <stdio.h>
// прототип
void hello(void);
int main(void)
{
hello();
return 0;
}
// определение
void hello()
{
printf("Hello!\n");
}
Параметры в Си передаются ТОЛЬКО по значению, то есть в отдельные области памяти, соответствующие формальным параметрам, копируются значения переменных или выражений, являющихся фактическими параметрами, и функция не влияет на эти параметры (функция не может изменять их значения). Для того, чтобы менять значения объектов, передаваемых в качестве параметров, необходимо использовать указатели. Это будет рассмотрено в следующих статьях.
Самостоятельная работа
Задачи
Задача 1
Составьте функцию, модуль числа и приведите пример её использования.
Задача 2
Составьте функцию возведения числа n в степень p. Доп. материал - https://phpstack.ru/other/c-plus-plus-pow.html.
Задача 3
Опишите функцию, проверяющую, является ли целое неотрицательное число n простым. В случае положительного ответа функция возвращает значение 1, в противном случае — 0.
Задача 4
Опишите функцию, проверяющую, является ли целое неотрицательное число n степенью 3. В случае положительного ответа функция возвращает значение 1, в противном случае — 0.
Задача 5
Пусть n — целое неотрицательное число. Опишите функцию от параметра n, которая находит максимальную цифру в числе.
Задача 6
Пусть n — целое неотрицательное число. Опишите функцию от параметра n, которая находит количество чётных цифр в числе.
Задача 7
Написать программу. На стандартном потоке ввода задано число n (n > 0) и последовательность из n целых чисел. Описав соответствующую функцию, найдите количество элементов последовательности, являющихся палиндромами.