/*
* Заголовочный файл для работы с консолями. Содержит в себе пространство имён std
* которое, в свою очередь, содержит такие классы, как:
* std::cin - ввод в переменную с клавиатуры.
* std::cout - вывод чего-либо на экран.
* std::endl - символ переноса строки, эквивалент \n. И т.д.
*/
#include <iostream>
/*
* Использование пространства имён std.
* Позволяет нам писать cin, cout, endl... без указания std:: в начале
*/
using namespace std;
/*
* Структура - это объединение переменных в объект с определенным именем. В данном случае - Point. В дальнейшем, используется как тип данных.
* Point.x - содержит информацию про x координату, которая хранится в типе float (значение с плавающей точкой, например 0.0001)
* Point.y - содержит информацию про y координату, которая хранится в типе float (значение с плавающей точкой, например 0.0001)
*/
struct Point {
float x;
float y;
};
/*
* Функция математического модуля (abs), возвращает тип данных float (значение с плавающей точкой)
* Аргументом функции является переменная value типа данных float.
* Abs(-10) // return 10
* Abs(-0.004) // return 0.004
* Abs(12) // return 12
*/
float Abs(float value) {
if (value < 0) return -value; // если значение отрицательное, делает его положительным
return value; // возвращает значение по модулю
}
/*
* Функция FindClosestPoint - поиск ближайщей точки. Возвращает тип данных Point.
* У функции 3 аргумента
* 1 - Указатель на массив точек, содержащихся в структуре Point
* 2 - Переменная целочисленного типа, содержащая информацию про размерность массива точек
* 3 - Переменная значения с плавающей точкой (outputArrayPtr[i].x)
*/
Point FindClosestPoint(Point *searchArray, int searchArrayLength, float value) {
int closestIndex = 0; // Создание переменной, которая будет хранить в себе индекс ближайшей точки со стандартным значением 0
float closestDistance = Abs(value - searchArray[0].x); // Создание переменной (ближайшее расстояние - дословный перевод), и присваивание значение модуля расстояния между переданной координатой и введенной пользователем в массив с индексом 0
for (int i = 1; i < searchArrayLength; i++) { // цикл от 1 до searchArrayLength (переданного как арумент функции)
float tmpDistanse = Abs(value - searchArray[i].x); // Создание временной переменной и присваивание ей значение модуля расстояния между переданной координатой и введенной пользователем в массив с индексом i
if (tmpDistanse < closestDistance) { // условие, если временное значение расстояние меньше ближайшего расстояние, тогда выполнится
closestDistance = tmpDistanse; // в таком случае, присваием ближайшему расстоянию постоянное
closestIndex = i; // и считаем, что ближайшее значение из массива, именно с этим индексом i
}
// продолжаем цикл с i = i + 1; (i++), до тех пор, пока не будет перебран весь массив
}
return searchArray[closestIndex]; // возвращаем значение массив с индексом closestIndex.
}
int main() { // точка входа программы
int inputArrayLength; // выделение памяти для целочисленной переменной, которая будет хранить размерность массива
cout << "Array length: "; // вывод в консоль
cin >> inputArrayLength; // ввод пользователем с клавиатуры в эту переменную
Point *inputArrayPtr = new Point[inputArrayLength]; // создание массива inputArrayPtr структуры Point с размерностью inputArrayLength
cout << "Enter point(x,y) " << inputArrayLength << " times:" << endl; // вывод в консоль
for (int i = 0; i < inputArrayLength; i++) { // цикл от 0 до inputArrayLength (переданного пользователем с клаиватуры)
cin >> inputArrayPtr[i].x; // ввод пользователем с клавиатуры в массив структур с индексом i переменную x
cin >> inputArrayPtr[i].y; // ввод пользователем с клаиватуры в массив структур с индексом i переменную y
}
float minX = inputArrayPtr[0].x; // создание переменной с плавающей точкой, которая будет хранить минимальное значение x. И присваивание ей первого (нулевого) значения координаты x из массива
float maxX = inputArrayPtr[0].x; // создание переменной с плавающей точкой, которая будет хранить минимальное значение x. И присваивание ей первого (нулевого) значения координаты x из массива
for (int i = 1; i < inputArrayLength; i++) { // цикл от 1 до inputArrayLength (переданного пользователем с клаиватуры)
if (inputArrayPtr[i].x > maxX) { // если текущий x больше заданного в начале
maxX = inputArrayPtr[i].x; // то этот x становится максимальным
} else if (inputArrayPtr[i].x < minX) { // в противном случае, если x меньше минимального, заданного в начале
minX = inputArrayPtr[i].x; // то этот x становится минимальным
}
// перебор всего массива с целью уточнения минимальных и максимальных значений
}
float epselon; // переменная для хранения значения точности с плавающей точкой
cout << "Enter epselon value: "; // вывод в консоль
cin >> epselon; // ввод пользователем с клавиатуры
int outputArrayLength = static_cast<int>((maxX - minX) / epselon) + 1; // создание целочисленной переменной, которая хранит в себе информацию про размерность выходного массива
// А также присваивание ей значения ((maxX - minX) / epselon) + 1, но тут подробнее
// ((maxX - minX) / epselon) + 1 компилятор это видит так: (float - float) / float + int, это исходя из типов данных переменных. Т.к. мы создали переменную int (целочисленную), то
// Для устранения возможных ошибок нужно привести (float - float) / float + int к int, для этого используется static_cast<int>
Point *outputArrayPtr = new Point[outputArrayLength]; // создание массива outputArrayPtr структуры Point с размерностью outputArrayLength
for (int i = 0; i < outputArrayLength; i++) { // цикл от 0 до outputArrayLength
outputArrayPtr[i].x = minX + epselon * i; // присваивание в массив структур с индексом i для координаты x рассчитанное значение minX + epselon * i
outputArrayPtr[i].y = FindClosestPoint(inputArrayPtr, inputArrayLength, outputArrayPtr[i].x).y; // присваивание в массив структур с индексом i для координаты y рассчитанное значение, возвращаемое функцией FindClosestPoint
}
cout << "Extended Array:" << endl; // вывод в консоль
for (int i = 0; i < outputArrayLength; i++) { // цикл от 0 до outputArrayLength
cout << "(" << outputArrayPtr[i].x << ";" << outputArrayPtr[i].y << ")" << endl; // вывод в консоль
}
cout << endl; // перенос строки
/*
* Удаление из памяти массивов
*/
delete[] inputArrayPtr;
delete[] outputArrayPtr;
/*
* Установка консоли на паузу, чтобы скомпилированное приложение сразу после исполнения не закрывалось
*/
system("pause");
}