Определения, описания и вызовы функций

Разработка программы – это довольно непростой процесс. При решении любой задачи мы используем структурное программирование, т.е. нисходящую разработку алгоритма с пошаговой детализацией. Поставленная перед разработчиком (программистом) задача разбивается на менее крупные задачи, которые в свою очередь делятся еще на несколько менее сложных задач, и так до тех пор, пока самые мелкие задачи не будут решены с помощью базовых конструкций языка (следование, выбор, повтор).

При решении сложной задачи также используется модульное программирование – это разновидность структурного программирования.
Суть: конструирование программы из небольших фрагментов или модулей, каждый из которых более управляем, чем сложная (большая) программа.

Модули в С++ - это функции и классы.

Функции бывают двух видов: математические функции(функции из стандартной библиотеки) и функции, определенные пользователем.

Математические библиотечные функции

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().

Принципы модульного программирования.

  1. Логическая завершенность. Функция (модуль) должна реализовывать логически законченный, целостный алгоритм.
  2. Ограниченность. Функция должна быть ограничена в размерах, в противном случае ее необходимо разбить на логически завершенные части – модули, вызывающие друг друга.
  3. Замкнутость. Функция должна использовать глобальные данные, иметь «связь с внешним миром» помимо программного интерфейса, не должна содержать ввода и вывода во внешние потоки.
  4. Универсальность. Функция должна быть универсальна, параметры процесса обработки и сами данные должны передаваться извне, а не подразумеваться и устанавливаться постоянными.
  5. Принцип «черного ящика». Функция должна иметь продуманный «программный интерфейс», т.е. набор фактических параметров и результат функции, через который она «подключается» к другим частям программы (вызывается).

Определение функции

Синтаксис:

тип_функции   имя_функции (список формальных параметров)

{

тело функции;

}

Правила объявления функции

  1. Тип функции -  это тип возвращаемого функцией результата. Если функция не возвращает никакого результата, то для нее указывается тип void.
  2. Имя функции – идентификатор, задаваемый программистом.
  3. Список формальных параметров определяет имена параметров и порядок, в котором они принимают значения при вызове функции.

    Список всегда ограничен круглыми скобками даже в случае, когда он пуст    (main(); randomize() и т.д.)

    Список формальных параметров имеет следующий синтаксис:

    (тип_перем_1  перем_1, тип_перем_2  перем_2)

    Например: float fun (int a, int b, float d) {тело функции}

    Ошибка, если при объявлении формальных переменных не указывается тип для каждой переменной   (int a, b) – нельзя!

  4. Тело функции – это либо составной оператор, либо блок, заключается в фигурные скобки, после закрывающейся скобки «;» не ставится.

    Составной оператор – содержит операторы, которые определяют действие функции. 

    Блок – содержит объявление локальных переменных и операторы. 

    Локальные переменные – это переменные объявленные в функции, действие которых заканчивается после завершения работы функции.

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

  5. Оператором возврата из функции в точку ее вызова является оператор. Он может использоваться в функциях в двух формах: 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()

{

тело главной функции

}

 

//определение функции

тип_функции_имя_функции (список форм параметров)

{

тело функции

}

Отличие описания функции от определения

  1. Основное различие – точка с запятой в конце объявления прототипа.
  2. Необязательность имен формальных параметров в прототипе, например 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;
}

Среда, 08.05.2024, 16:14
Приветствую Вас Гость