Определения, описания и вызовы функций
Разработка программы – это довольно непростой процесс. При решении любой задачи мы используем структурное программирование, т.е. нисходящую разработку алгоритма с пошаговой детализацией. Поставленная перед разработчиком (программистом) задача разбивается на менее крупные задачи, которые в свою очередь делятся еще на несколько менее сложных задач, и так до тех пор, пока самые мелкие задачи не будут решены с помощью базовых конструкций языка (следование, выбор, повтор).
При решении сложной задачи также используется модульное программирование – это разновидность структурного программирования.
Суть: конструирование программы из небольших фрагментов или модулей, каждый из которых более управляем, чем сложная (большая) программа.
Модули в С++ - это функции и классы.
Функции бывают двух видов: математические функции(функции из стандартной библиотеки) и функции, определенные пользователем.
Математические библиотечные функции
sqrt(x) – корень квадратный;
pow(x,y) – возведение х в степень у;
abs(x)
fabs(x) абсолютное значение целого числа,
dabs(x) вещественного, длинного числа
labs(x)
exp(x) – экспоненциальная функция ех;
log(x) – натуральный логарифм;
log10(x) – десятичный логарифм;
sin(x), cos(x), tan(x) – тригонометрические функции.
Функции, определенные пользователем
Функция – это независимая совокупность объявлений и операторов, обычно предназначенная для выполнения определенной задачи.
При программировании на С++ функция – это основное понятие, без которого невозможно обойтись.
Во-первых, каждая программа имеет главную функцию (единственную) с именем main(). Именно функция main() обеспечивает создание точки входа в откомпилированную программу.
Во-вторых, кроме функции main(), в программу может входить произвольное количество неглавных функций, выполнение которых инициируется вызовами из функции main().
Принципы модульного программирования.
- Логическая завершенность. Функция (модуль) должна реализовывать логически законченный, целостный алгоритм.
- Ограниченность. Функция должна быть ограничена в размерах, в противном случае ее необходимо разбить на логически завершенные части – модули, вызывающие друг друга.
- Замкнутость. Функция должна использовать глобальные данные, иметь «связь с внешним миром» помимо программного интерфейса, не должна содержать ввода и вывода во внешние потоки.
- Универсальность. Функция должна быть универсальна, параметры процесса обработки и сами данные должны передаваться извне, а не подразумеваться и устанавливаться постоянными.
- Принцип «черного ящика». Функция должна иметь продуманный «программный интерфейс», т.е. набор фактических параметров и результат функции, через который она «подключается» к другим частям программы (вызывается).
Определение функции
Синтаксис:
тип_функции имя_функции (список формальных параметров)
{
тело функции;
}
Правила объявления функции
- Тип функции - это тип возвращаемого функцией результата. Если функция не возвращает никакого результата, то для нее указывается тип void.
- Имя функции – идентификатор, задаваемый программистом.
- Список формальных параметров определяет имена параметров и порядок, в котором они принимают значения при вызове функции.
Список всегда ограничен круглыми скобками даже в случае, когда он пуст (main(); randomize() и т.д.)
Список формальных параметров имеет следующий синтаксис:
(тип_перем_1 перем_1, тип_перем_2 перем_2)
Например: float fun (int a, int b, float d) {тело функции}
Ошибка, если при объявлении формальных переменных не указывается тип для каждой переменной (int a, b) – нельзя!
- Тело функции – это либо составной оператор, либо блок, заключается в фигурные скобки, после закрывающейся скобки «;» не ставится.
Составной оператор – содержит операторы, которые определяют действие функции.
Блок – содержит объявление локальных переменных и операторы.
Локальные переменные – это переменные объявленные в функции, действие которых заканчивается после завершения работы функции.
Замечание! Тело функции не может содержать в себе определения других функций. Состав тела функции - переменные, константы, операторы, оператор возврата return.
- Оператором возврата из функции в точку ее вызова является оператор. Он может использоваться в функциях в двух формах: 1. return переменная; 2. return выражение;
Примеры:
1) int maxi (int x, int y)
{ int max;
if (x>y) max = x;
else max = y;
return max;
}
2) double cub( float y) { return y*y*y;}
Если функция имеет тип void, то функция не возвращает никакого значения
в качестве своего результата. Например, функция обмена значениями двух
переменных void swap (inta, int b)
{ int t;
t=a;
a=b;
b=t;
}
6.Вызов функции. Обращение к функции – это и есть вызов функции, которое записывается через выражение: имя_функции (список фактических параметров)
При обращении к функции (вызове функции) формальные параметры заменяются фактическими, при этом должны соблюдаться правила соответствия по последовательности, по типам и количеству.
Фактический параметр – это выражение того же типа, что и соответствующего ему формального параметра.
Объявление функции (прототип функции)
Прототипом называется предварительное описание функции, в котором содержатся все необходимые сведения для правильного обращения к ней: тип и имя функции, типы формальных параметров и их порядок следования. Прототип функции позволяет компилятору выполнить контроль соответствия типов параметров и правильность вызова функции.
Синтаксис:
тип_функции_имя_функции (список форм параметров);
main()
{
тело главной функции
}
//определение функции
тип_функции_имя_функции (список форм параметров)
{
тело функции
}
Отличие описания функции от определения
- Основное различие – точка с запятой в конце объявления прототипа.
- Необязательность имен формальных параметров в прототипе, например int maxi (int, int).
Пример функции, определенной пользователем (Решение задачи можно посмотреть, скачав файл "Задача-10"):
Даны два натуральных числа. Выяснить, в каком из них сумма цифр больше, определив функцию для расчета суммы цифр натурального числа
#include<iostream.h>
#include<conio.h>
int summa(int x)
{int y, sum=0;
while (x!=0)
{y=x%10;
x=x/10;
sum=sum+y;
}
return sum;
}
main()
{clrscr();
int z,z1,c,q;
cout<<"Vvedite 2 chisla"<<'\n';
cin>>z1;
z=summa(z1);
cin>>q;
c=summa(q);
if (z>c) cout<<"Summa cifr bolshe v 1 chisle"<<'\n';
else if (c>z) cout<<"Summa cifr bolshe vo vtorom chisle"<<'\n';
else cout<<"Summa cifr v oboih chislah odinakova"<<'\n';
return 0;
}
|