Заголовочный файл для работы консолями Содержит себе пространство имён

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/*
* Заголовочный файл для работы с консолями. Содержит в себе пространство имён 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");
}