Урок 2. C++ многофайловая компоновка, функции

На занятии объясняется тема «язык С++: функции». Также рассмотрены типы данных c++ (double, int и другие)

Теория

Стандартные функции

Математические функции объявлены с включением библиотеки <cmath>:

#include <cmath>
abs(x);  
floor(x);  
sin(x);  
pow(x, y);  
sqrt(x);

Пользовательские функции

пример 1:

//...
int abs(int x) {
	return x > 0 ? x : -x;  // выход из функции
}
int main() {
	cout << abs(-35); // 35
	system("pause");
	return 0;
}

Функция abs возвращает целочисленное значение по модулю и имеет единственный целочисленный параметр x.

пример 2:

//...
void print(int i) {
	cout << "значение = " << i;
}
int main() {
	print(40);
	system("pause");
	return 0;
}

Функция print не возвращает никакого значения и имеет единственный целочисленный параметр i. Мы можем назвать это процедурой (потому что она не возвращает значение).

Инкапсуляция

В C++ данные и функции разделены на две отдельные группы с уровнем доступа: public и private.
Уровень определяет доступ, который «клиентский код» имеет к данным или функциям:

  • Доступ к объектам с уровнем доступа Public можно получить из клиентского кода.
  • Доступ к объектам с уровнем доступа Private получить из клиентского кода невозможно (доступ только из самих функций).

В C++ объявление функций (в файле .h) отделены от ее реализации (в файл .cpp).

Многофайловая компоновка

Для создания приложения обычно требуется создать 3 файла: файл заголовка (.h), файл реализации (.cpp) и основной файл (.cpp).

  • Заголовочный файл (.h) определяет интерфейс к функциям, то есть объявление(я) функции(й).
  • Файл реализации .cpp содержит всю логику функций или методов (то есть тело функций). Кроме того, здесь должен быть включен файл заголовка .h.
  • Основной файл .cpp содержит функцию main — так называемая «точка входа», с которой осуществляется запуск программ на C++, и сюда также необходимо включить заголовочный файл .h.

Рассмотрим на примере (три файла одного и того же приложения):

Пример заголовочного файла (tasks.h):

#ifndef TASKS_H
#define TASKS_H
//вычисляет периметр треугольника
double perimeter(double, double, double);
#endif TASKS_H

Пример файла реализации (.cpp):

#include "tasks.h"
//вычисляет периметр треугольника
double perimeter(double a, double b, double c)
{
	//операторы
}

Пример главного файла (.cpp):

#include <iostream>
#include "tasks.h"
using namespace std;
void main()
{
	//запросить у пользователя ввод данных
	//вызов функции
	//вывод результатов
	system("pause");
}

Файлы .cpp запрашивают подключение различных файлов заголовков.
После чего файл cpp со всем дополнительным включенным содержимым будет скомпилирован в объектный файл (имеет расширение .o, то есть объектный файл). Каждый файл cpp компилируется в объектный файл отдельно .

Лабораторные работы

Лабораторная работа 1:

Выполнить: Создайте приложение для нахождения объема и площади поверхности куба. Дана длина стороны куба (она вводится).

Примечание: Необходимо представить три решения: 1) Без пользовательских функций и без многофайлового приложения. 2) С пользовательскими функциями, но без многофайлового приложения. 3) Создание многофайлового приложения.

Примерный вывод:

Введите длину стороны куба: 3.48
Объем: 42.1442
Площадь поверхности: 72.6624

[Имя проекта: Lesson_2Lab1, имена файлов HeaderL2Lab1.h, ImpL2Lab1.cpp, MainL2Lab1.cpp]

