C++ пользовательские функции
- Создать проект с функцией для вычисления Евклидова расстояния между двумя точками на плоскости.
- Реализовать тестирующую программу.
AB = √(x2-x1)2 + (y2-y1)2
Подробно:
Создать функцию:
double distance ( double x1, double y1, double x2, double y2 ) |
которая вычисляет Евклидово расстояние между двумя точками на плоскости.
Параметры функции:
x1, y1, x2, y2 – вещественные координаты точек.
Возвращаемое значение:
расстояние между точками ( x1; y1 ), ( x2; y2 )
.
Решение:
- Создайте пустой проект (см. урок 1). Главный файл назовите main.cpp, заголовочный файл — func1.h
- В заголовочный файл добавьте необходимую директиву для работы с математическими функциями:
- Далее добавьте описание функции и ее реализацию:
- Перейдите на вкладку с главным файлом (main.cpp). подключите заголовочный файл и создайте функцию main():
- Инициализируйте 4 переменные вещественного типа для координат точек. Запросите их значения:
- Вызовите функцию и выведите в консоль результат:
- Необходимо проверить «неподходящие» координаты точек, т.е. проверка случаев:
- единичного отрезка,
- отрезка иррациональной длины,
- отрезка нулевой длины.
- Создайте заголовочный файл test.h (Обозреватель решений -> Заголовочные файлы -> Добавить -> Создать элемент -> Файл заголовка)
- Подключите заголовочный файл в код main.cpp, перед подключением добавьте директиву
#define NDEBUG
: - Добавьте в код заголовочного файла необходимую директиву для работы с функцией проверки (assert):
- Также добавьте в код заголовочного файла необходимую директиву для работы с математическими функциями и другие директивы:
- Создайте описание функции, возвращающей логическое значение. Функция без параметров:
- Поставьте курсор на код функции и дождитесь, чтобы слева появилось изображение лампочки. Щелкнув по нему, выберите «Копировать сигнатуру test_distance в буфер обмена».
- Спуститесь в коде на следующую строчку и вставьте фрагмент из буфера.
- Перед функцией добавьте в код константу для проверки точности сравнения вещественных чисел
- В код реализации функции проверки добавьте объявление и инициализацию переменных:
- Вставьте код проверки единичного отрезка:
- После выполнения проверки в конце функции необходимо возвратить истинное значение:
- Вся функция проверки:
- В файле исходного кода добавьте сначала вызов тестирующей функции, а затем основной функции:
#include <iostream> #include <cmath> using namespace std; |
... 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)); } |
#include <iostream> #include <cstdlib> // для system("pause"); #include "func1.h" using namespace std; int main() { system("pause"); return 0; } |
... 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"); ... |
... cout << distance( x1, y1, x2, y2); |
Реализуйте тест:
... #define NDEBUG #include "test.h" ... |
...
#include <cassert>
... |
Функция
assert
анализирует аргумент, переданный ей. Если аргумент-выражение равен нулю (т.е. выражение ложно), сообщение записывается на стандартное устройство вывода ошибок и вызывается функцияabort
, работа программы прекращается.
... #include <iostream> #include <cmath> using namespace std; |
... bool test_distance(); |
... const double precision = 1E-16; ... |
... bool test_distance() { double x1 = 0, y1 = 0; double x2 = 1, y2 = 0; double result = 1; ... |
... assert ( abs ( distance (x1,y1,x2,y2) - result) < precision); ... |
... return true; } |
... 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; } ... |
... 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); ... |
Создать проект с функцией, вычисляющей квадрат числа.
Подробно:
Создать функцию:
double sqr ( double x ); |
которая вычисляет квадрат числа.
Параметры функции:
x – значения вычисления квадрата числа.
Возвращаемое значение: вещественное число — квадрат x.
Создать функцию для вычисления площади треугольника, заданного тремя сторонами.
S = √r * (r - a)*(r - b)*(r - c)
где:
r — полупериметр
a, b, c — стороны
Подробно:
double square ( double a, double b, double c ); |
a, b, c – вещественные стороны треугольника
площадь треугольника
Создать функцию для вычисления площади треугольника, заданного тремя точками.
Указания:
S = √r * (r - a)*(r - b)*(r - c)
где:
r — полупериметр
a, b, c — стороны
Подробно:
double square ( double xa, double ya, double xb, double yb, double xc, double yc ); |
xa, ya, xb, yb, xc, yc – вещественные координаты точек A ( xa, ya ), B ( xb, yb ), C ( xc, yc ).
площадь треугольника ABC.
Выполнение:
- Из Лабораторной работы №1 текущего урока имеем описание функции вычисления расстояния между двумя точками:
- Добавим описание новой функции в заголовочный файл ниже реализации функции distance():
- Поскольку координаты точек необходимо запрашивать (вводить с клавиатуры), то перейдем в главный файл (main.cpp), и добавим в код описание необходимых переменных и их ввод с клавиатуры:
- Поскольку для поиска площади треугольника используется формула, в которой явно задаются стороны треугольника, то необходимо получить значения этих сторон, используя реализованную раннее функцию distance() для поиска расстояния между точками. Инициализируем для значения сторон переменные ab, bc и ac. Добавим использование функции в код реализации функции square():
- Вычислим полупериметр и площадь. Функция должна возвращать результирующее значение площади:
- Перейдем в файл main.cpp и вызовем функцию:
... 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)); } |
... double square(double xa, double ya, double xb, double yb, double xc, double yc); |
... double x1, x2, y1, y2, xa, ya, xb, yb, xc, yc; cin >> xa >> ya >> xb >> yb >> xc >> yc; ... |
... double square(double xa, double ya, double xb, double yb, double xc, double yc) { double S, ab, bc, ac, r; ab = distance(xa, ya, xb, yb); bc = distance(xb, yb, xc, yc); ac = distance(xa, ya, xc, yc); } ... |
... r = (ab + bc + ac) / 2; S = sqrt(r*(r - ab)*(r - bc)*(r - ac)); return S; ... |
... cout << square(xa, ya, xb, yb, xc, yc) << endl; ... |