§ 7. Понятие вспомогательного алгоритма

7.2. Функции, возвращающие числовой результат

Большинство функций из библиотеки cmath, которые использовались ранее, возвращают в качестве результата число.

Для того чтобы функция могла возвращать значение, используется оператор return, после которого указывается возвращаемое значение. Возвращаемым значением может быть константа (значение 0 у функции main), переменная (в примере 7.2 это функции plos_treug и kol_cifr) или выражение (функция pi()в примере 7.2).

Тип возвращаемого значения должен совпадать с типом результата в описании функции[1].

Пример 7.4. Для функции begin mathsize 16px style f left parenthesis x right parenthesis space equals space fraction numerator square root of open vertical bar x space minus space 2 close vertical bar end root over denominator x squared space plus space 3 end fraction end style вычислить и вывести: f open parentheses – 2.4 close parentheses comma space space f left parenthesis y right parenthesis comma space space f left parenthesis f left parenthesis 3.7 space asterisk times space z right parenthesis right parenthesis. Значения переменных y и z вводятся.

Этапы выполнения задания

I.   Исходные данные: числа y, z.

II. Результат: f1, f2, f3 — значения функции для указанных значений аргументов.

III. Алгоритм решения задачи.

1. Ввод исходных данных.
2. Опишем функцию, вычисляющую значение f по указанной формуле.
3. Вычислим значение функции для указанных аргументов. 
4. Вывод значений функции.

VI. Описание переменных: y, z, f1, f2, f3 – double.

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

В первом случае фактическим параметром является константа –2.4. Поэтому переменная x получит значение –2.4, переменная t 1 space equals space square root of open vertical bar – 2.4 space – space 2 close vertical bar end root space almost equal to space 2.097 comma переменная t 2 space equals space x squared space plus space 3 space equals space 8.76. Функция вернет значение fraction numerator 2.097 over denominator 8.76 end fraction space almost equal to space 0.239 comma которое и будет присвоено переменной f.

Во втором случае переменной x будет передано значение переменной y, которое ввели с клавиатуры, и затем будут выполнены вычисления.

В третьем случае вызов функции осуществляется дважды: сначала для значения 3.7 * z, а затем аргументом функции станет значение f(3.7 * z).

Пример 7.5. Даны три числа. Найти попарные произведения этих чисел. Написать программу, которая вычислит минимальное и максимальное из этих значений.

Этапы выполнения задания

I. Исходные данные: числа x, y, z.

II.  Результат: minpr, maxpr (минимальное и максимальное произведения).

III. Алгоритм решения задачи.

1. Ввод исходных данных.
2. 
Опишем функции, вычисляющие минимальное и максимальное значение для двух чисел. 
3. Находим попарные произведения чисел x, y, z. Таких произведений будет три: xy, yz, xz.  
4. Для нахождения минимального значения из трех чисел воспользуемся следующим свойством:
Min(a1, a2, a3) = Min(Min(a1, a2), a3). Максимальное значение находится аналогично.
5. 
Вывод результатов.

IV.Описание переменных: все переменные в программе имеют тип int.

Пример 7.6. Выпуклый четырехугольник задан координатами своих вершин. Написать программу, которая найдет периметр и площадь четырехугольника. Вычисление длины отрезка и площади треугольника оформить в виде подпрограмм.

Этапы выполнения задания

I. Исходные данные: x1, y1, x2, y2, x3, y3, x4, y4 (координаты вершин).

II. Результат: P и S — периметр и площадь четырехугольника.

III. Алгоритм решения задачи.

1. Ввод исходных данных.
2. 
Периметр четырехугольника — сумма длин его сторон. Длина стороны — длина отрезка, соединяющего вершины. Вычисление длины отрезка оформляем в виде функции dlin.
3. 
Для вычисления площади проведем диагональ, соединяющую вершины с координатами (x1, y1) и (x3, y3) или (x2, y2) и (x4, y4). Четырехугольник разобьется на два треугольника, сумма площадей которых и даст искомую площадь. Площадь треугольника вычислим по формуле Герона, т. к. для треугольников известны длины сторон. Обозначения вспомогательных переменных — на рисунке.