✍ Алгоритм:

  1. Откройте Microsoft Visual Studio. Выберите в меню Файл/File -> Новый проект/New project. Выберите язык C++ и консольное приложение.
  2. Назовите проект Lesson_2Lab1.
  3. В окне Обозреватель решений/Solution Explorer найдите папку Файлы источники/Source files и в контекстном меню папки выбрать Добавить/Add -> Новый файл/New Item. Необходимо создать два .cpp файла и назвать их: ImpL2Lab1.cpp – файл реализации и MainL2Lab1.cpp – файл с функцией main.
  4. Затем найдите папку Файлы заголовков/Header files и в контекстном меню папки выберите Добавить/Add -> Новый файл/New Item. Добавьте заголовочный файл с расширением .h и назовите его HeaderL2Lab1.h.
  5.   
    1) Без пользовательских функций и без многофайлового приложения:

  6. Сначала выполним задание без пользовательских функций. То есть, необходимо задать значение для стороны куба и посчитать объем и площадь поверхности куба.
  7. Объявите переменную типа double и назовите ее length. Запросите ввести значение для нее. Не забудьте подключить библиотеку iostream для осуществления ввода и вывода в консоль:
  8. #include <iostream>
    int main() {
    double length;
    	std::cout << "Введите длину стороны куба: ";
    	std::cin >> length;
    	// …
    }
    
  9. Для того, чтобы окно консоли не закрылось сразу после вывода, необходимо добавить паузу (pause). Функция main должна возвратить 0:
  10. //…
       system("pause");
       return 0;
    }
    
  11. Объявите переменные для объема и площади. Выполните вычисление по формулам и присвойте результаты переменным:
  12. 	double volume = length * length * length;
    	double surfaceArea = 6 * length * length;
    
  13. Выведите результаты в консоль:
  14.    std::cout << "Объем: " << volume << std::endl;
       std::cout << "Площадь поверхности: " << surfaceArea << std::endl;
    
  15. Запустите приложение и проверьте вывод. Покажите преподавателю
  16.  
    2) Использование пользовательских функций:

  17. Теперь будем создавать пользовательские функции для расчета объема и площади.
  18. Найдите строки кода с объявлением переменных и расчетами. Закомментируйте их:
  19. //double volume = length * length * length;
    //double surfaceArea = 6 * length * length;
    
  20. Создадим функцию с названием getVolume для вычисления объема. Функция должна возвращать значение типа double (вещественный тип), так как сторона куба тоже вещественного типа. Объявление (сигнатуру) функции необходимо расположить до функции main:
  21. double getVolume(double length);
    double getVolume(double length)
    {
    	return length * length * length;
    }
    int main() {
        //…
    
  22. Добавьте объявление переменной length в функцию main:
  23. int main() {
    	double length;
    
  24. Создайте метод getSurfaceArea для вычисления площади поверхности куба. Метод также должен возвращать значение типа double. Расположите код объявления перед функцией main:
  25. double getSurfaceArea(double length);
    double getSurfaceArea(double length) {
    	return 6 * length * length;
    }
    
  26. Компилятор не извлечет функции, пока мы их не вызовем. Таким образом, необходимо вызвать функции и результат, который они вернут сохранить в переменные. Расположите код вызова в функцию main, присвоив возвращаемое значение соответствующим переменным:
  27. double volume = getVolume(length);
    double surfaceArea = getSurfaceArea(length);
    
  28. После данных срок кода должен следовать вывод значений переменных (см. выше).
  29. Запустите приложение и проверьте вывод. Результаты должны быть такими же, как и при первом выполнении задания. Покажите результаты преподавателю.
  30. 3) Создание многофайлового приложения

  31. В окне Обозреватель решений/Solution Explorer выберите заголовочный файл (HeaderL2Lab1.h). В код файла добавьте объявление методов, предварительно вырезав их из главного файла (в главном файле их не должно остаться):
  32. #pragma once
    // вычисление объема куба
    double getVolume(double length);
    // вычисление площади поверхности 
    double getSurfaceArea(double length);
    
    — Обратите внимание на то, что в заголовочном файле .h мы не добавляем код реализации функции, а только ее объявление (сигнатуру функции). Для того, чтобы увидеть код работы функции (ее реализации) необходимо перейти в .cpp файл.
    — Директива pragma once дает команду компилятору выполнять код только один раз. Даже если много файлов (пользователей) одновременно будут использовать данный класс, объявление методов должно быть единственным.
    — Перед каждой функцией необходимо размещать комментарии с пояснением того, для чего служит эта функция.
  33. В окне Обозреватель решений / Solution Explorer выберите файл реализации (ImpL2Lab1.cpp). В данном файле необходимо разместить тело функций — их реализацию (вырежьте эти фрагменты кода из главного файла MainL2Lab1.cpp и добавьте сюда). И не забудьте подключить заголовочный файл в самой верхней строке:
  34. #include "HeaderL2Lab1.h"
    double getVolume(double length)
    {
    	return length * length * length;
    }
    double getSurfaceArea(double length) {
    	return 6 * length * length;
    }
    
    Данный файл называется файлом реализации, код файла представляет логичку реализации пользовательских функций.
    — Символ решетки (#) означает директиву, в данном случае директиву подключения заголовочного файла.
    — В файле описана реализация двух функций, объявление которых представлено в заголовочном файле с расширением .h.
  35. Теперь можно удалить всё лишнее из главного файла MainL2Lab1.cpp. Итог должен быть следующим:
  36. #include <iostream>
    #include " HeaderL2Lab1.h"
    int main(){
    	double length;
    	std::cout << "please enter the cube side length: ";
    	std::cin >> length;
            //double volume = length * length * length;
    	//double surfaceArea = 6 * length * length;
    	double volume = getVolume(length);
    	double surfaceArea = getSurfaceArea(length);
    	std::cout << "Volume: " << volume << std::endl;
    	std::cout << "Surface area: " << surfaceArea << std::endl;
    	system("pause");
    	return 0;
    }
    
  37. Запустите приложение и проверьте выходные данные. Результаты должны быть такими, какими они и были.
  38. В систему moodle необходимо загрузить три файла: HeaderL2Lab1.h, ImpL2Lab1.cpp, MainL2Lab1.cpp.
Лабораторная работа 2:
Найти максимум из последовательности n вводимых целых чисел.

Примерный вывод:

Введите n
>> 5
Введите 5 элементов
8 10 8 15 1 
Maximum = 15

[Имя проекта: Lesson_2Lab1, имена файлов FindMaxLab2.h, mainLab2.cpp, FindMaxLab2.cpp]

Алгоритм:

  1. Создайте файл исходного кода main.cpp, заголовочный файл FindMaxLab2.h и файл для реализации функций FindMaxLab2.cpp.
  2. В коде mainLab2.cpp и FindMaxLab2.cpp подключите необходимые библиотеки и заголовочный файл:
  3. #include <iostream>
    #include <sstream> //тестирование операций с потоками
    #include "FindMaxLab2.h"
    #include <cstdlib>
     
    using namespace std;
  4. В файле main.cpp добавьте функцию для работы с кириллицей:
  5. ...
    int main()
    {
    	setlocale(LC_ALL, "Russian");
    ...
  6. Перейдите в файл mainLab2.cpp и в функции main() объявите переменные. Затем запросите там количество элементов массива:
  7. ...
    int n;
    cout<<"Введите n"<<endl;
    cin>>n;
    ...
  8. Перейдите в заголовочный файл и объявите функцию для поиска максимального числа с параметром — количество элементов массива:
  9. void FindMax (int n);
  10. Реализацию функции будем осуществлять в файле FindMaxLab2.cpp. Добавьте код поиска максимального элемента из вводимых чисел:
  11. ...
    void FindMax (int n){
    int max, x;
    cout<<"Введите "<<n<<" элементов"<<endl;
    cin>>max;
    for (int i=1;i<n; ++i) {
      cin>>x;
      if (x>max)
        max=x;
     }
    cout<<"Maximum = "<<max<<endl;
    }
    ...
  12. В файле mainLab2.cpp добавьте код вызова функции:
  13. ...
     FindMax(n);
    ...
Лабораторная работа 3:

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

Даны два целых числа A и B (A < B). Вывести в порядке убывания все чётные числа, расположенные между A и B (включая числа A и B), а также количество N этих чисел.

Указания:

  • тип возвращаемого значения функции — void;
  • использовать операцию -= для счётчика цикла;
  • для инициализации счётчика цикла использовать тернарную условную операцию.
  • Примерный вывод:

    введите а и b, a < b
    3  6
    6, 4
    количество четных = 2

    [Имя проекта: Lesson_2Lab3, имена файлов cycleLab3.h, cycleLab3.cpp, MainLab3.cpp]

    Алгоритм:

    1. Создайте файл исходного кода main.cpp, заголовочный файл cycleLab3.h и файл для реализации функций cycleLab3.cpp.
    2. В коде mainLab3.cpp и cycleLab3.h подключите необходимые библиотеки и заголовочный файл:
    3. #include <iostream>
      #include <sstream> //тестирование операций с потоками
      #include "cycleLab3.h"
      #include <cstdlib>
       
      using namespace std;
    4. В файле mainLab3.cpp добавьте функцию для работы с кириллицей:
    5. ...
      int main()
      {
      	setlocale(LC_ALL, "Russian");
      ...
    6. Объявите и запросите две целочисленных переменных:
    7. ...
      int a,b;
      cout << "введите а и b, a < b" << endl;
      cin >>  a >> b;
      ...
    8. Описание функции: перейдите в заголовочный файл и объявите функцию с двумя целочисленными параметрами, возвращающую пустое значение. Назовите ее notOdd:
    9. void notOdd(int a, int b);
    10. Установите курсор на описании и ждите, пока не появится символ лампочки слева. Щелкните по лампочке и выберите пункт "Создать определение в cycle.cpp".
    11. После чего перейдите в код реализации функции и добавьте код, предназначенный для обмена значений переменных a и b в случае, если a > b:
    12. ...
      void notOdd(int a, int b)
      {
      	int k=0;
      	a>b ? swap(a, b)  : a=a ;
       
      ...

      Тернарная операция в C++:

      "условие" ? "выражение 1" : "выражение 2";

      Если условие истинно, то выполняется выражение 1, иначе (условие ложно) выполняется выражение 2.

      Функция swap():
      Функция предназначена для обмена значений своих аргументов.

    13. Далее работаем с циклом. Поскольку в указании к заданию, сказано использовать операцию -= для счётчика цикла, то счетчик должен уменьшаться от большего значения (b) к меньшему (a):
    14. ...
      for (int i = b; i >= a; i -= 1) {
      		if (i % 2 == 0) {
      			cout << i << " ";
      			k++;
      		}
      	}
    15. Поскольку по условию задания функция ничего не возвращает (void), то вывод значения в консоль необходимо реализовать в самой функции:
    16. ...
      cout << "количество четных =" << k << endl;
    17. Переключитесь на вкладку с файлом main.cpp и добавьте в код вызов функции:
    18. ...
      notOdd(a, b);
    19. Запустите программу.
    20. mainLab3.cpp cycleLab3.cpp
      #include <iostream>
      #include <sstream> 
      #include "cycleLab3.h"
       
      using namespace std;
       
      int main()
      {
        setlocale(LC_ALL, "Russian");
        int a,b;
        cout << "введите а и b, a<b" << endl;
        cin >>  a >> b;
        notOdd(a, b);
        system("pause");
        return 0;
      }
      #include "cycleLab3.h"
      #include <iostream>
      #include <sstream> 
       
      using namespace std;
       
      void notOdd(int a, int b)
      {
        int k=0;
        a>b ? swap(a, b)  : a=a ;
        for (int i = b; i >= a; i -= 1) {
      	if (i % 2 == 0) {
      		cout << i << " ";
      	 	k++;
      	}
        }
        cout << "количество четных =" << k << endl;
      }
    Лабораторная работа 4

    1. Создать проект с функцией для вычисления Евклидова расстояния между двумя точками на плоскости.
    2. AB = √(x2-x1)2 + (y2-y1)2

    3. Реализовать тестирующую программу.

    Подробно:
    Создать функцию:

    double distance ( double x1, double y1, double x2, double y2 )

    которая вычисляет Евклидово расстояние между двумя точками на плоскости.
    Параметры функции:
    x1, y1, x2, y2 – вещественные координаты точек.
    Возвращаемое значение:
    расстояние между точками ( x1; y1 ), ( x2; y2 ).

    [Имя проекта: Lesson_2Lab4, имена файлов func1Lab4.h, ImpL2Lab4.cpp, MainLab4.cpp]

    Алгоритм:

    1. Создайте пустой проект (см. урок 1). Главный файл назовите mainLab4.cpp, заголовочный файл - func1Lab4.h
    2. В заголовочный файл добавьте необходимую директиву для работы с математическими функциями:
    3. #include <iostream>
      #include <cmath>
       
      using namespace std;
    4. Далее добавьте описание функции и ее реализацию:
    5. ...
      double distance(double x1, double y1, double x2, double y2);
       
      double distance(double x1, double y1, double x2, double y2)
      {
      	return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
      }
    6. Перейдите на вкладку с главным файлом (mainLab4.cpp). подключите заголовочный файл и создайте функцию main():
    7. #include <iostream>
      #include <cstdlib> // для system("pause");
      #include "func1Lab4.h"
       
      using namespace std;
       
      int main()
      {
          system("pause");
          return 0;
      }
    8. Инициализируйте 4 переменные вещественного типа для координат точек. Запросите их значения:
    9. ...
      int main()
      {
         double x1, y1, x2, y2;
         cout << "введите координаты точек: x1, y1, x2, y2" << endl;
         cin >> x1 >> y1 >> x2 >> y2;
         system("pause");
         return 0;
      }

      Для подключения кириллицы в начале функции main() вызовите функцию:

      ...
      int main()
      {
       setlocale(LC_ALL, "Russian"); 
      ...
    10. Вызовите функцию и выведите в консоль результат:
    11.  
      ...
      cout << distance( x1,  y1,  x2,  y2);

      Реализуйте тест:

    12. Необходимо проверить "неподходящие" координаты точек, т.е. проверка случаев:
    13. единичного отрезка,
    14. отрезка иррациональной длины,
    15. отрезка нулевой длины.
    16. Создайте заголовочный файл test.h (Обозреватель решений -> Заголовочные файлы -> Добавить -> Создать элемент -> Файл заголовка)
    17. Подключите заголовочный файл в код mainLab4.cpp, перед подключением добавьте директиву #define NDEBUG:
    18. ...
      #define NDEBUG
      #include "test.h"
      ...
    19. Добавьте в код заголовочного файла необходимую директиву для работы с функцией проверки (assert):
    20. ...
      #include <cassert>
      ...

      Функция assert анализирует аргумент, переданный ей. Если аргумент-выражение равен нулю (т.е. выражение ложно), сообщение записывается на стандартное устройство вывода ошибок и вызывается функция abort, работа программы прекращается.

    21. Также добавьте в код заголовочного файла необходимую директиву для работы с математическими функциями и другие директивы:
    22. ...
      #include <iostream>
      #include <cmath>
       
      using namespace std;
    23. Создайте описание функции, возвращающей логическое значение. Функция без параметров:
    24. ...
      bool test_distance();
    25. Поставьте курсор на код функции и дождитесь, чтобы слева появилось изображение лампочки. Щелкнув по нему, выберите "Копировать сигнатуру test_distance в буфер обмена".
    26. Спуститесь в коде на следующую строчку и вставьте фрагмент из буфера.
    27. Перед функцией добавьте в код константу для проверки точности сравнения вещественных чисел
    28. ...
      const double precision = 1E-16;
      ...
    29. В код реализации функции проверки добавьте объявление и инициализацию переменных:
    30. ...
      bool test_distance()
      {  
       
          double x1 = 0, y1 = 0;
          double x2 = 1, y2 = 0;
          double result = 1;
      ...
    31. Вставьте код проверки единичного отрезка:
    32. ...
      assert ( abs ( distance (x1,y1,x2,y2) - result) < precision);
      ...
    33. После выполнения проверки в конце функции необходимо возвратить истинное значение:
    34. ...
      return true;
      }
    35. Вся функция проверки:
    36. ...
      bool test_distance()
      {  
          double x1 = 0, y1 = 0;
          double x2 = 1, y2 = 0;
          double result = 1;
       
          // Тест 1 - единичный отрезок
          assert ( abs ( distance (x1,y1,x2,y2) - result) < precision);
       
          return true;
      }
      ...
    37. В файле исходного кода добавьте сначала вызов тестирующей функции, а затем основной функции:
    38. ...
      int main()
      {
          test_distance();
          double x1, y1, x2, y2;
          cout << "введите координаты точек: x1, y1, x2, y2" << endl;
          cin >> x1 >> y1 >> x2 >> y2;
          cout << distance( x1,  y1,  x2,  y2);
      ...

    Рекомендации ко всем заданиям

  • Для выполнения следующих задач вам понадобятся 3 файла: tasks.h, tasks.cpp, main.cpp. Загрузите их и поместите в папку с проектом (Lesson_2Lab1 folder).
  • Когда все задания урока будут выполнены, загрузите эти три файла в moodle.
  • [Solution and Project name: Lesson_2Lab1, files’ names tasks.h, tasks.cpp, main.cpp]

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

    Задание 0:

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

    Указание: В заголовочном файле необходимо создать объявление функции, затем описать реализацию функции в файле tasks.cpp. Вызывать функцию следует в файле main.cpp. Не забудьте использовать комментарии для обозначения назначения функции.

    Примерный вывод:

    Введите два числа
    20 40 
    Сумма 20 + 40 = 60
    

    [Solution and Project name: Lesson_2Lab1, files’ names tasks.h, tasks.cpp, main.cpp]

    Задание 1:

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

    Необязательное указание: Для выполнения задания можно использовать три файла. Загрузите файлы и заполните места, помеченные как // TODO, относящееся к этому заданию.

    Примерный вывод:

    введите значения трех сторон: 3.0  4.1  5.0
    периметр: 12.1
    

    [Solution and Project name: Lesson_2Task1, files’ names task1.h, task1.cpp, mainTask1.cpp]

    Задание 2:

    Выполнить: Вводятся длины трех сторон треугольника. Создайте функцию с идентификатором areaFromSides, которая вычисляет площадь треугольника по длинам его трех сторон, используя формулу Герона:

    где p - полупериметр.

    Необязательное указание 1: Для выполнения задания можно использовать три файла. Загрузите файлы и заполните места, помеченные как // TODO, относящееся к этому заданию.

    Указание 2: Для вычисления квадратного корня необходимо подключить математическую библиотеку и и использовать функцию sqrt():

    #include <cmath>

    Примерный вывод:

    Введите три стороны треугольника: 
    2 4 5
    площадь: 6
    

    [Solution and Project name: Lesson_2Task2, files’ names task2.h, task2.cpp, mainTask2.cpp]

    Задание 3:

    Выполнить: Вводятся координаты вершин треугольника ((x1,y1); (x2,y2); (x3,y3)). Создайте функцию с идентификатором areaFromPads, которая вычисляет площадь треугольника, используя координаты его вершин. Добавьте значение параметра по умолчанию для одной из вершин (0,0).

    Указание 1: Для выполнения задания можно использовать три файла. Загрузите файлы и заполните места, помеченные как // TODO, относящееся к этому заданию.

    Указание 2: Потребуется подключение библиотеки math:

    #include <cmath>

    Примерный вывод:

    введите 6 чисел - координат вершин треугольника:
    4 6 2 9 1 7
    площадь: 3
    

    [Solution and Project name: Lesson_2Task3, files’ names task3.h, task3.cpp, mainTask3.cpp]

    Задание 4:

    Выполнить: Создайте функцию GetPow(), которая принимает два целочисленных аргумента - число и значение степени. Функция возвращает результат возведения числа в степень.

    Указание: Для выполнения задания можно использовать три файла. Загрузите файлы и заполните места, помеченные как // TODO, относящееся к этому заданию.

    Примерный вывод:

    Введите два числа:
    2  4 
    Число 2 в степени 4 = 16
    

    [Solution and Project name: Lesson_2Task4, files’ names task4.h, task4.cpp, mainTask4.cpp]

    Задание 5:

    Выполнить: Определите функцию Mean(X, Y), которая вычисляет среднее арифметическое и среднее геометрическое значение ((√X* Y)) двух положительных десятичных чисел X и Y. X и Y являются входными параметрами. Функция не должна возвращать никаких значений, она должна выводить результаты в окно консоли.

    Указание: Необходимо подключение библиотеки и использование функции (sqrt()):

    #include <cmath>

    Указание: Чтобы распечатать число с плавающей запятой с 3 цифрами после запятой, вам следует использовать следующую функцию (форматный вывод):

    printf("%.3f ",result)

    Примерный вывод:

    введите два числа: 
    
    <<15.0  <<4.0
    среднее арифметическое: 9.500
    среднее геометрическое: 7.746
    

    [Solution and Project name: Lesson_2Task5, files’ names task5.h, task5.cpp, main5.cpp]

    Задания для самостоятельного выполнения:

    Указания: задания следует сохранить в файле с именем задания, и обязательно в коде вставить комментарий с постановкой задачи.

    Proc

    1. Proc16. Описать функцию Sign(X) целого типа, возвращающую для вещественного числа X следующие значения:
    2. −1,    если X < 0;        0,    если X = 0;        1,    если X > 0.
      

      С помощью этой функции найти значение выражения Sign(A) + Sign(B) для данных вещественных чисел A и B.

      Примерный вывод:
      << A = -6.20  B = 0.00
      results:
      sign(A) + sign(B) = -1
      
    3. Proc18. Описать функцию CircleS(R) вещественного типа, находящую площадь круга радиуса R (R — вещественное). С помощью этой функции найти площади трех кругов с данными радиусами. Площадь круга радиуса R вычисляется по формуле S = π·R2. В качестве значения π использовать 3.14.
    4. Примерный вывод:
      << R1=8.06 R2=0.84 R3=4.30 
      results:
      CircleS(R1)=203.99
      CircleS(R2)=2.22
      CircleS(R3)=58.06
      
    5. Proc28. Описать функцию IsPrime(N) логического типа, возвращающую True, если целый параметр N (> 1) является простым числом, и False в противном случае (число, большее 1, называется простым, если оно не имеет положительных делителей, кроме 1 и самого себя). Дан набор из 10 целых чисел, больших 1. С помощью функции IsPrime найти количество простых чисел в данном наборе.
    6. Примерный вывод:
      << 14 89 83 84 38 97 398 15 282 679
      results:
      3
      
    7. Proc34. Описать функцию Fact(N) вещественного типа, вычисляющую значение факториала N! = 1·2·…·N (N > 0 — параметр целого типа; вещественное возвращаемое значение используется для того, чтобы избежать целочисленного переполнения при больших значениях N). С помощью этой функции найти факториалы пяти данных целых чисел.
    8. Примерный вывод:
      << N1=5 N2=9 N3=3 N4=27 N5=15
      results:
      Fact(N1)=1.200000E+002
      Fact(N2)=3.628800E+005
      Fact(N3)=6.000000E+000
      Fact(N4)=1.088887E+028
      Fact(N5)=1.307674E+012
      
    * Задания взяты из задачника М.Э. Абрамяна, ЮФУ, "Programming Taskbook"