Как можно изменить данный код?
Задан размер массива действительных чисел и значения его элементов. Считая, что пары элементов представляют собой координаты точек на плоскости, проверить, могут ли все данные точки лежать на одной окружности и, если да, найти ее радиус.
я написал код без использования функций, теперь мне нужно переделать его используя функции. Что в данном коде можно заменить функциями?
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
int main() {
int n;
printf("Enter the number of points: ");
while ((scanf("%d", &n) != 1) || (n <= 0)) {
printf("Invalid input. Please enter a positive integer: ");
while (getchar() != '\n');
}
double eps = 1e-9;
double x[20];
double y[20];
printf("Enter the coordinates of the points:\n");
for (int i = 0; i < n; i++) {
printf("Point %d (x y): ", i + 1);
while (scanf("%lf %lf", &x[i], &y[i]) != 2) {
printf("Invalid input. Please enter coordinates (x y): ");
while (getchar() != '\n');
}
}
if (n == 1) {
// одна точка может лежать на окружности произвольного радиуса
printf("YES, radius: %lf\n", 1.0);
return 0;
}
// делаем так чтоб второй в массиве лежала точка не равная первой
for (int i = 1; i < n; ++i) {
if (x[i] != x[0] || y[i] != x[0]) {
double tmp = x[1];
x[1] = x[i];
x[i] = tmp;
tmp = y[1];
y[1] = y[i];
y[i] = tmp;
}
}
if (x[1] == x[0] && y[1] == y[0]) {
// опять одна точка
printf("YES, radius: %lf\n", 1.0);
return 0;
} else if (n == 2) {
// если две точки, берем середину отрезка
double center_x = (x[1] + x[0]) / 2.0;
double center_y = (y[1] + y[0]) / 2.0;
double r = sqrt((x[0] - center_x) * (x[0] - center_x) + (y[0] - center_y) * (y[0] - center_y));
printf("YES, radius: %lf\n", r);
return 0;
}
// делаем так чтоб третьей в массиве лежала точка не равная первой и второй
for (int i = 2; i < n; ++i) {
if ((x[i] != x[0] || y[i] != x[0]) && (x[i] != x[1] || y[i] != x[1])) {
double tmp = x[2];
x[2] = x[i];
x[i] = tmp;
tmp = y[2];
y[2] = y[i];
y[i] = tmp;
}
}
// если не нашли три уникальных точки
if (!((x[1] != x[0] || y[1] != y[0]) && (x[2] != x[0] || y[2] != y[0]) && (x[2] != x[1] || y[2] != y[1]))) {
double center_x = (x[1] + x[0]) / 2.0;
double center_y = (y[1] + y[0]) / 2.0;
double r = sqrt((x[0] - center_x) * (x[0] - center_x) + (y[0] - center_y) * (y[0] - center_y));
printf("YES, radius: %lf\n", r);
return 0;
}
double A = x[1] - x[0];
double B = y[1] - y[0];
double C = x[2] - x[0];
double D = y[2] - y[0];
double E = (x[1] - x[0]) * (x[0] + x[1]) + (y[1] - y[0]) * (y[0] + y[1]);
double F = (x[2] - x[0]) * (x[0] + x[2]) + (y[2] - y[0]) * (y[0] + y[2]);
double G = 2 * ((x[1] - x[0]) * (y[2] - y[1]) - (y[1] - y[0]) * (x[2] - x[1]));
if (fabs(G) < eps) {
printf("NO\n");
return 0;
}
// координаты центра
double center_x = (D * E - B * F) / G;
double center_y = (A * F - C * E) / G;
double r = sqrt((x[0] - center_x) * (x[0] - center_x) + (y[0] - center_y) * (y[0] - center_y));
int ans = 1;
for (int i = 1; i < n; ++i) {
if (fabs(sqrt((x[i] - center_x) * (x[i] - center_x) + (y[i] - center_y) * (y[i] - center_y)) - r) > eps) {
ans = 0;
break;
}
}
if (ans) {
printf("YES, radius: %lf\n", r);
} else {
printf("NO\n");
}
system("pause");
return 0;
}