Вычисление площади треугольника оформляем в виде функции plos.
4. Вывод результата.

IV. Описание переменных: все переменные в программе имеют тип double.


[1] При несовпадении типов происходит попытка преобразования типов. Если это невозможно, то компилятор выдаст ошибку.

Значение 0, которое возвращает функция main, говорит об отсутствии ошибок при выполнении программы. Это означает, что все команды, которые находятся в программе до этой строки, выполнились успешно. Команда return 0; может быть использована для прерывания работы функции. Никакие команды не могут быть выполнены после нее.

Об успешном выполнении программы свидетельствует сообщение «Process terminated with status 0» в окне Build log.

Если работа программы была прервана (например, пользователь закрыл консольное окно до того, как программа закончила работу), то в этом окне будет сообщение об ошибке: «Process terminated with status −1073741510»

Пример 7.4.

 V. Программа:

#include <iostream>

#include <cmath>

 

using namespace std;

 

double f(double x)

{

  double t1 = sqrt(abs(- 2));

  double t2 = x * x + 3;

  return t1 / t2;

}

 

int main()

{

  double y, z;

  cout << "vvedi 2 chisla" << endl;

  cin >> y >> z;

  double f1 = f(-2.4);

  cout << "f1 = " << f1 << endl;

  double f2 = f(y);

  cout << "f2 = " << f2 << endl;

  double f3 = f( f(3.7 * z) );

  cout << "f3 = " << f3 << endl;

  return 0;

}

 VI.  Тестирование.

VII. Анализ результата. Проверить правильность вычислений можно с помощью калькулятора.

Пример 7.5.

V. Программа:

#include <iostream>

 

using namespace std;

 

int Max(int c,int d)

{

  if (> d)

    return c;

  else

    return d;

}

 

int Min(int c, int d)

{

  if (< d)

    return c;

  else

    return d;

}

 

int main()

{

  int x, y, z;

  cout << "vvedi 3 chisla" << endl;

  cin >> x >> y >> z;

  int a1 = x * y;

  int a2 = y * z;

  int a3 = x * z;

  int s = Min(a1, a2);

  int minpr = Min(s, a3);

  cout << "min proiz = " << minpr << endl;

  s = Max(a1, a2);

  int maxpr = Max(s, a3);

  cout << "max proiz = " << maxpr << endl;

  return 0;

}

 VI. Тестирование.

Пример 7.6.

V. Программа:

#include <iostream>

#include <cmath>

 

using namespace std;

 

double dlin(double x, double y, double x0, double y0)

{  

  double d = (- x0) * (- x0) + (- y0) * (- y0);

  return sqrt(d);

}

double plos(double a, double b, double c)

{  

  double pr = (+ b + c) / 2;

  double pl = sqrt(pr * (pr - a) * (pr - b) * (pr - c));

  return pl;

}

 

int main()

{

  double x1,y1,x2,y2,x3,y3,x4,y4;

  cout << "koordinaty vershiny 1 - ";

  cin >> x1 >> y1;

  cout << "koordinaty vershiny 2 - ";

  cin >> x2 >> y2;

  cout << "koordinaty vershiny 3 - ";

  cin >> x3 >> y3;

  cout << "koordinaty vershiny 4 - ";

  cin >> x4 >> y4;

  ///стороны и диагональ

  double a1 = dlin(x1, y1, x2, y2);

  double a2 = dlin(x2, y2, x3, y3);

  double a3 = dlin(x3, y3, x4, y4);

  double a4 = dlin(x4, y4, x1, y1);

  double d = dlin(x1, y1, x3, y3);

  ///периметр

  double p = a1 + a2 + a3 + a4;

  ///площадь

  double s1 = plos(a1, a2, d);

  double s2 = plos(a3, a4, d);

  double s = s1 + s2;

  cout << "perimetr=" << p << endl;

  cout << "ploschad=" << s << endl;

  return 0;

}

 VI. Тестирование.

VII. Анализ результата. Обратите внимание на имена переменных в программе. Фактические и формальные параметры принято называть разными именами.