Шаг 44.
Аргументы функции

    Этот шаг посвящен изложению правил использования аргументов функций.

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

    Все функции в программе, написанной на C++, равноправны: каждая из них может вызывать любую другую функцию, и в свою очередь может быть вызвана любой другой функцией. Это делает функции языка C++ несколько отличными от процедур языка Pascal, поскольку процедуры могут быть вложены в другие процедуры (причем, процедуры, содержащиеся в одном "гнезде", являются недоступными для процедур, расположенных в другом).

    Специфика функции main() заключается в том, что после "сборки" программы, состоящей из нескольких функций, ее выполнение начинается обязательно с первого оператора функции main(). Приведем несколько примеров с использованием функций.


    Пример 1. Используя функции, вывести на экран предложение "Мы устали!" 15 раз.
#include <iostream.h>
void main ()
   {
      void print();
      /* --------------- */
      for (int i=1; i<=15; i++)
         print ();
   }
  /* --------------------------------------------- */
void print () //Вызываемая функция (без параметров).
   {
      cout << "Мы устали!\n";
   }
Текст этой программы можно взять здесь.


    Пример 2. Построим функцию, которая печатает строку, содержащую 45 символов "*" и включим ее в программу, печатающую титул "фирменного бланка".
#include <iostream.h>
void main ()
   {
      void starbar ();
      /* --------- */
      starbar ();
      cout << "г.Курган" << endl;
      cout << "ул.Гоголя, 25, КГУ" << endl;
      starbar ();
   }
  /* ------ */
void starbar ()
   {
      for  (int count=1; count<46; count++)
          cout << "*";
      cout << endl;
   }
Текст этой программы можно взять здесь.

    Результат работы программы:

*********************************************
г.Курган
ул.Гоголя, 25, КГУ
*********************************************

    Комментарий к примеру. При рассмотрении этой программы необходимо обратить внимание на следующие моменты.

  1. При написании функции starbar() мы следовали тем же правилам, что и при написании функции main(): вначале указывается имя, затем идет открывающая фигурная скобка, записываются операторы, определяющие работу функции, и, наконец, закрывающая фигурная скобка.
  2. Круглые скобки в starbar() говорят о том, что starbar() - это функция. Обратите внимание, что здесь за именем starbar() не следует символ "точка с запятой"; его отсутствие служит указанием компилятору, что мы определяем функцию starbar(), а не используем ее.
  3. Мы вызвали функцию starbar() из функции main(), используя ее имя. Когда в процессе выполнения программы компьютер достигает оператора starbar();, он находит указанную функцию, после чего начинает выполнять соответствующие ей операторы. Затем управление передается следующей строке функции main().


    Пример 3. Демонстрация вызова функции, имеющей один аргумент.
#include <iostream.h>
void main()
   {
      int x=2,y=45,z=0;
      char q='o';
      void zero(int);  //Прототипы используемых функций.
      void ch(char);   
      /* ------------------------------------------------ */
      cout << "x= ";
      zero (x);           //Вызов функции zero c аргументом x.
      cout << "x+y+(x+y)^z = ";
      zero (x+y+(x+y)^z); //Вызов функции zero c аргументом
                          //            x+y+(x+y)^z. 
      cout << "q = ";
      ch (q);             //Вызов функции ch c аргументом q.
   }
  /* --------------------------------------------------------- */
void zero (int u) //Тип, имя функции, описание аргумента.
   {
      cout << u << endl;
   }
  /* --------------------------------------------------------- */
void ch (char u)  //Тип, имя функции, описание аргумента.
   {
      cout << u << endl;
   }
Текст этой программы можно взять здесь.

    Результат работы программы:

   x = 2
   x+y+(x+y)^z = 94
   q = o

    Комментарий к примеру. Определение функции zero() начинается со строки:

     void zero (int u) //Тип, имя функции, описание аргумента.

Эта строка информирует компилятор о том, что у функции zero() имеется аргумент u целого типа. Переменная u называется формальным параметром. Фактически это новая переменная, и в памяти компьютера для нее должна быть выделена отдельная ячейка.

    При вызове функции zero(x) мы присваиваем формальному параметру u значение фактического параметра x.

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

    В данном примере x, x+y+(x+y)^z, q являются фактическими параметрами, а u - формальным. Необходимо напомнить, что хотя аргументы в функциях zero() и ch() имеют одно и то же название, они различны.

   

    Если некоторая функция имеет более одного аргумента, то роль разделителя в списке аргументов исполняет запятая. Например:

     void printnum (int i,int j)
     {
         ...
     }

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


    Пример 4. Напишем программу, которая находит числа x, y, z, принадлежащие [1,20] и удовлетворяющие условию x2=y2+z2.
#include <iostream.h>
void main()
   {
      void zero(int,int,int);
      /* ----------------------------------------------- */
      cout << "Следующие величины могут быть сторонами\n";
      cout << "прямоугольного треугольника:\n";
      for (int x=1; x<=20; x++)
         for (int y=1; y<=20; y++)
            for (int z=1; z<=20; z++)
               if  (y*y+z*z==x*x)
                  zero (x,y,z);
   }
  /* ------------ */
void zero (int f,int g,int h)
   {
      cout << "x = " << f << ", y = " << g << ", z = " << h << endl;
   }
Текст этой программы можно взять здесь.

    Результат работы программы:

   Следующие величины могут быть сторонами
   прямоугольного треугольника:
   x = 5, y = 3, z = 4
   x = 5, y = 4, z = 3
   x = 10, y = 6, z = 8
   x = 10, y = 8, z = 6
   x = 13, y = 5, z = 12
   x = 13, y = 12, z = 5
   x = 15, y = 9, z = 12
   x = 15, y = 12, z = 9
   x = 17, y = 8, z = 15
   x = 17, y = 15, z = 8
   x = 20, y = 12, z = 16
   x = 20, y = 16, z = 12


    Видоизмените программу примера 2, чтобы она печатала следующее:
*********************************************
              г.Курган
              ул.Гоголя, 25, КГУ
*********************************************

Воспользуйтесь функцией для печати нужного количества пробелов.
Решение и комментарии вы можете посмотреть здесь.




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


Предыдущий шаг Содержание Следующий шаг