Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 1 из 1
  1. #1
    Аватар для Tracker1
    Проверенный

    Статус
    Оффлайн
    Регистрация
    30.07.2013
    Сообщений
    54
    Репутация:
    84 ±

    [Цикл уроков программиста] 9. Функции(часть 1)

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

    Обязательными для функции являются два компонента: определение и вызовы.

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

    Определение функции должно располагаться в глобальной области видимости, до начала функции main. Рассмотрим пример, простого определения:

    PHP код:
    int simple_function ()
    {
      return 
    0;

    Определение функции состоит из заголовка и тела. Заголовок фукнции включает в себя:
    Тип возвращаемого значения

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

    PHP код:
    int simple_function()
    float simple_function()
    char simple_function() 

    В первом случае функция должна вернуть целое число (int), во втором - вещественное число (float), а в третьем случае - символ (char).

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

    Идентификатор или имя функции

    Идентификатор (имя) функции задаётся точно также, как и любой другой идентификатор. В данном примере мы создали функцию с идентификатором simple_function (simple - простой).

    Список аргументов или параметров

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

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

    PHP код:
    int simple (int afloat b

    В скобках мы записали два аргумента: a и b. У аргумента a тип int, а у аргумента b тип float.

    Аргументы используются, когда в функцию нужно передать какие-либо данные из вызывающего окружения.
    Тело функции

    Тело функции располагается сразу под заголовком и заключено в фигурные скобки. В теле функции может содержаться сколько угодно операторов. Но обязательно должен присутствовать оператор return. Оператор return возвращает значение:

    PHP код:
    int simple_function ()
    {
      return 
    0;

    Здесь, simple_function всегда будет возвращать 0. Надо признать, что данная функция бесполезна. Напишем функцию, которая принимает из вызывающего окружения два значения, складывает их и возвращает результат в вызывающее окружение. Назовём эту функцию sum (сумма):

    PHP код:
    int sum (int aint b)
    {
      
    int c;
      
    b;
      return 
    c;

    В функцию передаётся два аргумента: a и b типа int. В теле функции они используются как обычные переменные (они и являются обычными переменными). Давайте договоримся: снаружи функции, переменные, которые передаются в неё, мы будем называть аргументами, а эти же переменные в теле функции - параметрами.

    В теле функции определяется переменная c. А затем, в эту переменную мы помещаем значение суммы двух параметров.

    Последняя строчка возвращает значение переменной c во внешнее окружение.

    После ключевого слова return нужно указать значение которое будет возвращено. Можно возвращать как простые значения, так и переменные и даже выражения. Например:

    PHP код:
    return 32;
    return 
    a;
    return 
    b;
    return 
    a+b
    В последнем случае в вызывающее окружение будет возвращён результат суммы переменных a и b.

    Обратите внимание, что оператор return не только возвращает значение, но и служит как бы выходом из функции, после него не будет выполнен ни один оператор:

    PHP код:
    return a;
    a+b// этот оператор не будет выполнен 
    Благодаря этому, с помощью return удобно создавать условия выхода из функций:

    PHP код:
    if (0)
    {
      return 
    0;
    }
    else if (
    0)
    {
      return 
    1

    Здесь, из функции будет возвращено число в зависимости от значения переменной a: если a больше нуля, то будет возвращён 0, в противном случае - 1.
    Вызов функции

    После того как создано определение функции, её можно вызвать.
    PHP код:
    int sum (int aint b)
    {
      
    int c;
      
    b;
      return 
    c;
    }

    int main()
    {
      
    int s;
      
    sum(2,2); // вызов функции
      
    cout << s;
      return 
    0;

    В результате выполнения программы, на экран будет выведено: 4.

    Вызов функции состоит из идентификатора функции и списка аргументов в круглых скобках. Вот несколько вызовов функции sum:
    PHP код:
    int x 5;
    int y 4;
    int z;

    sum(0,1);     // 1
    sum(x,2);     // 7
    sum(x,y);     // 9
    sum(x,y); // z = 9 
    Вызывающее окружение

    То место, откуда вызывается функция, называется вызывающим окружением. Вызывающим окружением функции sum является функция main, а вызывающим окружением функции main является отладчик или операционная система.

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

    Тип передаваемого в функцию значения должен совпадать с типом указанным в списке аргументов. Нельзя, например, написать вот так:
    PHP код:
    int simple (int a)
    {
      return 
    1;
    }

    int main ()
    {
      
    int b;
      
    simple(0.5);
      return 
    0;

    В списке аргументов мы указали тип int, а в функцию передаётся вещественное значение 0.5. Так делать нельзя.

    Рассмотрим более полезный пример: напишем функцию для передвижения персонажа:
    PHP код:
    int x// глобальная переменная

    int move_x (int dx)
    {
      
    dx;
      return 
    x;
    }

    int main ()
    {
      
    int ch;
      
    char act;

      while (
    1)
      {
        
    act _getch();
        
    ch static_cast(act); 

        if (
    ch == 75// была нажата стрелочка влево
          
    move_x(-1);
        else if (
    ch == 77// была нажата стрелочка вправо
          
    move_x(1);
      } 
    // конец while
      
    return 0;
    // конец main 
    Обратите внимание, что для тела if и else if не стоит скобочек. Скобочки ветвлений можно опускать, если в теле ветвления всего один оператор.

    Функция move_x двигает персонажа на одну единицу влево или вправо в зависимости от клавиши, которую нажал пользователь.

    Создадим ещё одну функцию, а заодно уберём из main часть кода:
    PHP код:
    int x// глобальная переменная

    int move_x (int dx)
    {
      
    dx;
      return 
    x;
    }

    void move (int ch)
    {
      if (
    ch == 75// была нажата стрелочка влево
        
    move_x(-1);
      else if (
    ch == 77// была нажата стрелочка вправо
        
    move_x(1);
    }

    int main ()
    {
      
    int ch;
      
    char act;

      while (
    1)
      {
        
    act _getch();
        
    ch static_cast(act); 
        
    move(ch); // вызов функции move
      
    // конец while
      
    return 0;
    // конец main 
    Обратите внимание, что в функции move на месте типа возвращаемого значения стоит void, кроме того, в теле move нет оператора return.
    Объявления функций (прототипы)

    В последнем примере, определение функции move_x должно располагаться выше определения move (а определения move_x и move должны располагаться до main), так как в функции move происходит вызов move_x.

    Обычно определения всех пользовательских функций располагаются после определения main. При этом используются объявления функций (прототипы). Внесём изменения в предыдущую программу:
    PHP код:
    int x;  // глобальная переменная

    void move(int);   // прототип (объявление) функции move
    int move_x(int); // прототип функции move_x

    int main ()
    {
      
    int ch;
      
    char act;
      while (
    1)
      {
        
    act _getch();
        
    ch static_cast(act); 
        
    move(ch); // вызов move
      
    }
      return 
    0;
    }

    void move (int ch)
    {
      if (
    ch == 75// была нажата стрелочка влево
        
    move_x(-1);
      else if (
    ch == 77// была нажата стрелочка вправо
        
    move_x(1);
    }

    int move_x (int dx)
    {
      
    dx;
      return 
    x;

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

    PHP код:
    int move_x(int dx);
    int move_x(int); 
    Объявления функций расположены в начале файла. Прототип функции говорит компилятору, что данную функцию можно вызывать, а её определение будет позже (или находится в другом файле).

    Объявление функции может находиться в любом месте программы (за пределами определений функций программы или в любом определении), главное, чтобы оно появилось до первого вызова функции. Если вы не используете объявления, то до первого вызова функции должно стоять определение, которое также может располагаться в любом месте программы.
    Возврат void
    На месте возвращаемого типа, в определении (и в объявлении) функции move стоит ключевое слово void (void - пусто, пустой). Это значит, что функция не возвращает никакого значения. Следовательно не требуется и оператор return, так как функции нечего вернуть в вызывающее окружение.
    Последний раз редактировалось bredvix; 25.02.2014 в 18:03.

  2. Пользователь сказал cпасибо:
    vovandolg (16.10.2016)
 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •