, : pointers, : Top


30 Функции

Вся программа в C++ состоит из отдельных блоков — функций. Даже основная программа на самом деле является функцией с именем main оговоренного стандартом вида. Синтаксис определения функции в языке C++ такой:

     возвращаемый_тип идентификатор(список_параметров)
     {
         Блок инструкций процедуры, включающий инструкцию
         return значение;
     }

возвращаемый_тип — это тип данных, который возвращает функция. Может быть любым стандартным типом данных C++ (int, double, int * и т.д.) или типом данных, определенным пользователем.

идентификатор — имя функции, как и любой идентификатор в C++ должен состоять из букв, цифр и символа подчеркивания и начинаться не с цифры.

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

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

Пример функции, которая по данному действительному числу x и данному натуральному числу n вычисляет x^n:

     double power(double x, int n) // Функция принимает 2 аргумента: double и int
     {                             // и возвращает значение типа double
         double p=1;
         int i;
         for(i=0;i<n;++i)          // Цикл будет пройден n раз
             p*=x;
         return p;                 // Теперь возвращаем значение p
     }

В основной программе (из функции main) или из другой функции мы можем вызвать реализованную функцию, указав ее идентификатор и перечислив в круглых скобках список передаваемых параметров таких же типов, как это указано в объявлении функции:

     cout<<power(1.5,10)<<endl;   // Вызов функции power c параметрами 1.5 и 10

Заметим, что в этом примере мы на занимаемся обработкой ошибок: наша функция будет работать некорректно, если ей передать отрицательное значение в качестве второго параметра. Технология обработки некорректных параметров и сообщения о некорректности входных параметров — отдельная и весьма обширная тема, а лучше всего разрабатывать программы так, чтобы функция получала только корректные параметры.

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

     power(1.5,10);

является синтаксически правильным, но бессмысленным (как, например, инструкция 2+2;, вычисляющая значение выражения, но не использующая результат).

Функция может и не возвращать значения, тогда в ее объявлении в качестве типа возвращаемого значения следует указать слово void. Функция, не возвращающая значения, должна завершаться инструкцией return; без указания значения (а может и вообще не содержать инструкции return;). Такие функции (они являются аналогами процедур в Паскале и Бейсике) нельзя использовать в арифметических выражениях. Пример функции, печатающей на экране строку ‘Hello, world!’ и не возвращающей значения:

     void hello() // Функция не возвращает значения
     {            // и не принимает ни одного параметра
         cout<<"Hello, world!"<<endl;
         return;
     }

и ее вызова (круглые скобки обязательны, даже если передается пустой список параметров)

     hello();

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

     int power(int x, int n);
     double power(double x, double n);

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

Упражнения

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

  1. Напишите функцию bool IsUpper(char), которая определяет, является ли входной символ заглавной буквой латинского алфавита.
  2. Напишите функцию bool IsDigit(char), которая определяет, является ли входной символ цифрой.
  3. Напишите функцию char ToUpper(char), которая переводит строчный символ латинского алфавита в аналогичный заглавный.
  4. Напишите функции string ToUpper(string) и string ToLower(string), которая переводит строку из нижнего регистра в верхний и наоборот. Символы, не являющиеся латинскими буквами не меняются.
  5. В шифре Цезаря каждая буква заменяется на третью по счету букву латинского алфавита с циклическим сдвигом (то есть A меняется на D, B на E, ..., Z на C). Напишите функции string CaesarCrypt(string) и string CaesarDecrypt(string), осуществляющие шифрование и дешифрование строки при помощи шифра Цезаря.
  6. Напишите функцию, шифрующую строку по следующему принципу: строка разбивается на пары символов, два символа в паре переставляются местами (то есть строка "abcdef" будет зашифрована, как "badcfe").